SQL Server 2005: T-SQL tạm thời vô hiệu hóa trình kích hoạt


44

Có thể vô hiệu hoá trình kích hoạt cho một loạt lệnh và sau đó bật nó khi lô được thực hiện?

Tôi chắc chắn rằng tôi có thể thả kích hoạt và thêm lại nhưng tôi đã tự hỏi liệu có cách nào khác không.

57
DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } 
ON { object_name | DATABASE | ALL SERVER } [ ; ] 

http://msdn.microsoft.com/en-us/library/ms189748(SQL.90).aspx

tiếp theo là nghịch đảo:

ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } 
ON { object_name | DATABASE | ALL SERVER } [ ; ] 

http://msdn.microsoft.com/en-us/library/ms182706(SQL.90).aspx

  0

Cảm ơn! Tôi nghĩ rằng SQL Server 2005 ngụy trang của tôi đang hiển thị quá tốt trên trang web này. 23 sep. 082008-09-23 20:15:46

  0

Không phải lo lắng; là một DBA trong một thời gian dài và những thứ này trở thành tự động :) 23 sep. 082008-09-23 20:16:41

  0

tức là nếu bạn sử dụng tùy chọn để sửa đổi trình kích hoạt và tập lệnh chứa 'ALTER TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' thì bạn cần 'DISABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' và 'ENABLE TRIGGER [dbo]. [trgWhatever] ON [dbo]. [tblWhatever]' 22 sep. 152015-09-22 14:45:41

  0

LƯU Ý - Tôi gặp lỗi 'Cú pháp không đúng gần 'DISABLE'. ' trừ khi tôi đặt một ';' ở giữa 'PRINT 'Một số thông báo'; DISABLE TRIGGER [dbo] ..... ' 23 sep. 152015-09-23 15:22:06


15

Tuy nhiên, nó gần như luôn luôn là một ý tưởng tồi để làm điều này. Bạn sẽ gây rối với tính toàn vẹn của cơ sở dữ liệu. Đừng làm điều đó mà không xem xét các nhánh và kiểm tra với các dbas nếu bạn có chúng.

Nếu bạn làm theo mã của Matt, hãy nhớ bật lại trình kích hoạt. AND nhớ kích hoạt bị vô hiệu hóa cho mọi người chèn, cập nhật hoặc xóa khỏi bảng trong khi nó bị tắt, không chỉ cho quá trình của bạn, vì vậy nếu nó phải được thực hiện, hãy làm điều đó trong giờ khi cơ sở dữ liệu ít hoạt động nhất (và tốt hơn là ở chế độ người dùng đơn lẻ).

Nếu bạn cần thực hiện việc này để nhập một lượng lớn dữ liệu, thì hãy xem xét việc chèn hàng loạt không kích hoạt trình kích hoạt. Nhưng sau đó quá trình của bạn sau khi chèn số lượng lớn sẽ phải sửa chữa bất kỳ vấn đề toàn vẹn dữ liệu bạn giới thiệu bằng cách cũng không bắn kích hoạt.

  0

Điểm tuyệt vời. Lý do tôi cần điều này là khi sao chép dữ liệu từ môi trường sản xuất sang môi trường thử nghiệm một số AK đã được đặt lại bằng trình kích hoạt nhưng các cột liên quan trong một bảng khác không phù hợp. 23 sep. 082008-09-23 21:12:18


30

Đôi khi để điền một cơ sở dữ liệu trống từ nguồn dữ liệu ngoài hoặc gỡ lỗi một vấn đề trong cơ sở dữ liệu, tôi cần vô hiệu hóa TẤT CẢ các trình kích hoạt và ràng buộc. Để làm như vậy tôi sử dụng đoạn mã sau:

Để vô hiệu hóa tất cả các trở ngại và gây nên:

sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 
sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER all" 

Để kích hoạt tất cả các trở ngại và gây nên:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" 
sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? ENABLE TRIGGER all" 

