#sql #sql-server
#sql #sql-server
Вопрос:
Мне нужно добавить поле в таблицу. Это поле необходимо будет заполнить разными значениями.
Я уже знаю основные хранимые процедуры, которые вставляют новые записи в эту таблицу, и эти хранимые процедуры необходимо будет изменить. На всякий случай, есть ли способ получить полный список хранимых процедур, которые вставляют записи в рассматриваемую таблицу?
sys.dm_sql_referencing_entities предоставляет мне список хранимых процедур, которые зависят от этой таблицы, но мне нужны только хранимые процедуры, которые вставляют записи, а не те, которые просто запрашивают ее.
Спасибо.
Ответ №1:
Вы могли бы попытаться просмотреть код самой хранимой процедуры, но, вероятно, совпадение не будет 100-процентным. Что-то в строках:
SELECT OBJECT_NAME(S.object_id) StoredProcedure
FROM sys.sql_modules S
JOIN sys.procedures P
ON S.object_id = P.object_id
WHERE Definition LIKE '%INSERT INTO myTable%'
OR Definition LIKE '%INSERT myTable%'
Комментарии:
1. Хороший ответ, но неполный. Это не работает, когда используются префиксы схемы, не выполняется поиск целых слов и, более того, игнорируются квадратные скобки.
Ответ №2:
Я не знаю, есть ли у нас способ получить точное соответствие на основе инструкции DML (insert vs. delete), но вы могли бы попробовать сравнить набор данных ссылающихся объектов со строковым соответствием, например:
declare @ObjectName nvarchar(517) = 'dbo.Person';
declare @match table (sName nvarchar(500), oName nvarchar(500))
insert into @Match (sName, oName)
select distinct
object_schema_name([object_id], db_id()),
object_name([object_id], db_id())
from sys.sql_modules
where [definition] like '%' @ObjectName '%' and
( -- match "insert into dbo.Person" or "insert into Person"
[definition] like '%insert into ' @ObjectName '%' or
[definition] like '%insert into ' replace(@ObjectName, 'dbo.', '') '%' or
-- match "insert dbo.Person" or "insert Person"
[definition] like '%insert ' @ObjectName '%' or
[definition] like '%insert ' replace(@ObjectName, 'dbo.', '') '%'
)
select *
from sys.dm_sql_referencing_entities(@ObjectName, 'OBJECT') re
left
join @Match d on
re.referencing_schema_name = d.sName and
re.referencing_entity_name = d.oName
where d.sName is not null -- comment this line to compare all possible ref entities
return
Ответ №3:
Одна низкотехнологичная тактика, которая работает лучше, чем вы могли подумать . . .
Преобразуйте схему в текст. Затем в командной строке . . .
$ grep -i 'insert into your-table-name' dumped-schema-file
Я не знаю утилиту Windows, которая выполняет поиск текстовой строки.
Это, вероятно, приведет к обнаружению большинства вставок. Вы также можете попробовать
$ grep -i -B2 'your-table-name' dumped-schema-file
Это выведет каждую строку, соответствующую ‘your-table-name’, вместе с тремя строками непосредственно перед ней, чтобы вы могли искать такие вещи, как
insert into
your-table-name
Ответ №4:
НЕСКОЛЬКО лет назад журнал SQL Server опубликовал статью под названием «Поиск хранимых процедур по строкам«, в которой была представлена хранимая процедура, которая
принимает входную строку и выполняет поиск в системных таблицах syscomments, sysobjects и syscolumns в локальной базе данных для любой ссылки на эту строку. Набор выходных результатов показывает все таблицы, процедуры, представления и другие элементы, которые содержат указанную входную строку.
По сути, это grep для вашей базы данных. Это было очень полезно.