2015-11-09 93 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 *** - 它不是***行 - 逐行! –