SQL Server获取数据库触发器中的表名
我想使用数据库级DDL触发器记录数据库中的操作。 我需要获取表名和操作(插入、更新、删除),并将其写入带有日志的表中 我可以在数据库级触发器中获取表名并使用它插入表名吗?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
或者需要在所有表上放置触发器?以下是我在许多数据库上使用的设置。它展示了您询问的大部分内容:
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动作。