2015-01-15 63 views
0

我需要在Microsoft SQL Server中編寫一個簡單的觸發器。它涉及的兩個表(抱歉非標準語法):MSQL觸發器根據特定字段的更新在第二個表中插入記錄

customer { 
    customerno (integer) 
    comm_preference (varchar(1)) 
    email (varchar(255)) 
    } 

email_sent { 
    customerno (integer) 
    email (varchar(255)) 
    date (datetime) 
} 

爲customer.comm_preference有效值是M,E,B(移動,電子郵件,兩者)。我需要一個觸發器,如果​​將值更改爲E或B,則將具有customer.customerno,customer.email和今天日期的記錄插入到email_sent中。

到目前爲止,我的努力已經徹底清除。有人能幫我嗎?

+0

您使用MS SQL的是什麼版本? – HaveNoDisplayName 2015-01-15 18:22:09

回答

0

試試這個,而以「E」或「B」或值插入記錄更改爲「E」或「B」

CREATE TRIGGER dbo.trg 
    ON customer 
    AFTER INSERT,UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT 1 FROM inserted WHERE comm_preference IN ('E', 'B') 
     BEGIN 
      INSERT INTO email_sent 
      SELECT customerno, email, GETDATE() from inserted 
     END   

END 
+0

是的,它應該工作。有一點需要注意:'SELECT 1'與'SELECT *'相同 – 2015-01-15 17:13:43

+0

我的意思是IF EXISTS(從插入的WHERE中選擇1)comm_preference IN('E','B')'和'IF EXISTS(SELECT * FROM插入的WHERE comm_preference IN('E','B')'。很多人寫1只是認爲*會選擇所有的行,但它是一樣的,對我來說*在這種情況下更具可讀性 – 2015-01-15 17:17:37

+0

當你選擇*在IF EXISTS中,沒有什麼區別,SQL SERVER在IF EXISTS語句中沒有獲取任何數據。參見http://stackoverflow.com/questions/26798285/which-is-better-select-1-vs-select-檢查是否存在記錄 – 2015-01-15 17:27:20

0

嘗試這樣的事情,它將插入email_sent表中的新記錄;

CREATE TRIGGER trgCustomer_Update ON dbo.customer FOR UPDATE 
AS 
    BEGIN 
     IF UPDATE(comm_preference) 
      BEGIN 
       INSERT dbo.email_sent 
         (customerno 
         ,email 
         ,date 
         ) 
         SELECT i.customerno 
           ,i.email 
           ,GETDATE() 
         FROM inserted i 
         INNER JOIN deleted d 
         ON  i.customerno = d.customerno 
         WHERE d.comm_preference NOT IN ('E', 'B') AND 
           i.comm_preference IN ('E', 'B') 
      END 
    END 
GO 

問候,

里斯

相關問題