Как сделать триггеры на основе количества таблиц в хранимой процедуре - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть 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 триггеров?Можно ли сделать это в хранимой процедуре, чтобы я не делал триггеры вручную на основе номера моей таблицы?

Если возможно, как это сделать с помощью хранимой процедуры?Пожалуйста, помогите:)

1 Ответ

0 голосов
/ 28 февраля 2019

Чтобы сделать то, что вы делаете до сих пор, только с 10 таблицами, да, вам нужно сделать 10 триггеров.

Вы можете генерировать триггеры динамически несколькими различными способами.Вы можете поместить имена таблиц в переменную Table и выполнять итерацию по ней любым удобным для вас способом (цикл WHILE, CURSOR, OUTER APPLY) и создать строку sql, включающую имя таблицы в имеющийся у вас скрипт TRIGGER, а затем выполнить его..

Поскольку это явно временная операция, я не буду беспокоиться о проблемах производительности с циклами и курсорами, просто сделайте все, что вам проще всего написать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...