【发布时间】:2017-06-05 17:29:28
【问题描述】:
目前我正在使用 SQL Server 触发器进行审计跟踪,以识别表上的插入、更新和删除。
表可以在数据库中动态创建,因此当发生这种情况时,我需要动态创建触发器。
所以此时我调用一个存储过程并传入表名。
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 拆分为 3 个触发器,即插入、更新和删除以解决此问题,但是我更愿意保留 1 个触发器来处理全部)
任何建议都将不胜感激,谢谢
【问题讨论】:
-
你怎么说字符串被截断了?你确定
SET @STR_Trig = @STR_Trig +..这就是你的执行方式。 -
我已经看到 martin smith stackoverflow.com/questions/12639948/… 在此处完成的方法,向下滚动到如何解决您遇到的问题。
-
所以
SET @STR_Trig = @STR_Trig +..使用这种方法字符串永远不会被截断。不要使用Print语句来检查动态字符串,它会截断并显示字符串。在您的情况下,它最多只能显示4,000个字符 -
你是说它应该被截断吗?我没有使用 print 来检查动态 SQL
-
没有。我说你的方法很好。你怎么说这个 exec 没有完全阅读语句并切断程序。 ?执行动态查询时是否遇到任何错误?
标签: sql sql-server dynamic triggers dynamic-sql