2010-06-16 127 views

回答

0

下降TRIGGER- use database_name

IF EXISTS (SELECT name FROM sysobjects 
    WHERE name = 'tgr_name' AND type = 'TR')  
DROP TRIGGER tgr_name 
GO 
1

這從微軟的文章介紹如何創建觸發器的語法。

http://msdn.microsoft.com/en-us/library/ms189799.aspx

是不是真的有一個「前」觸發,但您可以使用INSTEAD OF觸發器,可以讓你在任何地方採取行動試圖跳,然後定義你自己的行動。

我已經使用該技術來版本化數據。

CREATE TRIGGER [dbo].[Documents_CreateVersion] 
    ON [dbo].[Documents] 
    INSTEAD OF UPDATE 

AS 
BEGIN 

    DECLARE @DocumentID int 
    SELECT DocumentID = DocumentID FROM INSERTED 

    -- do something 

END 

插入的是一個有點用詞不當的位置,但它包含了操作的詳細信息時,那麼你可以定義與數據你自己的行動之前。

編輯:

按我下面的響應意見,如果多個行一次更新我的例子可能是危險的。我的應用程序不允許這樣,所以在這種情況下很好。我會同意上述是不好的做法。

+0

假設我必須檢查一個特定用戶的'childcount'如果超過'5'不更新user.how我可以使用而不是觸發器嗎? – nectar 2010-06-16 11:05:06

+0

從來不用這種方式編寫觸發器!你假設只有一行將在INSERTED表中,如果存在多行,這將失敗。 – 2010-06-16 11:58:16

+0

好點KM。我的例子是一個永遠不會有多個更新發生的表。這是一個不好的例子!謝謝。 – ScottE 2010-06-16 13:41:25

1

下降觸發器使用:

--SQL Server 2005+, drop the trigger, no error message if it does not exist yet 
BEGIN TRY DROP TRIGGER dbo.TrigerYourTable END TRY BEGIN CATCH END CATCH 
GO 

--drop trigger pre-SQl Server 2005, no error message if it does not exist yet 
if exists (select * from sysobjects where id = object_id(N'[dbo].[TrigerYourTable ]') and OBJECTPROPERTY(id, N'IsTrigger') = 1) 
    drop trigger [dbo].[TrigerYourTable ] 
GO 

OP中評論說:

......假設我要檢查的 一個perticular用戶childcount如果是超過5 不要更新user.how我可以做 ,而不是觸發器?

您並不真的需要阻止原始更新,您可以讓它發生,然後在觸發器中檢查問題並在必要時進行回滾。這是如何執行的邏輯,一個或多個受影響的行,當你需要加入,以確定受影響的行childcount

--create the trigger 
CREATE TRIGGER dbo.TrigerYourTable ON dbo.YourTable 
    AFTER UPDATE 
AS 
SET NOCOUNT ON 

IF EXISTS (SELECT 
       1 
       FROM INSERTED      i 
        INNER JOIN YourChildrenTable c ON i.ParentID=c.ParentID 
       GROUP BY i.ParentID 
       HAVING COUNT(i.ParentID)>5 
     ) 
BEGIN 
    RAISERROR('Count of children can not exceed 5',16,1) 
    ROLLBACK 
    RETURN 
END 

GO 

它會拋出錯誤,如果有違反邏輯的,並原始命令將受到回滾。

如果childcount是受影響的表中的列,然後使用觸發器這樣執行的邏輯:

--create the trigger 
CREATE TRIGGER dbo.TrigerYourTable ON dbo.YourTable 
    AFTER UPDATE 
AS 
SET NOCOUNT ON 

IF EXISTS (SELECT 1 FROM INSERTED WHERE childcount>5) 
BEGIN 
    RAISERROR('Count of children can not exceed 5',16,1) 
    ROLLBACK 
    RETURN 
END 

GO 

如果你只是想忽略違反規則試試這個任何行的更新:

--create the trigger 
CREATE TRIGGER dbo.TrigerYourTable ON dbo.YourTable 
    INSTEAD OF UPDATE 
AS 
SET NOCOUNT ON 

UPDATE y 
    SET col1=i.col1 
     ,col2=i.col2 
     ,col3=i.col3 
     ,.... --list all columns except the PK column! 
    FROM dbo.YourTable  y 
     INNER JOIN INSERTED i on y.PK=i.PK 
    WHERE i.childcount<=5 
GO 

它只會更新有一個孩子行計數小於5,忽略了失敗的需求(沒有錯誤消息)所有受影響行。

0

下面是一個簡單的觸發器,用於檢查列值,並在更新或插入之前觸發並引發錯誤。

IF OBJECT_ID ('dbo.MyTableTrigger', 'TR') IS NOT NULL 
    DROP TRIGGER dbo.MyTableTrigger; 
GO 

CREATE TRIGGER MyTableTrigger 
ON dbo.MyTable 
FOR INSERT, UPDATE 
AS 
DECLARE @Col1ID INT 
DECLARE @Col2ID INT 

SELECT @Col1ID = Col1ID, @Col2ID = Col2ID FROM inserted 
IF ((@Col1ID IS NOT NULL) AND (@Col2ID IS NOT NULL)) 
BEGIN 
    RAISERROR ('Col1ID and Col2ID cannot both be in MyTable at the same time.', 16, 10); 
END 
相關問題