簡體   English   中英

在 Table Drop/Create 上重新創建現有觸發器?

[英]Recreate an existing Trigger on Table Drop/Create?

我有一個保險索賠表(此示例為 TableX)和一個審計表(TableXAudit)。 與 TableX 關聯的觸發器在 Insert、Update 和 Delete 上插入記錄(正如您所期望的審計觸發器所做的那樣)。 但是,隨着項目的充實,TableX 仍在修改(添加/刪除列)。 我發現,使用 Drop/Create Table 腳本來更改表會導致觸發器被刪除但沒有重新創建。

我的問題; 有沒有辦法保留表 Drop/Create 上的觸發器?

謝謝。

我知道這很舊,但這似乎適用於常見情況。 它創建一個腳本來刪除和重新創建觸發器。 然后,您可以將放置表代碼放在其中。

CREATE TABLE #commands_to_build (
    ID INT IDENTITY(1,1),
    command NVARCHAR(max) 
    )

DECLARE @schema_name sysname = 'your_schema_name_here'
DECLARE @table_name_to_change sysname = 'your_table_name_here'
DECLARE @row_num int

SELECT  
    s.name AS [schema_name],
    o.Name AS TriggerName,
    c.text,
    t.name AS table_name
    INTO #triggercode  
FROM 
    dbo.SysObjects o
    INNER JOIN dbo.sysComments c
    ON o.ID = c.ID
    inner join sys.tables t
    ON t.object_id = o.parent_obj
    INNER JOIN sys.schemas s
    ON s.schema_id = t.schema_id
WHERE   
    o.Type = 'TR'
    AND t.name = @table_name_to_change
    AND s.name = @schema_name
ORDER BY s.name, t.name, o.name 

INSERT INTO #commands_to_build (command)
SELECT X.command
FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY TriggerName) * 2 AS row_num, 
    'DISABLE TRIGGER [' + TriggerName + '] ON [' + @schema_name + '].[' + @table_name_to_change + ']' AS command
    FROM #triggercode
    UNION 
    SELECT ROW_NUMBER() OVER (ORDER BY TriggerName) * 2 -1, 'GO'
    FROM #triggercode
) X
ORDER BY X.row_num

Select @row_num = Count(*) From #triggercode
  
IF @row_num > 0
BEGIN

/* This rigamorole inserts a GO command between every create and enable trigger command, 
in a grouping of four commands, GO, CREATE, GO, ENABLE since they each must be the first of a batch */
    INSERT INTO #commands_to_build (command)
    SELECT X.command
    FROM
    (
        SELECT ROW_NUMBER() OVER (ORDER BY TriggerName) * 4 - 3 AS row_num,
        'GO' AS command
        FROM #triggercode
        UNION 
        SELECT ROW_NUMBER() OVER (ORDER BY TriggerName) * 4 - 2, 
        [text]
        FROM #triggercode
        UNION
        SELECT ROW_NUMBER() OVER (ORDER BY TriggerName) * 4 - 1,
        'GO'
        FROM #triggercode
        UNION
        SELECT ROW_NUMBER() OVER (ORDER BY TriggerName) * 4 AS row_num, 
        'ENABLE TRIGGER [' + TriggerName + '] ON [' + @schema_name + '].[' + @table_name_to_change + ']' AS command
        FROM #triggercode
    ) X
    ORDER BY X.row_num
end

SELECT * FROM #commands_to_build

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM