我有3个表格如下
CREATE TABLE [dbo].[AuditTrail]
(
[AuditId] [INT] IDENTITY(1,1) NOT NULL,
[DateTime] [DATETIME] NOT NULL,
[TableName] [NVARCHAR](255) NOT NULL,
[AuditEntry] [XML] NULL,
CONSTRAINT [PK_AuditTrail]
PRIMARY KEY CLUSTERED (
)
CREATE TABLE [dbo].[Employee]
(
[ID] [UNIQUEIDENTIFIER] NOT NULL DEFAULT (NEWID()),
[NameEmployee] [NVARCHAR](255) NOT NULL,
CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED (
)
CREATE TABLE [dbo].[Transaction]
(
[ID] [UNIQUEIDENTIFIER] NOT NULL DEFAULT (NEWID()),
[NameTransaction] [NVARCHAR](255) NOT NULL,
CONSTRAINT [PK_Transaction]
PRIMARY KEY CLUSTERED (
)
我已经为我的表创建了2个触发器来处理一些删除,这是我工作得很好的触发器。我的触发器如下
CREATE TRIGGER AuditEmployee
ON [dbo].[Employee]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF (SELECT COUNT(*) FROM deleted) > 0
BEGIN
DECLARE @AuditMessage XML
SET @AuditMessage = (select * from deleted for xml auto)
INSERT INTO AuditTrail (DateTime, TableName, AuditEntry)
VALUES (GETDATE(), 'Simple', @AuditMessage)
END
END
GO
CREATE TRIGGER AuditTransaction
ON [dbo].[Transaction]
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF (SELECT COUNT(*) FROM deleted) > 0
BEGIN
DECLARE @AuditMessage XML
SET @AuditMessage = (select * from deleted for xml auto)
INSERT INTO AuditTrail (DateTime, TableName, AuditEntry)
VALUES (GETDATE(), 'Simple', @AuditMessage )
end
END
GO
在上面的查询中,我为两个表(Employee和Transaction)创建了两个触发器。如果两个表中都删除了数据,则数据将插入AuditAll表中。
我想问的是,如果我们有10个表,我必须制作10个触发器吗?是否可以在存储过程中进行,以便我不会根据表的数量手动创建触发器?
如果可能,如何使用存储过程执行此操作?请帮忙 :)
要做到目前为止你正在做的事情,只有10个表,是的,你必须做10个触发器。
您可以通过多种不同方式动态生成触发器。您可以将表名放在Table变量中,并以最舒适的方式(WHILE循环,CURSOR,OUTER APPLY)迭代它,并构建一个将表名合并到TRIGGER脚本中的sql字符串,然后执行它。
由于这显然是一个特殊的操作,我不会担心循环和游标的性能问题,只需做最容易编写的事情。