Как найти все хранимые процедуры, которые удаляют строки из определенной таблицы - PullRequest
0 голосов
/ 01 июня 2011

Если есть способ сделать это без регулярных выражений, это здорово.Если нет, то вот что у меня получилось:

Я написал простую пользовательскую функцию CLR (которая, как вы можете видеть, я назвал CLR_RegExMatch), которая выполняет сопоставление регулярных выраженийна предоставленной строке.Я использую его для поиска шаблонов внутри хранимых процедур, триггеров, функций и т. Д.

Вот пример его использования - поиск вставок в таблицу с именем ExampleTable:

SELECT O.name, O.type_desc
FROM
    SYS.OBJECTS O
    INNER JOIN SYS.SQL_MODULES M ON 
        M.object_id = O.object_id
        AND dbo.CLR_RegExMatch('INSERT\s+(INTO\s+)?ExampleTable\b', M.definition) = 1

Проблема Iу меня есть то, что я не могу придумать шаблон регулярных выражений, чтобы найти все процедуры, которые удаляют строки из данной таблицы.Очевидно, я мог бы заменить следующее на последнюю строку в предыдущем примере:

        AND dbo.CLR_RegExMatch('DELETE\s+(FROM\s+)?ExampleTable\b', M.definition) = 1

, и это помогает мне в этом.Однако это не поднимет следующее:

DELETE T1
FROM
    ExampleTable T1
    INNER JOIN AnotherTable T2 ON T2.ParentId = T1.Id

Итак, я ищу либо шаблон регулярного выражения, который будет соответствовать удаляемым, как указано выше, либо, альтернативно, другой способ добиться этого.NB. Причина, по которой я запрашиваю столбец definition в SYS.SQL_MODULES вместо столбца ROUTINE_DEFINITION в INFORMATION_SCHEMA.ROUTINES, заключается в том, что последний содержит только первые 4000 символов стандартного определения, тогда как первый содержит полный текст.

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Посмотрите на FREE Red-Gate инструмент под названием SQL Search , который делает это - он ищет во всей вашей базе данных любые типы строк.

enter image description here

enter image description here

Это отличный инструмент, необходимый для любого администратора БД или разработчика базы данных - я уже говорил, что это абсолютно БЕСПЛАТНО для использования влюбой вид использования ??

Он не скажет вам, какие процедуры на самом деле удаляют что-то из таблицы - но он очень легко и приятно найдет все процедуры, которые ссылаются на эту таблицу каким-либо образом.Посмотрите на них и найдите те, которые вам нужны!

0 голосов
/ 02 июня 2011

Если может помочь, я использую эту хранимую процедуру, которая может найти строку во всех модулях базы данных / s

использование:

exec find_text 'text to search', 'db_name' 
-- if no db_name specified search in all DB

Код ниже:

CREATE PROCEDURE [dbo].[find_text]  
@text varchar(250),  
@dbname varchar(64) = null  
AS BEGIN  
SET NOCOUNT ON;  

if @dbname is null  
 begin  
  -- enumerate all databases.  
  DECLARE #db CURSOR FOR Select Name from master..sysdatabases  
  declare @c_dbname varchar(64)  

  OPEN #db FETCH #db INTO @c_dbname  
  while @@FETCH_STATUS <> -1   
  begin  
    execute find_text @text, @c_dbname  
    FETCH #db INTO @c_dbname  
  end    
  CLOSE #db DEALLOCATE #db  
 end 
else  
 begin 
    declare @sql varchar(250)  
    --create the find like command  
    select @sql = 'select ''' + @dbname + ''' as db, o.name,m.definition '  
    select @sql = @sql + ' from '+@dbname+'.sys.sql_modules m '  
    select @sql = @sql + ' inner join '+@dbname+'..sysobjects o on m.object_id=o.id'  
    select @sql = @sql + ' where [definition] like ''%'+@text+'%'''
    select @sql = @sql + ' order by o.name'  

    execute (@sql)  
 end   
END  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...