2011-08-24 11 views
6

मैं SQL सर्वर 2005 में एक ट्रिगर बनाने की कोशिश कर रहा हूं जो INSERT, अद्यतन और हटाएं पर चलता है, लेकिन डेटाबेस में सभी तालिकाओं के लिए (ऑडिटिंग उद्देश्यों के लिए) । क्या इसे करना संभव है?एसक्यूएल सर्वर - डेटाबेस में सभी टेबल के लिए चलाए जाने वाले एकल ट्रिगर बनाएं

वर्तमान में हमारे पास डेटाबेस में प्रत्येक तालिका के लिए अलग ट्रिगर्स हैं, और चूंकि वे सभी एक ही काम करते हैं, इसलिए मैं उन्हें एक ट्रिगर में समेकित करना चाहता हूं।

मुझे पता है कि डेटाबेस ट्रिगर्स बनाना संभव है, लेकिन केवल एक ही घटनाएं जिन्हें मैं हुक कर सकता हूं, तालिकाओं, स्पॉक्स इत्यादि में स्कीमा परिवर्तनों के लिए प्रतीत होता है, लेकिन रिकॉर्ड के लिए आवेषण और अपडेट के लिए नहीं, जब तक कि मुझे कुछ याद नहीं आ रहा है?

उत्तर

8

जेनेरिक टेबल ट्रिगर एसक्यूएल में मौजूद नहीं हैं, इसलिए आपको अपनी प्रत्येक तालिका (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:

संबंधित मुद्दे