2011-08-24 8 views
6

INSERT、UPDATE、およびDELETEで実行されるSQL Server 2005で、データベース内のすべてのテーブル(トリガー) 。これは可能ですか?SQL Server - データベース内のすべてのテーブルに対して実行される単一のトリガーを作成する

現在、私たちはデータベース内のすべてのテーブルに対して別々のトリガーを持っています。それらはすべて同じことをするので、私はそれらを単一のトリガーに統合しようとしています。

データベースのトリガーを作成することは可能ですが、テーブル、sprocsなどのスキーマの変更はできますが、挿入やレコードの更新はできません。

答えて

8

一般的なテーブル・トリガーはSQLには存在しませんので、各テーブル(INFORMATION_SCHEMA.Tables)をループして、それぞれ動的SQLを使用するトリガーを作成する必要があります。 (または、各テーブルにトリガを作成するために、別の簡単なプロセスを思い付く。)

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

- あなたは を実行することにより、スクリプトの少なくとも一部を検査することができます - テキストモードで次

SELECT @s; 
を(必ずしも必要ではないが - 全体を)あなたは全部の詳細を参照したい場合は -

、グリッドモードでこれを実行し、結果をクリックしてください:

SELECT CONVERT(XML, @s); 

source page:

関連する問題