Как определить разницу между SQL зависимостями сервера от временной таблицы с псевдонимом от постоянной таблицы - PullRequest
1 голос
/ 13 февраля 2020

Я работаю на SQL Server 2017.

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

Я столкнулся с проблемой, связанной с псевдонимами временных таблиц. Я не хочу сообщать о ссылках на временные таблицы, которые не существуют (поскольку они будут создаваться только при запуске время в любом случае) Кажется, что в некоторых случаях в sys.sql_expression_dependencies ссылка на постоянную таблицу, которая не существует, и ссылка на временную таблицу с псевдонимом выглядят одинаково.

Я ожидаю, что, возможно, для временного table имя_референционной_базы_данных будет temp_db или что есть какой-то другой способ определить, что зависимость находится во временной таблице, так что я могу исключить ее из моих результатов, показывающих неверные ссылки.

Следующий код создаст проблему что я вижу с де информация о нерешенности Он создает две хранимые процедуры, одна обновляет псевдоним несуществующей постоянной таблицы, а другая создает временную таблицу и обновляет ее с использованием псевдонима. Sys.sql_expression_dependencies показывает зависимости от обоих псевдонимов, без значения referenced_id (что указывает на то, что он ссылается на несуществующий объект), и, кажется, нет никакого способа сказать, глядя на зависимость, какой из них может быть временная таблица.

CREATE OR ALTER PROCEDURE my_procedure
AS
BEGIN
    UPDATE a_table
    SET a_table.some_column = 0
    FROM dbo.some_table a_table
    WHERE 1 = 0;
END;
GO

CREATE OR ALTER PROCEDURE my_temp_procedure
AS
BEGIN
    CREATE TABLE #temp_table
    (
        some_column INT
    );
    UPDATE a_temp_table
    SET a_temp_table.some_column = 0
    FROM #temp_table a_temp_table
    WHERE 1 = 0;
END;
GO

SELECT *
FROM sys.sql_expression_dependencies;
...