ปิดการใช้งานและเปิดใช้งานคีย์ต่างประเทศทั้งหมด
CREATE PROCEDURE pr_Disable_Triggers_v2
@disable BIT = 1
AS
DECLARE @sql VARCHAR(500)
, @tableName VARCHAR(128)
, @tableSchema VARCHAR(128)
-- List of all tables
DECLARE triggerCursor CURSOR FOR
SELECT t.TABLE_NAME AS TableName
, t.TABLE_SCHEMA AS TableSchema
FROM INFORMATION_SCHEMA.TABLES t
ORDER BY t.TABLE_NAME, t.TABLE_SCHEMA
OPEN triggerCursor
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @sql = 'ALTER TABLE ' + @tableSchema + '.[' + @tableName + '] '
IF @disable = 1
SET @sql = @sql + ' DISABLE TRIGGER ALL'
ELSE
SET @sql = @sql + ' ENABLE TRIGGER ALL'
PRINT 'Executing Statement - ' + @sql
EXECUTE ( @sql )
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
END
CLOSE triggerCursor
DEALLOCATE triggerCursor
ก่อนอื่นเคอร์เซอร์ foreignKeyCursor จะถูกประกาศเป็นคำสั่ง SELECT ที่รวบรวมรายการของ foreign key และชื่อตาราง ถัดไปเคอร์เซอร์จะถูกเปิดและคำสั่ง FETCH เริ่มต้นจะถูกดำเนินการ คำสั่ง FETCH นี้จะอ่านข้อมูลของแถวแรกลงในตัวแปรโลคัล @foreignKeyName และ @tableName เมื่อวนลูปผ่านเคอร์เซอร์คุณสามารถตรวจสอบ @@ FETCH_STATUS สำหรับค่า 0 ซึ่งบ่งชี้ว่าการดึงข้อมูลสำเร็จ ซึ่งหมายความว่าการวนซ้ำจะดำเนินต่อไปข้างหน้าเพื่อให้สามารถรับแต่ละคีย์ต่างประเทศที่ต่อเนื่องจาก rowset @@ FETCH_STATUS มีเคอร์เซอร์ทั้งหมดในการเชื่อมต่อ ดังนั้นหากคุณวนลูปผ่านเคอร์เซอร์หลายตัวสิ่งสำคัญคือต้องตรวจสอบค่าของ @@ FETCH_STATUS ในคำสั่งทันทีหลังจากคำสั่ง FETCH @@ FETCH_STATUS จะแสดงสถานะของการดำเนินการ FETCH ล่าสุดในการเชื่อมต่อ ค่าที่ถูกต้องสำหรับ @@ FETCH_STATUS คือ:
0 = FETCH สำเร็จ
-1 = FETCH ไม่สำเร็จ
-2 = แถวที่ดึงข้อมูลหายไป
ภายในลูปรหัสจะสร้างคำสั่ง ALTER TABLE แตกต่างกันไปขึ้นอยู่กับว่าตั้งใจจะปิดหรือเปิดใช้งานข้อ จำกัด foreign key (โดยใช้คีย์เวิร์ด CHECK หรือ NOCHECK) คำสั่งจะถูกพิมพ์เป็นข้อความเพื่อให้สามารถสังเกตความคืบหน้าของมันและจากนั้นคำสั่งจะถูกดำเนินการ ในที่สุดเมื่อทุกแถวได้รับการวนซ้ำขั้นตอนการจัดเก็บจะปิดและยกเลิกการจัดสรรเคอร์เซอร์
ดูการปิดการใช้งานข้อ จำกัด และทริกเกอร์จากนิตยสาร MSDN