2011-08-24 12 views
6

Sto provando a creare un trigger in SQL Server 2005 che viene eseguito su INSERT, UPDATE e DELETE, ma per TUTTE le tabelle nel database (a scopo di controllo) . È possibile farlo?SQL Server - Crea un singolo trigger che viene eseguito per TUTTE le tabelle nel database

Attualmente abbiamo trigger separati per ogni tabella nel database e, poiché tutti fanno la stessa cosa, sto cercando di consolidarli in un singolo trigger.

So che è possibile creare trigger di Database, ma gli unici eventi che posso collegare sembrano essere per le modifiche dello schema alle tabelle, sprocs ecc. Ma non per gli inserimenti e gli aggiornamenti ai record, a meno che manchi qualcosa?

risposta

8

I trigger di tabella generici non esistono in SQL, quindi è necessario eseguire il ciclo di ciascuna delle tabelle (INFORMATION_SCHEMA.Tables) e creare i trigger per ogni utilizzo di SQL dinamico. (o venire con un altro semplice procedura per creare trigger per ogni tabella.)

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

- è possibile ispezionare almeno una parte dello script eseguendo il - segue in modalità testo:

SELECT @s; 

- se si vuole vedere di più di tutta la cosa (ma non necessariamente - il tutto), eseguire questo in modalità griglia e fare clic sul risultato:

SELECT CONVERT(XML, @s); 

source page:

Problemi correlati