2011-08-24 45 views
6

Tôi đang cố gắng tạo trình kích hoạt trong SQL Server 2005 chạy trên INSERT, UPDATE và DELETE, nhưng cho TẤT CẢ các bảng trong cơ sở dữ liệu (cho mục đích kiểm tra) . có khả năng làm cái này không?SQL Server - Tạo Trigger đơn chạy cho TẤT CẢ các bảng trong cơ sở dữ liệu

Hiện tại chúng tôi có trình kích hoạt riêng cho mỗi bảng trong cơ sở dữ liệu và vì tất cả chúng đều làm điều tương tự, tôi đang tìm cách hợp nhất chúng thành một trình kích hoạt duy nhất.

Tôi biết có thể tạo trình kích hoạt cơ sở dữ liệu, nhưng các sự kiện duy nhất tôi có thể móc vào để thay đổi giản đồ thành bảng, sprocs, vv nhưng không cho chèn và cập nhật vào bản ghi, trừ khi tôi thiếu thứ gì đó?

Trả lời

8

Trình kích hoạt bảng chung không tồn tại trong SQL, do đó bạn sẽ cần phải lặp qua từng bảng của bạn (INFORMATION_SCHEMA.Tables) và tạo trình kích hoạt cho từng bảng sử dụng SQL động. (Hoặc đưa ra một quy trình đơn giản để tạo trigger cho mỗi bảng.)

2
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); 

- bạn có thể kiểm tra ít nhất một phần của kịch bản bằng cách chạy - sau trong chế độ văn bản:

SELECT @s; 

- nếu bạn muốn xem chi tiết của toàn bộ điều (nhưng không nhất thiết - toàn bộ điều), chạy trong chế độ lưới điện và bấm vào kết quả:

SELECT CONVERT(XML, @s); 

source page:

Các vấn đề liên quan