में पहला कथन होना चाहिए कुछ प्रशासनिक कार्यों के भाग के रूप में, हमारे पास कई टेबल हैं जिन्हें प्रत्येक को ट्रिगर की आवश्यकता होती है। जब कोई ऑब्जेक्ट संशोधित किया जाता है तो ट्रिगर ऑडिट डेटाबेस में ध्वज और दिनांक सेट करेगा। सादगी के लिए, मेरे पास सभी ऑब्जेक्ट्स वाली एक टेबल है जिसे बनाए गए ट्रिगर्स की आवश्यकता होती है।गतिशील एसक्यूएल त्रुटि: 'ट्रिगर बनाएं' एक क्वेरी बैच
मैं प्रत्येक वस्तु के लिए यह करने के लिए कुछ गतिशील एसक्यूएल उत्पन्न करने के लिए कोशिश कर रहा हूँ, लेकिन मैं इस त्रुटि हो रही है:
'CREATE TRIGGER' must be the first statement in a query batch.
यहाँ कोड एसक्यूएल उत्पन्न करने के लिए है।
CREATE PROCEDURE [spCreateTableTriggers]
AS
BEGIN
DECLARE @dbname varchar(50),
@schemaname varchar(50),
@objname varchar(150),
@objtype varchar(150),
@sql nvarchar(max),
@CRLF varchar(2)
SET @CRLF = CHAR(13) + CHAR(10);
DECLARE ObjectCursor CURSOR FOR
SELECT DatabaseName,SchemaName,ObjectName
FROM Audit.dbo.ObjectUpdates;
SET NOCOUNT ON;
OPEN ObjectCursor ;
FETCH NEXT FROM ObjectCursor
INTO @dbname,@schemaname,@objname;
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql = N'USE '+QUOTENAME(@dbname)+'; '
SET @sql = @sql + N'IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'''+QUOTENAME(@schemaname)+'.[Tiud_'[email protected]+'_AuditObjectUpdates]'')) '
SET @sql = @sql + N'BEGIN DROP TRIGGER '+QUOTENAME(@schemaname)+'.[Tiud_'[email protected]+'_AuditObjectUpdates]; END; '[email protected]
SET @sql = @sql + N'CREATE TRIGGER '+QUOTENAME(@schemaname)+'.[Tiud_'[email protected]+'_AuditObjectUpdates] '[email protected]
SET @sql = @sql + N' ON '+QUOTENAME(@schemaname)+'.['[email protected]+'] '[email protected]
SET @sql = @sql + N' AFTER INSERT,DELETE,UPDATE'[email protected]
SET @sql = @sql + N'AS '[email protected]
SET @sql = @sql + N'IF EXISTS(SELECT * FROM Audit.dbo.ObjectUpdates WHERE DatabaseName = '''[email protected]+''' AND ObjectName = '''[email protected]+''' AND RequiresUpdate=0'[email protected]
SET @sql = @sql + N'BEGIN'[email protected]
SET @sql = @sql + N' SET NOCOUNT ON;'[email protected]
SET @sql = @sql + N' UPDATE Audit.dbo.ObjectUpdates'[email protected]
SET @sql = @sql + N' SET RequiresUpdate = 1'[email protected]
SET @sql = @sql + N' WHERE DatabaseName = '''[email protected]+''' '[email protected]
SET @sql = @sql + N' AND ObjectName = '''[email protected]+''' '[email protected]
SET @sql = @sql + N'END' [email protected]
SET @sql = @sql + N'ELSE' [email protected]
SET @sql = @sql + N'BEGIN' [email protected]
SET @sql = @sql + N' SET NOCOUNT ON;' [email protected]
SET @sql = @sql + @CRLF
SET @sql = @sql + N' -- Update ''SourceLastUpdated'' date.'[email protected]
SET @sql = @sql + N' UPDATE Audit.dbo.ObjectUpdates'[email protected]
SET @sql = @sql + N' SET SourceLastUpdated = GETDATE() '[email protected]
SET @sql = @sql + N' WHERE DatabaseName = '''[email protected]+''' '[email protected]
SET @sql = @sql + N' AND ObjectName = '''[email protected]+''' '[email protected]
SET @sql = @sql + N'END; '[email protected]
--PRINT(@sql);
EXEC sp_executesql @sql;
FETCH NEXT FROM ObjectCursor
INTO @dbname,@schemaname,@objname;
END
CLOSE ObjectCursor ;
DEALLOCATE ObjectCursor ;
END
अगर मैं PRINT
का उपयोग करें और एक नई क्वेरी विंडो पर पेस्ट करते हैं, कोड किसी भी समस्या के बिना निष्पादित करता है।
मैंने GO
कथन हटा दिए हैं क्योंकि यह त्रुटियां भी दे रहा था।
मुझे क्या याद आ रही है?
मुझे EXEC(@sql);
या EXEC sp_executesql @sql;
का उपयोग करके त्रुटि क्यों मिल रही है?
क्या यह EXEC()
के भीतर संदर्भ के साथ कुछ करना है?
किसी भी मदद के लिए बहुत धन्यवाद।
इसके लिए बहुत धन्यवाद। मैंने कोड को दो 'टुकड़ों' में विभाजित कर दिया है जैसा कि आप ऊपर दिए गए अपने पहले विकल्प में सुझाव देते हैं: – MarkusBee
[पिछली टिप्पणी पर संपादित समय संपादित करें।] बहुत धन्यवाद। जैसा कि आपने अपने पहले विकल्प में सुझाव दिया है, मैंने कोड को दो 'टुकड़ों' में विभाजित कर दिया है। पहला भाग पूरी तरह से निष्पादित करता है। मैं स्पष्ट करता हूं कि प्रक्रिया 'ऑडिट' डेटाबेस से निष्पादित की जाती है और ऑब्जेक्ट्स जिन्हें ट्रिगर की आवश्यकता होती है, अन्य डेटाबेस में होती हैं। 'CREATE TRIGGER' कथन का निष्पादन अब पूरी तरह से योग्य तालिका नाम का उपयोग करते समय निम्न त्रुटि फेंकता है: "ट्रिगर नहीं बना सकता [...] क्योंकि लक्ष्य वर्तमान डेटाबेस में नहीं है।" क्या इसके आसपास कोई रास्ता है? मैं इसे किसी अन्य डेटाबेस के संदर्भ में निष्पादित करने के लिए कैसे प्राप्त कर सकता हूं? धन्यवाद। – MarkusBee
@markb: कृपया मेरा अपडेट देखें। मुझे यकीन नहीं है कि सबकुछ उतना स्पष्ट है जितना मैं चाहता हूं, इसलिए कृपया पूछने में संकोच न करें। –