DDL 触发器未按预期工作 SQL Server 2012

aar*_*u11 3 sql-server ddl-trigger

我在 SQL Server 2012 中有一个 DDL 触发器:

CREATE TRIGGER [AuditProcChanges]
ON DATABASE FOR 
CREATE_TABLE,ALTER_TABLE,DROP_TABLE
AS
DECLARE @message_body XML
SET @message_body = EVENTDATA()

    BEGIN
       BEGIN TRANSACTION
       INSERT  INTO MyChangeLog(vcEventType, dtEventTime, vcServerName, vcLoginName
                                            , vcUserName, vcObjectName, vcObjectType, vcSQL)
            SELECT  @message_body.value('(/EVENT_INSTANCE/EventType)[1]',
                                        'varchar(128)') AS EventType,
                    GETUTCDATE() AS PostTime,
                    @message_body.value('(/EVENT_INSTANCE/ServerName)[1]',
                                        'varchar(128)') AS ServerName,
                    @message_body.value('(/EVENT_INSTANCE/LoginName)[1]',
                                        'varchar(128)') AS LoginName,
                    @message_body.value('(/EVENT_INSTANCE/UserName)[1]',
                                        'varchar(128)') AS UserName,
                    @message_body.value('(/EVENT_INSTANCE/ObjectName)[1]',
                                        'varchar(128)') AS ObjectName,
                    @message_body.value('(/EVENT_INSTANCE/ObjectType)[1]',
                                        'varchar(128)') AS ObjectType,
                    @message_body.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
                                        'nvarchar(max)') AS TSQLCommand

        COMMIT TRANSACTION
    END
Run Code Online (Sandbox Code Playgroud)

但是当我从设计视图(右键单击和设计)更改表时,记录的事件只是临时表的创建和主表的删除。Create_Table 事件没有被捕获。

当我们从设计视图更改表时,我们不能捕获日志事件。请帮忙。

sep*_*pic 5

您的触发器完全没有问题(我唯一的问题是,如果您所做的只是 1 个 SELECT,为什么还要在触发器内打开另一个事务?)

当您以必须重新创建的方式更改表时(例如添加不在现有列末尾的列),服务器采取的操作如下(简化):

  • 创建一个名为 dbo.Tmp_old_tbl 的新表,具有新的结构(注意,它不是临时表位于 tempdb 中,它只是一个位于您的数据库中的新表)
  • 将旧表中的所有数据插入到新表中
  • EXECUTE sp_rename N'dbo.Tmp_old_tbl', N'old_tbl', 'OBJECT'

所以你看到创建的“临时表”实际上是你的新表,从 Tmp 重命名为你的 old_tbl