创建了一个触发器,貌似符合触发条件为什么没作用?
触发条件是: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哈!
触发条件是: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哈!
是批量插入数据的语句,费解的就是 批量插入 貌似触发器却没起作用 ,就是插入这些数据,
ID 马甲
9 2011
10 NULL
11 NULL
------------------
10和11的两条条记录中 马甲不是为null 吗? 明明符合了 IF(@马甲 IS NULL ) 的条件 ,触发器咋没有效果?
是我对触发器的理解出了问题吗?
批量插入时inserted是一组数据,应该用循环读取再操作SELECT @ID=ID, @马甲=马甲 FROM inserted放在循环体内
然后进行业务操作
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批量插入语句和单个语句 实际上都只是一个事物,所以只能做一次处理。
ON 触发器失效
FOR INSERT ,UPDATE
AS
BEGIN
insert into 触发器失效记录 ( 标识,记录) select ID,马甲 from inserted
endSELECT @ID=ID, @马甲=马甲 FROM inserted这样是不行的
create TRIGGER [dbo].[TRIGGER_触发器失效]
ON [dbo].[触发器失效]
FOR INSERT ,UPDATE
AS
BEGIN
insert into 触发器失效记录 ( 记录) select 马甲 from inserted
end
CREATE TABLE 触发器失效
(
ID INT NULL ,
马甲 INT NULL , // 检查触发器是否工作的线索
)改
CREATE TABLE 触发器失效
(
ID INT NULL ,
马甲 INT NULL , -- 检查触发器是否工作的线索
)
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就可以了!
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
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
触发器是可以绑定到表中的.忐忑不安 ,以后插入数据不可靠了
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
SELECT @花销编号=花销编号 FROM inserted
UPDATE 花销
SET 星期=DateName(Dw,GetDate()+@@DateFirst-1) WHERE 花销编号=@花销编号
在写触发器时,忌使用上面的做法,
因为定义变量@花销编号来接收添加的"花销编号"字段数据时,如果批量添加,则@花销编号变量保存的只会获取到一个值,这样最后就只有一条数据的“星期”值被更改了。。