触发器:删除表a中的某行,则修表b中某字段的值。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发器:删除表a中的某行,则修表b中某字段的值。相关的知识,希望对你有一定的参考价值。

一. 触发器如下:
create trigger aaa
on 表A
for delete
as
begin
DECLARE @no1 nCHAR(10),@no2 nCHAR(10)
SELECT @no1=no1,@no2=no2 FROM deleted
update 表B set 过帐标记='未过帐' where no1=@no1and no2=@no2
end

二. 在表A中删除数据时,出现错误,如附图。
三.如果禁用触发器,则可在表A中删除数据。
四. SQL SERVER2005数据库。

这个跟触发器的关系不大:
sqlserver中多行所有数据重复,无法更新或删除问题,通常是在没有主键的情况下的表.
先确认一下表中有没有主键,要是没有就得使用临时表来实现删除重复的行。
方法一:
DELETE FROM 表名 WHERE 主键字段名 IN(
SELECT MAX(主键字段名) AS 主键字段名 FROM 表名 GROUP BY 其他字段 HAVING COUNT(1)>1)

方法二:
SELECT 字段列表 INTO #T FROM 表名 GROUP BY 字段列表
--先删除原来的数据表,再插入不重复的语句
TRUNCATE TABLE 表名
INSERT INTO 表名 SELECT * FROM #T
DROP TABLE #T
方法一:

delete from tab_test2 where id=(select max(id) from tab_test2 group by id,uid having count(1)>1)

方法二:注意:#t是临时表,在tempdb数据库中的临时表节点下可以找到,sqlserver服务重启就会消失的表.

select id,uid into #t from tab_Test2 group by id,uid

truncate table tab_Test2

insert into tab_Test2 select * from #t

msdn:

在进行SQL数据库维护时,发现有几行记录明显有错误却删除不了,一执行删除命令就提示“已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行(X行)。”表现为在:数据库中出现了重复的键值或数据,当试图删除时错误提示信息就出来了。建立的几个表都没有关键字,设置好关键字后问题解决。

微软的官方网站对此问题也有说明,BUG: 您可能会收到当您尝试使用 SQL Server Management Studio 更新 SQL Server 2005 中的表的行时 微软给了个替代方法:要变通解决此问题,创建 SQL Server Management Studio 中的在新的查询窗口。 然后,运行 SQL UPDATE 语句更新表中的行。

方法一:

1、单击SQL Server Management Studio工具栏上的“新建查询”按钮,然后按照提示登陆要修改的数据表所在的数据库

2、然后会在数据库的编辑窗口弹出一个可以执行SQL语句的窗口,在该窗口输入以下SQL语句

delete 数据库名.表名 where 要删除的字段名 = '字段值'

例如:delete pyj_db.dbo.Cellphone_related where Cellphone_Num = '111'

方法二:

其实利用INSERT INTO 做一些小的变换,这个问题就可迎刃而解了,具体步骤如下:

先将原用的表做个备份,根据条件将满足条件的数据导到新的表来,再将原表清除,最后将备份表中的数据select过来即可。

第一步:在备份表中导入需要的数据

INSERT INTO DataFile_backup
select * from DataFile where year(consumedate)=条件

第二步:清除原表中的数据

Delete from DataFile

第三步:从备份表中导入数据

select * from DataFile
参考技术A SQL Sercer 触发器 没有象Oracle的那种 FOR EACH ROW 的关键字

一次更新一条,还是多条,取决于 INSERTED/DELETED 里面的内容。

楼主的 触发器中

SELECT @no1=no1,@no2=no2 FROM deleted

当一个DELETE语句,删除多条记录的时候, deleted 里面会有多条记录。

一个简单的处理逻辑如下:

create trigger aaa
on 表A
for delete
as
begin
DECLARE @no1 nCHAR(10),@no2 nCHAR(10);
-- 定义游标.
DECLARE c_test_main CURSOR FAST_FORWARD FOR
SELECT no1, no2 FROM deleted;

-- 打开游标.
OPEN c_test_main;
-- 填充数据.
FETCH NEXT FROM c_test_main INTO @no1, @no2;

-- 假如检索到了数据,才处理.
WHILE @@fetch_status = 0
BEGIN
update 表B set 过帐标记='未过帐' where no1=@no1and no2=@no2;
-- 填充下一条数据.
FETCH NEXT FROM c_test_main INTO @no1, @no2;
END;

-- 关闭游标
CLOSE c_test_main;
-- 释放游标.
DEALLOCATE c_test_main;

end本回答被提问者采纳
参考技术B create trigger aaa
on 表A
for delete
as
begin
update a set a.过帐标记='未过帐' from 表B a,deleted b where a.no1=b.no1 and a.no2=b.no2
end

sqlserver 没有行级触发器,像你那样的写法并不是每次只删除一条记录,所以就报错了,用我的方法关联deleted表删除,这样就不会报错了

SQLserver中的触发器,实现一个表的某字段修改后,另一张表的对应字段也修改

有2个表a b,表a中的id字段值更改后,表b中的值也做相应修改

求 触发器

参考技术A create or replace trigger tri_test
after insert or update or delete on test
begin
if updating then
dbms_output.put_line('修改');
elsif deleting then
dbms_output.put_line('删除');
elsif inserting then
dbms_output.put_line('插入');
end if;
end;本回答被提问者采纳

以上是关于触发器:删除表a中的某行,则修表b中某字段的值。的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2008 触发器中,根据一个表修改另外一个表

如何获取GridView中某行某列的值

怎么删除mysql数据库中某表中的某个字段的数据?

mysql替换表中某字段的某值

C# datatable增加行(datarow)数据为另一个datatable中某行

如何定位DataGridView中的某行中的某列