2011-08-24 8 views
6

Estoy intentando crear un desencadenador en SQL Server 2005 que se ejecute en INSERT, UPDATE y DELETE, pero para TODAS las tablas en la base de datos (para fines de auditoría) . ¿Es posible hacer esto?SQL Server - Crear un único disparador que se ejecuta para TODAS las tablas de la base de datos

Actualmente tenemos disparadores separados para cada tabla en la base de datos, y dado que todos hacen lo mismo, estoy buscando consolidarlos en un único disparador.

Sé que es posible crear activadores de base de datos, pero los únicos eventos en los que me puedo conectar parecen ser cambios de esquema en tablas, sprocs, etc., pero no para inserciones y actualizaciones de registros, a menos que me falta algo.

Respuesta

8

Los activadores genéricos de tablas no existen en SQL, por lo que deberá recorrer cada una de sus tablas (INFORMATION_SCHEMA.Tables) y crear los desencadenadores para cada uno que use SQL dinámico. (o llegar a otro proceso simple de crear disparadores para cada tabla.)

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

- se puede inspeccionar al menos parte de la secuencia de comandos ejecutando el - en modo texto siguiente:

SELECT @s; 

- si quieres ver más de todo (pero no necesariamente - todo el asunto), ejecute este en el modo de red y haga clic en el resultado:

SELECT CONVERT(XML, @s); 

source page:

Cuestiones relacionadas