В настоящее время я работаю над цепочкой аудита с использованием триггеров SQL Server для идентификации вставок, обновлений и удалений по таблицам.Создание SQL Server триггер - динамический SQL слишком длинный
Таблицы могут быть созданы динамически в базе данных, поэтому, когда это произойдет, мне нужно создать триггер динамически.
Поэтому в этот момент я вызываю хранимую процедуру и передаю имя таблицы.
CREATE PROCEDURE [dbo].[AUDIT_CreateTableTrigger]
@STR_TableName NVARCHAR(MAX)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @STR_Trig NVARCHAR(MAX) = ''
SET @STR_Trig = @STR_Trig + '
CREATE TRIGGER [dbo].[' + @STR_TableName + '_Audit] ON [dbo].[' + @STR_TableName + ']
WITH EXECUTE AS CALLER AFTER
INSERT, UPDATE, DELETE AS
BEGIN
-- do the insert stuff
-- update
-- + delete
END'
EXEC (@STR_Trig) -- then execute the sql
Моя проблема в том, что я замечаю, что exec не полностью читает заявление и отключает процедуру.
Мне нужен способ выполнения длинного фрагмента кода SQL (у меня есть одно решение, это включает в себя разделение динамического SQL на три триггера, то есть вставку, обновление и удаление, чтобы обойти это, однако предпочли бы сохранить 1 триггер обрабатывать все)
Любые предложения будут оценены, спасибо
Как вы говорите, строка обрезается? Вы уверены, что 'SET @STR_Trig = @STR_Trig + ..' это то, как вы выполняете. –
Я видел, что этот метод, на который здесь ответил мартин-кузнец http://stackoverflow.com/questions/12639948/sql-nvarchar-and-varchar-limits, прокручивается вниз до «Как решить проблему, с которой вы столкнулись». –
Так что 'SET @STR_Trig = @STR_Trig + ..' с этой строкой подхода никогда не усекается. Не используйте инструкцию 'Print' для проверки динамической строки, которая усекает отображение строки. В вашем случае это покажет только до «4000 символов» –