创建了一个触发器,貌似符合触发条件为什么没作用?
触发条件是:INSERT ,UPDATE  
触发器不能出手的情况是:连续插入多条数据,只能对符合条件的第一条数据起作用.后续的即时符合条件触发器却无动于衷.
LOOKCREATE TABLE 触发器失效
(
ID  INT  NULL , 
马甲  INT NULL ,   // 检查触发器是否工作的线索
)
CREATE TABLE 触发器失效记录
(
记录 NVARCHAR(20) NULL ,
标识 INT IDENTITY(1,1),
)CREATE TRIGGER TRIGGER_触发器失效
ON 触发器失效
FOR INSERT ,UPDATE 
AS
BEGIN
DECLARE @ID INT , @马甲 INT 
SELECT @ID=ID,  @马甲=马甲 FROM inserted
------------------------------------------
IF(@马甲 IS NULL )
BEGIN 
INSERT INTO 触发器失效记录(记录) VALUES('马甲为空')
UPDATE 触发器失效
SET 马甲=2011 WHERE ID=@ID
END
ELSE 
BEGIN
INSERT INTO 触发器失效记录(记录) VALUES('马甲不为空')
END
END
--------------------------------------------
INSERT INTO 触发器失效 VALUES(1,2)
SELECT * FROM 触发器失效
SELECT * FROM 触发器失效记录
INSERT INTO 触发器失效(ID) VALUES(2)
INSERT INTO 触发器失效 VALUES(3,4)
INSERT INTO 触发器失效 VALUES(5,6),(7,8)
INSERT INTO 触发器失效(ID) VALUES(9),(10),(11)  --触发器没干活的证据
INSERT INTO 触发器失效(ID) VALUES(12),(13)
------------------------------------------
/*
---------------------------------
----第一个表的数据----------
ID 马甲
1 2
2 2011
2 2011
3 4
5 6
7 8
9 2011
10 NULL
11 NULL
12 2011
13 NULL-----------------------------
------第二个表的数据
记录 标识
马甲不为空 1
马甲为空 2
马甲为空 3
马甲不为空 4
马甲不为空 5
马甲为空 6
马甲为空 7-----------------------------问题:
触发器不是子要符合条件就工作吗?为什么会这样?
插入的数据 :INSERT INTO 触发器失效(ID) VALUES(9),(10),(11)
三组数据貌似都符合触发器的条件,为什么触发器没动静?
能不能指条深入地介绍触发器明路?坐等解释帝 O(∩_∩)O哈!

解决方案 »

  1.   

    LZ 这个写法好像有点儿问题吧。INSERT INTO 触发器失效(ID) VALUES(9),(10),(11)
      

  2.   


    是批量插入数据的语句,费解的就是 批量插入 貌似触发器却没起作用 ,就是插入这些数据,
    ID      马甲
    9       2011
    10     NULL
    11     NULL
    ------------------
    10和11的两条条记录中 马甲不是为null 吗? 明明符合了  IF(@马甲 IS NULL ) 的条件 ,触发器咋没有效果?
    是我对触发器的理解出了问题吗?
      

  3.   

    SELECT @ID=ID,  @马甲=马甲 FROM inserted这本身写法有问题!
      

  4.   


    批量插入时inserted是一组数据,应该用循环读取再操作SELECT @ID=ID,  @马甲=马甲 FROM inserted放在循环体内
    然后进行业务操作
      

  5.   

    经过不断测试,如果是批量插入,他取的是集合的第一条数据。因为你的批量插入语句,类似于:
    DECLARE @a INT 
    DECLARE @b INT 
    DECLARE @c INT 
    DECLARE @d INT 
    DECLARE @e INT 
    DECLARE @f INT SET @a=5
    SET @b=56
    SET @c=4
    SET @d=2
    SET @e=22
    SET @f=6
    INSERT INTO 触发器失效 select @a,@b UNION SELECT @c,@d  UNION SELECT @e,@f ORDER BY 2批量插入语句和单个语句 实际上都只是一个事物,所以只能做一次处理。
      

  6.   

    CREATE TRIGGER TRIGGER_触发器失效
    ON 触发器失效
    FOR INSERT ,UPDATE 
    AS
    BEGIN
    insert into 触发器失效记录 ( 标识,记录) select ID,马甲 from inserted
    endSELECT @ID=ID,  @马甲=马甲 FROM inserted这样是不行的
      

  7.   

    写错了 ,是这样
    create TRIGGER [dbo].[TRIGGER_触发器失效]
    ON [dbo].[触发器失效]
    FOR INSERT ,UPDATE 
    AS
    BEGIN
    insert into 触发器失效记录 ( 记录) select 马甲 from inserted
    end
      

  8.   


    CREATE TABLE 触发器失效
    (
    ID  INT  NULL , 
    马甲  INT NULL ,   // 检查触发器是否工作的线索
    )改
    CREATE TABLE 触发器失效
    (
    ID  INT  NULL , 
    马甲  INT NULL ,   -- 检查触发器是否工作的线索
    )
      

  9.   


    INSERT INTO 触发器失效(ID) VALUES(9),(10),(11) 
    这句话编译通不过,不知道你在sql里面试了没,我的2005是通不过的!
    INSERT INTO 触发器失效(ID) 
    SELECT 9
    UNION ALL
    SELECT 10
    UNION ALL
    SELECT 11SELECT @ID=ID,  @马甲=马甲 FROM inserted
    这里的inserted是一张表存放插入的数据集,你上面的语句每次选择的都是该表的第一条记录
    所以第一条后面的记录都没有更新。用游标一条一条读取inserted里面的记录做update就可以了!
      

  10.   


    CREATE TABLE 触发器失效
    (
    ID  INT  NULL , 
    马甲  INT NULL ,   -- 检查触发器是否工作的线索
    )
    CREATE TABLE 触发器失效记录
    (
    记录 NVARCHAR(20) NULL ,
    标识 INT IDENTITY(1,1),
    )
    CREATE TRIGGER TRIGGER_触发器失效
    ON 触发器失效
    FOR INSERT
    AS
    BEGIN
    DECLARE @ID INT , @马甲 INT 
    DECLARE @cursor CURSOR
    SET @cursor=CURSOR FOR SELECT * FROM inserted
    OPEN @cursor
    FETCH NEXT FROM @cursor INTO @ID,@马甲
    WHILE(@@fetch_status=0)
    BEGIN
    IF(@马甲 IS NULL )
    BEGIN 
    INSERT INTO 触发器失效记录(记录) VALUES('马甲为空')
    UPDATE 触发器失效
    SET 马甲=2011 WHERE ID=@ID
    END
    ELSE 
    BEGIN
    INSERT INTO 触发器失效记录(记录) VALUES('马甲不为空')
    END
    FETCH NEXT FROM @cursor INTO @ID,@马甲
    END
    CLOSE @cursor
    ENDSELECT * FROM 触发器失效
    SELECT * FROM 触发器失效记录INSERT INTO 触发器失效 VALUES(1,2)
    INSERT INTO 触发器失效(ID) VALUES(2)
    INSERT INTO 触发器失效 
    SELECT 5,6
    UNION ALL
    SELECT 7,8INSERT INTO 触发器失效(ID) 
    SELECT 9
    UNION ALL
    SELECT 10
    UNION ALL
    SELECT 11
      

  11.   

    回 12楼:INSERT INTO 触发器失效(ID) VALUES(9),(10),(11) 可以在2008通过 
    SQL代码的全部语句是在sql 2008运行的  ,里面的代码都能运行下去.
    为了方便各位牛人明白我提出的问题,再叙述一下问题,会不会很罗嗦呢?
    问题来自于记账:我记录日常花销,里面有个星期列 为了插入方便,创建了触发器来获取星期并更新,
    花销编号(not null)  ,星期(null) , 花费(money)
    当我连续插入两条(只有花销编号,花费两项)语句时,我的目的是两条都有星期,可是查询时第二条为空(null)
    INSERT INTO 花销(花销编号,花费) VALUES('11-03-30_01',20) , ('11-03-30_02',35)SQL查询结果:
    ---------------------------------------------------------
            花销编号                  星期               花费
           11-03-30_01            星期三             20
           11-03-30_02            NULL               35
    ----------------郁闷的分割线---------------------------
    我想要的结果是:        花销编号                  星期               花费
           11-03-30_01            星期三             20
           11-03-30_02            星期三             35
    ----------------------------------------------------------
    创建的触发器是:CREATE TRIGGER 花销
        ON  花销
        FOR INSERT ,UPDATE
        AS
        BEGIN
        DECLARE  @花销编号  NVARCHAR(12) ,@星期  CHAR(6)
        SET   DATEFIRST   1             
        SELECT @花销编号=花销编号 FROM inserted
        UPDATE 花销
        SET 星期=DateName(Dw,GetDate()+@@DateFirst-1)  WHERE 花销编号=@花销编号
        END
    触发器是可以绑定到表中的.忐忑不安 ,以后插入数据不可靠了
      

  12.   


    CREATE TRIGGER 花销
        ON  花销
        FOR INSERT ,UPDATE
        AS
        BEGIN
        DECLARE  @花销编号  NVARCHAR(12) ,@星期  CHAR(6)
        SET   DATEFIRST   1             
        UPDATE 花销 SET 星期=DateName(Dw,GetDate()+@@DateFirst-1) from 花销 a,inserted b
      WHERE a.花销编号=b.花销编号
        END
      

  13.   


    SELECT @花销编号=花销编号 FROM inserted
        UPDATE 花销
        SET 星期=DateName(Dw,GetDate()+@@DateFirst-1)  WHERE 花销编号=@花销编号

    在写触发器时,忌使用上面的做法,
    因为定义变量@花销编号来接收添加的"花销编号"字段数据时,如果批量添加,则@花销编号变量保存的只会获取到一个值,这样最后就只有一条数据的“星期”值被更改了。。