SQL Server: использование dm_exec_describe_first_result_set с табличной переменной запускает триггер CREATE_TABLE - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь использовать sys.dm_exec_describe_first_result_set с запросом, содержащим переменную таблицы, для описания столбцов запроса.Но объявление переменной таблицы в этом запросе вызывает активацию триггера DATABASE для события AFTER CREATE_TABLE, которое содержит вызов хранимой процедуры с временной таблицей.

Обычное объявление переменной таблицы, которую этот триггер не активирует.Некоторые идеи, почему триггер активирован для табличной переменной?

CREATE PROCEDURE SP1 AS
BEGIN 
CREATE TABLE #A(b int)
INSERT INTO #A(b) VALUES(1)
DROP TABLE #A
END
GO

CREATE TRIGGER [CreateObjectDatabaseTrigger]
ON DATABASE 
AFTER 
    CREATE_TABLE
AS 
BEGIN
EXEC SP1
END
GO
ENABLE TRIGGER [CreateObjectDatabaseTrigger] ON DATABASE

DECLARE @SqlQuery NVARCHAR(MAX) = N'DECLARE @A TABLE (b int) SELECT * FROM @A'

SELECT error_message, name 
FROM 
sys.dm_exec_describe_first_result_set
(@SqlQuery, NULL, 0)

Результат с включенным триггером: не удалось определить метаданные, поскольку оператор 'INSERT INTO #A (b) VALUES (1)' в процедуре 'SP1'использует временную таблицу.

1 Ответ

0 голосов
/ 19 сентября 2019

Триггеры не должны возвращать наборы результатов клиенту.Это считается устаревшим поведением и будет удалено из будущей версии SQL Server в соответствии с документацией .

. В этом случае используйте PRINT для возврата информационного сообщения вместо набора результатов.,Побочным эффектом этой практики является то, что sys.dm_exec_describe_first_result_set вернет нужные метаданные:

CREATE TRIGGER [CreateObjectDatabaseTrigger]
ON DATABASE 
AFTER 
    CREATE_TABLE
AS 
BEGIN
PRINT 'Trigger activated';
END
GO
ENABLE TRIGGER [CreateObjectDatabaseTrigger] ON DATABASE;

DECLARE @SqlQuery NVARCHAR(MAX) = N'DECLARE @A TABLE (b int) SELECT * FROM @A';

SELECT error_message, name 
FROM sys.dm_exec_describe_first_result_set
(@SqlQuery, NULL, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...