2015-11-09 127 views
-1

我想制定一個觸發器,將放置在市場列表表格上,該表格將插入記錄到子表格中,如果該人員的年齡小於18,則嘗試插入。子表和營銷列表表具有相同的字段。我到目前爲止已經開始。我該如何繼續?如何創建插入觸發器?

create table child_list 
(
Id    int   primary key, 
Name   varchar(20)   , 
Date_of_Birth date    , 
Gender   char(1)    , 
Parish   varchar(20)   , 
Mobile   integer    , 
Mobile_Provider varchar(7)   , 
age    integer, 
age_cat varchar(20) 

);

create trigger insert_child 
    on marketing_list 
    for insert 
    as 
    if age<18.... 

回答

-1

假設你沒有子表上標識列,以下是您查詢:

create table child_list 
(
child_list_Id    int   primary key, 
Name   varchar(20)   , 
Date_of_Birth date    , 
Gender   char(1)    , 
Parish   varchar(20)   , 
Mobile   integer    , 
Mobile_Provider varchar(7)   , 
age    integer, 
age_cat varchar(20) 
) 
go 

create table marketing_list 
(
marketing_list_Id    int   primary key, 
VName   varchar(20)   , 
Date_of_Birth date    , 
Gender   char(1)    , 
Parish   varchar(20)   , 
Mobile   integer    , 
Mobile_Provider varchar(7)   , 
age    integer, 
age_cat varchar(20) 
) 
GO 

CREATE TRIGGER TRG_InsertChildList 
ON marketing_list 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @AGE INT 
    SET @AGE = (SELECT age FROM INSERTED) 

    IF (@AGE < 18) 
    BEGIN 
     INSERT INTO child_list 
     SELECT 
      marketing_list_Id 
      ,Name 
      ,Date_of_Birth 
      ,Gender 
      ,Parish 
      ,Mobile 
      ,Mobile_Provider 
      ,age 
      ,age_cat 
     FROM INSERTED 
    END 
END 

INSERT INTO marketing_list VALUES (1,'Test','03-04-1994',1,'Parish','123','AT&T',16,'age_cat') 
+0

你的觸發器有** **主要在缺陷您似乎認爲它會被稱爲**每行一次** - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,因此如果您的INSERT語句影響25行,您將觸發**一次**,但是「插入」將包含25行。您的代碼在這25行中選擇哪一個? 'SET @AGE =(SELECT age FROM INSERTED)' - 這是非確定性的,你會得到*一個*任意的行,而**忽略**所有其他的。你需要重寫你的觸發器來考慮這個問題! –

+0

如果您的INSERT語句影響25行,則觸發器執行25次。由於插入是逐行操作。 – Immu

+1

*** NO!***如果您有一條插入25行的「INSERT」語句,則觸發器將僅觸發*** ONCE *** - 它不是***行 - 逐行! –