SQL Server获取数据库触发器中的表名

SQL Server获取数据库触发器中的表名,sql,sql-server,triggers,Sql,Sql Server,Triggers,我想使用数据库级DDL触发器记录数据库中的操作。 我需要获取表名和操作(插入、更新、删除),并将其写入带有日志的表中 我可以在数据库级触发器中获取表名并使用它插入表名吗? 或者需要在所有表上放置触发器?以下是我在许多数据库上使用的设置。它展示了您询问的大部分内容: SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO CREATE TABLE [Meta].[DdlEvents]( [ID] [int] IDENTITY(1,1) NOT NULL

我想使用数据库级DDL触发器记录数据库中的操作。 我需要获取表名和操作(插入、更新、删除),并将其写入带有日志的表中

我可以在数据库级触发器中获取表名并使用它插入表名吗?
或者需要在所有表上放置触发器?

以下是我在许多数据库上使用的设置。它展示了您询问的大部分内容:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [Meta].[DdlEvents](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CreatedOn] [datetime] NULL,
    [CreatedBy] [sysname] NULL,
    [CreateBy2] [sysname] NULL,
    [SchemaName] [sysname] NULL,
    [ObjectName] [sysname] NULL,
    [HostName] [sysname] NULL,
    [ProgramName] [sysname] NULL,
    [SqlCommand] [nvarchar](max) NULL,
    [XmlData] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO


CREATE TRIGGER [DDLTrigger_LogDDL]
    ON DATABASE
    FOR DDL_DATABASE_LEVEL_EVENTS
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE
        @EventData XML = EVENTDATA();

    INSERT INTO Meta.DdlEvents( 
        SqlCommand, 
        SchemaName,
        ObjectName,
        HostName,
        ProgramName,
        XmlData 
        ) 
    VALUES ( 
        @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'NVARCHAR(255)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'NVARCHAR(255)'),
        HOST_NAME(),
        PROGRAM_NAME(),
        @EventData 
        );
END
GO

ENABLE TRIGGER [DDLTrigger_LogDDL] ON DATABASE
GO
具体地说,您可以在数据库DDL触发器中使用
EVENTDATA()
函数来获取事件XML,然后可以在
/Event\u INSTANCE/SchemaName
/Event\u INSTANCE/ObjectName
节点提取对象(表)对象和模式



下面是Martin对OP的评论,DDL触发器只在DDL事件上触发,即
CREATE
ALTER
DROP
等命令。对于DML事件,如插入、更新和删除,它不会触发。因此,如果这是您所需要的,那么这个答案将不起作用,是的,您将需要在每个表上使用触发器。

如果我正确理解了这个问题,他们会问是否可以使用全局DML触发器,在插入、更新或删除任何table@MartinSmith啊。是的,这对那个不起作用。你们说DDL触发器,然后给出三个DML动作。