当前位置: 代码迷 >> Sql Server >> SQL触发器的批改
  详细解决方案

SQL触发器的批改

热度:54   发布时间:2016-04-24 09:53:02.0
SQL触发器的修改
现在有2个数据库DBA和DBB,里面均有A表(A,B,C),属性都是INT,DBB里的A表中有大量的数据,程序在处理完之后会把C列的值改为1,我想用触发器把值为1的C列自动添加进DBA中的A表里,并且删除DBB中相关的数据,我写的代码是
CREATE TRIGGER [dbo].[INSERT_IN_DBA]
ON [dbo].[A]
FOR INSERT AS
DECLARE @A INT
DECLARE @B INT
DECLARE @C INT
IF UPDATE(C)
BEGIN
SET @A=(SELECT A FROM A)
SET @B=(SELECT B FROM A)
SET @C=(SELECT C FROM A)
INSERT INTO DBA.DBO.A(A,B,C)VALUES(@A,@B,@C)
DELETE FROM A WHERE C=1
END
SQL提示消息 512,级别 16,状态 1,过程 INSERT_IN_DBA,第 9 行
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
应该怎么修改

------解决思路----------------------
SET @A=(SELECT A FROM A) 这个不行的
因为你后面查询可能返回多个值。不能赋值给变量。要用SELECT。这样会把最后一个值赋值给变量。
你这样还是有问题。
insert into DBA.DBO.A 
select * from inserted
where c=1
------解决思路----------------------
你用FOR  insert,update啊
------解决思路----------------------

create table a (a int,b int, c int )
insert into a values(1,1,0),(2,2,0)
create table b (a int, b int,c int)
go
create  TRIGGER [INSERT_IN_DBA]
ON [dbo].[A]
FOR INSERT,update AS
IF UPDATE(C)
BEGIN
INSERT INTO b(A,B,C)
SELECT * FROM inserted WHERE C=1
DELETE FROM A WHERE C=1
END 


update a  set c=1 where a=1

--结果
a           b           c
----------- ----------- -----------
2           2           0

(1 行受影响)

a           b           c
----------- ----------- -----------
1           1           1

(1 行受影响)


我测试的没问题啊。实现了插入到表B 。删除表A的记录啊。
------解决思路----------------------
引用:
Quote: 引用:

你用FOR  insert,update啊

FOR 后面加了UPDATE之后提示
已更新或删除的行值不能使改行成为唯一行 









你试下
CREATE TRIGGER [dbo].[INSERT_IN_DBA]
ON [dbo].[A]
FOR INSERT,UPDATE AS
IF UPDATE(C)
BEGIN
INSERT INTO A2
SELECT * FROM A WHERE C=1
DELETE FROM A WHERE C=1
END
GO
  相关解决方案