【问题标题】:Create SQL Server trigger - dynamic SQL too long创建 SQL Server 触发器 - 动态 SQL 太长
【发布时间】: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


【解决方案1】:

已解决此问题:分解查询,请参阅下面的解决方案

DECLARE @sql1 NVARCHAR(4000) = '',
        @sql2 NVARCHAR(4000) = '',
        @sql3 NVARCHAR(MAX)

    SET @sql1  +=  '
    CREATE TRIGGER [dbo].[' + @STR_TableName + '_Audit] ON [dbo].[' + @STR_TableName + ']
    WITH EXECUTE AS CALLER AFTER
    INSERT, UPDATE, DELETE AS
    BEGIN
    BEGIN TRY
    --sql query
    '
     SET @sql2 = '
    --more sql query
    END'

SET @sql3 = CAST(@sql1 AS nvarchar(MAX)) + CAST (@sql2 AS nvarchar(MAX)) 
EXEC sp_executesql @sql3

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 2014-05-04
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多