我想創建一個觸發器在SQL Server 2005上運行INSERT,UPDATE和DELETE,但對於數據庫中的所有表(用於審計目的) 。是否有可能做到這一點?SQL Server - 創建單個觸發器運行數據庫中的所有表
目前我們對數據庫中的每個表都有單獨的觸發器,並且由於它們都執行相同的操作,所以我希望將它們合併到一個觸發器中。
我知道可以創建數據庫觸發器,但我可以掛鉤的唯一事件似乎是對錶,sprocs等的模式更改,但不能插入和更新記錄,除非我錯過了某些內容?
我想創建一個觸發器在SQL Server 2005上運行INSERT,UPDATE和DELETE,但對於數據庫中的所有表(用於審計目的) 。是否有可能做到這一點?SQL Server - 創建單個觸發器運行數據庫中的所有表
目前我們對數據庫中的每個表都有單獨的觸發器,並且由於它們都執行相同的操作,所以我希望將它們合併到一個觸發器中。
我知道可以創建數據庫觸發器,但我可以掛鉤的唯一事件似乎是對錶,sprocs等的模式更改,但不能插入和更新記錄,除非我錯過了某些內容?
通用表觸發器在SQL中不存在,因此您需要遍歷每個表(INFORMATION_SCHEMA.Tables)併爲每個表使用動態SQL創建觸發器。 (或者想出另一個簡單的過程,爲每個表創建觸發器。)
SET NOCOUNT ON;
DECLARE
@cr VARCHAR(2) = CHAR(13) + CHAR(10),
@t VARCHAR(1) = CHAR(9),
@s NVARCHAR(MAX) = N'';
;WITH t AS
(
SELECT [object_id],
s = OBJECT_SCHEMA_NAME([object_id]),
n = OBJECT_NAME([object_id])
FROM sys.tables WHERE is_ms_shipped = 0
)
SELECT @s += 'IF OBJECT_ID(''dbo.ioTrigger_' + t.s + '_' + t.n + ''') IS NOT NULL
DROP TRIGGER [dbo].[ioTrigger_' + t.s + '_' + t.n + '];
G' + 'O
CREATE TRIGGER ioTrigger_' + t.s + '_' + t.n + '
ON ' + QUOTENAME(t.s) + '.' + QUOTENAME(t.n) + '
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
-- surely you must want to put some other code here?
INSERT ' + QUOTENAME(t.s) + '.' + QUOTENAME(t.n) + '
(
' +
(
SELECT @t + @t + name + ',' + @cr
FROM sys.columns AS c
WHERE c.[object_id] = t.[object_id]
AND is_identity = 0
AND is_rowguidcol = 0
AND is_computed = 0
AND system_type_id <> 189
FOR XML PATH(''), TYPE
).value('.[1]', 'NVARCHAR(MAX)') + '--'
+ @cr + @t + ')'
+ @cr + @t + 'SELECT
' +
(
SELECT @t + @t + name + ',' + @cr
FROM sys.columns AS c
WHERE c.[object_id] = t.[object_id]
AND is_identity = 0
AND is_rowguidcol = 0
AND is_computed = 0
AND system_type_id <> 189
FOR XML PATH(''), TYPE
).value('.[1]', 'NVARCHAR(MAX)') + '--'
+ @cr + @t + 'FROM
inserted;
END' + @cr + 'G' + 'O' + @cr
FROM t
ORDER BY t.s, t.n;
SELECT @s = REPLACE(@s, ',' + @cr + '--' + @cr, @cr);
- 您可以通過運行 檢查腳本的至少一部分 - 按照文本模式:
SELECT @s;
- 如果你想看到更多的整個事情(但不一定 - 整件事),在網格模式下運行,這和點擊結果:
SELECT CONVERT(XML, @s);