Vô hiệu hóa và kích hoạt tất cả các khóa ngoại
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
Đầu tiên, con trỏ ForeignKeyCthon được khai báo là câu lệnh SELECT tập hợp danh sách các khóa ngoại và tên bảng của chúng. Tiếp theo, con trỏ được mở và câu lệnh FETCH ban đầu được thực thi. Câu lệnh FETCH này sẽ đọc dữ liệu của hàng đầu tiên vào các biến cục bộ @ForignKeyName và @tableName. Khi lặp qua một con trỏ, bạn có thể kiểm tra @@ FETCH_STATUS cho giá trị 0, cho biết quá trình tìm nạp đã thành công. Điều này có nghĩa là vòng lặp sẽ tiếp tục di chuyển về phía trước để nó có thể nhận được mỗi khóa ngoại liên tiếp từ hàng. @@ FETCH_STATUS có sẵn cho tất cả các con trỏ trên kết nối. Vì vậy, nếu bạn đang lặp qua nhiều con trỏ, điều quan trọng là phải kiểm tra giá trị của @@ FETCH_STATUS trong câu lệnh ngay sau câu lệnh FETCH. @@ FETCH_STATUS sẽ phản ánh trạng thái cho hoạt động FETCH gần đây nhất trên kết nối. Các giá trị hợp lệ cho @@ FETCH_STATUS là:
0 = FETCH đã thành công
-1 = FETCH không thành công
-2 = hàng được tìm nạp bị thiếu
Bên trong vòng lặp, mã xây dựng lệnh ALTER TABLE khác nhau tùy thuộc vào ý định là vô hiệu hóa hoặc kích hoạt ràng buộc khóa ngoại (sử dụng từ khóa CHECK hoặc NOCHECK). Câu lệnh sau đó được in dưới dạng tin nhắn để tiến trình của nó có thể được quan sát và sau đó câu lệnh được thực thi. Cuối cùng, khi tất cả các hàng đã được lặp qua, thủ tục được lưu sẽ đóng và giải phóng con trỏ.
xem Vô hiệu hóa các ràng buộc và kích hoạt từ Tạp chí MSDN