Как найти все объекты БД, содержащие строку в Sybase - PullRequest
0 голосов
/ 13 мая 2009

Иногда мне нужно найти несколько строк внутри БД, обычно это просто имя хоста или IP-адрес.

Есть ли скрипт, который находит строку во всех объектах Sybase db (или, по крайней мере, во всех таблицах), к которым у меня есть доступ.

Ответы [ 2 ]

1 голос
/ 29 мая 2009

Запрос по системным объектам + курсор + ВЫПОЛНИТЬ работает. своего рода Сорта.

sp__map_object 'SELECT * FROM %O where name like "bar%"', 'foo_%'

В коде так много ошибок / проблем / беспокойств, что я не хочу его публиковать, но у меня есть определенное сочувствие к собрату Sybase.

У Роба Вершура есть куча хороших хранимых процедур на http://www.sypron.nl/new_ssp_dwn.html

pjjH

289:1> ? sp__map_object
(1 row affected)
/*
 *
 * BE CAREFUL WHEN RUNNING THIS!!!
 *
 * See list of dire warnings in sp__map_db.sql
 *
 * Run the given command on the stored procedure for each object
 * matching @object_pat and replacing the first instance of %O with that
 * name.
 *
 * Just do this in Perl. Or refactor the sql so that it works for some sane
 * cross-product of users,logins, databases and objects.
 *
 * Paul Harrington 
 *
 */
CREATE PROCEDURE sp__map_object
  @sql             VARCHAR(255) = 'sp__help',
  @objpat          VARCHAR(32)  = NULL,
  @type            VARCHAR(2)   = 'U',
  @do_it           INT          = 1,
  @verbose         INT          = 0
AS
BEGIN
  SET NOCOUNT ON
  DECLARE object_cursor CURSOR
  FOR
    SELECT DISTINCT name
    FROM   sysobjects
    WHERE  name LIKE @objpat
      AND  type LIKE @type
  DECLARE @munged_sql VARCHAR(255)

  DECLARE @object_name varchar(64)
  OPEN object_cursor
  FETCH object_cursor INTO @object_name
  WHILE @@sqlstatus = 0
  BEGIN
    IF CHARINDEX('%O', @sql)  0
    SELECT @munged_sql = SUBSTRING(@sql, 1, CHARINDEX('%O', @sql) - 1) +
                  @object_name +
                  SUBSTRING(@sql, CHARINDEX('%O', @sql) + 2, 255)
    ELSE
      SELECT @munged_sql = @sql

    IF (@do_it = 0 OR @verbose = 1)
    BEGIN
       DECLARE @msg varchar(255)
       SELECT @msg = @munged_sql
       SELECT @msg
    END

    IF @do_it = 1
        EXECUTE(@munged_sql)
    FETCH object_cursor INTO @object_name
  END
  CLOSE object_cursor
  DEALLOCATE CURSOR object_cursor
  SET NOCOUNT OFF
END

go
0 голосов
/ 13 мая 2009

Ни то, что я знаю изначально. Возможно, вы могли бы запустить процедуру, которая запрашивает системные таблицы, чтобы получить список объектов, а затем сделать так, чтобы курсор прошел через них и запросил эти объекты по заданным критериям поиска.

...