代码之家  ›  专栏  ›  技术社区  ›  BeemerGuy

SQL Server:我可以在更改存储过程时设置触发器吗?

  •  0
  • BeemerGuy  · 技术社区  · 16 年前

    每次更改或创建存储过程时,我都希望在触发器中捕获该过程,以便在之后执行一些操作。

    在SQL Server 2008中可以这样做吗?

    谢谢您。 ——Beemer

    2 回复  |  直到 16 年前
        1
  •  2
  •   Remus Rusanu    16 年前

    如果您想对alter/create/drop上下文(即在同一个事务中)执行一些操作,甚至阻止alter/create/drop,那么您应该查看 DDL Triggers .

    如果你想做点什么 之后 在一个单独的事务中,alter/create/drop可以在不减慢原始DDL的情况下自由地执行一些冗长的处理,然后您应该研究 Event Notifications .

    请注意,事件通知实际上可以远程传递,因此您可以将整个公司组中的所有DDL事件捕获到一个中央存储库中。

        2
  •  3
  •   Dan S    16 年前
    CREATE TRIGGER tddl_storedprocevents ON DATABASE
    FOR
    CREATE_PROCEDURE,ALTER_PROCEDURE,DROP_PROCEDURE
    AS
    INSERT INTO AUDIT_TABLE(EventType, SQLCommand, etc)
      SELECT EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(512)')
           , EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
                 , etc
    
    /*
    EVENTDATA()
    
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(512)')
         , EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime')
         , EVENTDATA().value('(/EVENT_INSTANCE/SPID)[1]', 'nvarchar(4)')
         , EVENTDATA().value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(512)')
         , EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(512)')
         , EVENTDATA().value('(/EVENT_INSTANCE/LoginType)[1]', 'nvarchar(512)')
         , EVENTDATA().value('(/EVENT_INSTANCE/SID)[1]', 'nvarchar(512)')
         , EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(512)')
         , EVENTDATA().value('(/EVENT_INSTANCE/IsPooled)[1]', 'nvarchar(1)')
    etc
    */
    
    DROP TRIGGER tddl_storedprocevents ON DATABASE
    
    

    我建议您阅读关于eventData()返回的XML对象的文档,如果您现在不这样做的话。

    希望它有帮助。

    推荐文章