Каковы последствия того, что представление каталога sys.sql_dependencies не обновляется - PullRequest
2 голосов
/ 15 сентября 2010

Если у меня есть две тривиальные хранимые процедуры, созданные так:

create procedure root as
select 1 
go

create procedure dependant as
exec root
go

(где dependant зависит от root).

Когда я проверяю таблицу sys.sql_dependencies для второй процедуры, я вижу запись (как и следовало ожидать).

Если, однако, я сначала добавлю процедуру dependant, я получу следующее предупреждение.

Невозможно добавить строки в sys.sql_dependencies для хранимых процедура, потому что это зависит от отсутствует таблица «корень». Хранится процедура все равно будет создана; Однако это не может быть успешно выполняется, пока таблица не существует.

И, достаточно верно, exec dependant; не удается.

Итак, когда я добавляю в root процедуру, exec dependant; работает, однако, никакая зависимость не записывается на sys.sql_dependencies.

У меня два вопроса:

  1. Каковы последствия этого?
  2. Кажется, все вполне приемлемо, так почему же SQL не добавляет эту запись задним числом?

Помощь, как всегда высоко ценится.

1 Ответ

4 голосов
/ 15 сентября 2010

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

Вы можете обновить все зависимости, написав скрипт для запуска sp_refreshsqlmodule на всех объектах базы данных.

В SQL Server 2008 такие неразрешенные зависимости все еще хранятся и доступны через sys.sql_expression_dependencies, что означает, что информация о зависимостях более надежна.

Поведение SQL Server 2008 выглядит следующим образом.

После создания зависимого, но до того, как существует корень

SELECT     OBJECT_NAME(referencing_id) AS Name, 
           referencing_class_desc, 
           referenced_class_desc, 
           referenced_entity_name, 
           referenced_id, 
           is_caller_dependent, 
           is_ambiguous
FROM         sys.sql_expression_dependencies

Возвращает

Name       referenced_entity_name    referenced_id is_caller_dependent is_ambiguous
---------- ------------------------- ------------- ------------------- ------------
dependant  root                      NULL          1                   0

В вашем примере кода это также результаты запроса после создания root, так как ссылка на него не соответствует схеме и, следовательно, зависит от вызывающей стороны. Однако, если определение вашей dependant процедуры изменено на

create procedure dependant as
exec dbo.root

Затем после создания dbo.root возвращается следующее

Name       referenced_entity_name    referenced_id is_caller_dependent is_ambiguous
---------- ------------------------- ------------- ------------------- ------------
dependant  root                      2121058592    0                   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...