如何根据存储过程中的表数创建触发器

问题描述 投票:0回答:1

我有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个触发器吗?是否可以在存储过程中进行,以便我不会根据表的数量手动创建触发器?

如果可能,如何使用存储过程执行此操作?请帮忙 :)

sql-server stored-procedures database-trigger
1个回答
0
投票

要做到目前为止你正在做的事情,只有10个表,是的,你必须做10个触发器。

您可以通过多种不同方式动态生成触发器。您可以将表名放在Table变量中,并以最舒适的方式(WHILE循环,CURSOR,OUTER APPLY)迭代它,并构建一个将表名合并到TRIGGER脚本中的sql字符串,然后执行它。

由于这显然是一个特殊的操作,我不会担心循环和游标的性能问题,只需做最容易编写的事情。

© www.soinside.com 2019 - 2024. All rights reserved.