tôi tìm thấy giải pháp mà một số thời gian trước đây trên SQLServerCentral, nhưng cần thiết để sửa đổi phần hạn chế cho phép như một phần ban đầu đã không hoạt động đầy đủ


9

Để mở rộng câu trả lời của Matt, đây là một ví dụ được đưa ra trên MSDN.

USE AdventureWorks; 
GO 
DISABLE TRIGGER Person.uAddress ON Person.Address; 
GO 
ENABLE Trigger Person.uAddress ON Person.Address; 
GO 

4

cách tiếp cận khác là hiệu quả vô hiệu hóa cò mà không thực sự tắt nó, sử dụng một biến trạng thái bổ sung mà được đưa vào cò.

create trigger [SomeSchema].[SomeTableIsEditableTrigger] ON [SomeSchema].[SomeTable] 
for insert, update, delete 
as 
declare 
    @isTableTriggerEnabled bit; 

exec usp_IsTableTriggerEnabled -- Have to use USP instead of UFN for access to #temp 
    @pTriggerProcedureIdOpt = @@procid,  
    @poIsTableTriggerEnabled = @isTableTriggerEnabled out; 

if (@isTableTriggerEnabled = 0) 
    return; 

-- Rest of existing trigger 
go 

Đối với tình trạng biến người ta có thể đọc một số loại hồ sơ kiểm soát khóa trong một bảng (tốt nhất nếu giới hạn ở những bối cảnh của phiên hiện tại), sử dụng context_info(), hoặc sử dụng sự hiện diện của một bảng tạm thời đặc biệt tên (mà đã là phiên phạm vi hạn chế):

create proc [usp_IsTableTriggerEnabled] 
    @pTriggerProcedureIdOpt bigint   = null, -- Either provide this 
    @pTableNameOpt   varchar(300) = null, -- or this 
    @poIsTableTriggerEnabled bit    = null out 
begin 

    set @poIsTableTriggerEnabled = 1; -- default return value (ensure not null) 

    -- Allow a particular session to disable all triggers (since local 
    -- temp tables are session scope limited). 
    -- 
    if (object_id('tempdb..#Common_DisableTableTriggers') is not null) 
    begin 
     set @poIsTableTriggerEnabled = 0; 
     return; 
    end 

    -- Resolve table name if given trigger procedure id instead of table name. 
    -- Google: "How to get the table name in the trigger definition" 
    -- 
    set @pTableNameOpt = coalesce(
     @pTableNameOpt, 
     (select object_schema_name(parent_id) + '.' + object_name(parent_id) as tablename 
      from sys.triggers 
      where object_id = @pTriggerProcedureIdOpt) 
    ); 

    -- Else decide based on logic involving @pTableNameOpt and possibly current session 
end 

Sau đó, để vô hiệu hóa tất cả các trigger:

select 1 as A into #Common_DisableTableTriggers; 
-- do work 
drop table #Common_DisableTableTriggers; -- or close connection 

Một nhược điểm có khả năng lớn là cò là vĩnh viễn slowe d xuống tùy thuộc vào độ phức tạp của việc truy cập biến trạng thái.

Chỉnh sửa: Thêm tham chiếu đến điều này đáng ngạc nhiên tương tự 2008 post by Samuel Vanga.


2
ALTER TABLE table_name DISABLE TRIGGER TRIGGER_NAME 
-- Here your SQL query 
ALTER TABLE table_name ENABLE TRIGGER TRIGGER_NAME 

2

Không phải câu trả lời hay nhất cho lập trình theo lô, nhưng đối với những người khác tìm kiếm câu hỏi này để tìm kiếm một cách nhanh chóng và dễ dàng để tạm thời tắt trình kích hoạt, điều này có thể được thực hiện trong SQL Server Management Studio.

  1. mở rộng thư mục trigger trên bàn
  2. kích chuột phải vào cò
  3. disable

enter image description here

Thực hiện theo các quá trình tương tự để kích hoạt lại.