触发器执行了,操作语句没执行怎么回事?

weixin_39550830 2017-07-31 05:39:35

alter trigger tr_flow_del
on flow_data
instead of delete
as
declare @id int;
select @id=id from deleted;
begin
insert into flow_data_bak select * from deleted;

insert into flow_run_prcs_bak select * from flow_run_prcs where id=@id;

insert into flow_run_bak select * from flow_run where id=@id;
end
go


delete from flow_data where id=100

执行之后那三张备份表里已经插入数据了,但是delete语句居然没执行, flow_data 表的那条数据还在,到底是什么鬼呢?
instead of 不能换成for,会提示 :不能在 'inserted' 表和 'deleted' 表中使用 text、ntext 或 image 列。
...全文
380 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2017-08-01
  • 打赏
  • 举报
回复
有text /ntext /image类型更时要用INSTEAD OF,用以下方法测测

CREATE TRIGGER tr_flow_del ON flow_data
    INSTEAD OF DELETE
AS
    BEGIN TRY 
        BEGIN TRAN;
     
        INSERT  INTO flow_data_bak
                SELECT  *
                FROM    deleted;
 
        INSERT  INTO flow_run_prcs_bak
                SELECT  *
                FROM    flow_run_prcs
                WHERE   id IN ( SELECT  id
                                FROM    deleted );
 
        INSERT  INTO flow_run_bak
                SELECT  *
                FROM    flow_run
                WHERE   id IN ( SELECT  id
                                FROM    deleted );

        DELETE  flow_data
        WHERE   id IN ( SELECT  id
                        FROM    deleted );

        COMMIT TRAN;
    END TRY
    BEGIN CATCH
        RAISERROR(N'trigger Error',16,1);
        ROLLBACK TRAN;
    END CATCH;
GO
二月十六 2017-07-31
  • 打赏
  • 举报
回复
用instead of 那对应的操作就不再执行了,而是执行触发器里边的内容; 楼主可以试着用存储过程来代替这个删除和删除一起的操作; 如果非要用触发器,试试把instead of 换成for ,然后把数据库中的字段类型进行修改text 改成 varchar(max) ntext类型的改为nvarchar(max),image改成varbinary(max)类型
OwenZeng_DBA 2017-07-31
  • 打赏
  • 举报
回复
引用 6 楼 weixin_39550830 的回复:
[quote=引用 4 楼 wmxcn2000 的回复:] instead of   delete  替代触发器,不执行本语句,只执行触发器中的内容;
那怎么办呢,for和after又不能用,有其他办法吗,除了改字段类型[/quote] 可以改字段类型,image 改为varbinary(max) text varchar(max) ntext nvarchar(max) 后面的类型是完全可以替代原来的。
weixin_39550830 2017-07-31
  • 打赏
  • 举报
回复
引用 4 楼 wmxcn2000 的回复:
instead of   delete  替代触发器,不执行本语句,只执行触发器中的内容;
那怎么办呢,for和after又不能用,有其他办法吗,除了改字段类型
weixin_39550830 2017-07-31
  • 打赏
  • 举报
回复
引用 1 楼 AcHerat 的回复:
换 after
我提问里已经写了,会提示错误的。难道是字段类型的问题,text类型不支持吗
卖水果的net 2017-07-31
  • 打赏
  • 举报
回复
instead of   delete  替代触发器,不执行本语句,只执行触发器中的内容;
中国风 2017-07-31
  • 打赏
  • 举报
回复
赋值去掉,当删除多条记录时,会出现bug 改为: e.g.

CREATE TRIGGER tr_flow_del ON flow_data
    FOR DELETE
AS
    BEGIN 
        INSERT  INTO flow_data_bak
                SELECT  *
                FROM    deleted;
 
        INSERT  INTO flow_run_prcs_bak
                SELECT  *
                FROM    flow_run_prcs
                WHERE   id IN ( SELECT  id
                                FROM    deleted );
 
        INSERT  INTO flow_run_bak
                SELECT  *
                FROM    flow_run
                WHERE   id IN ( SELECT  id
                                FROM    deleted );
    END;
GO
0与1之间 2017-07-31
  • 打赏
  • 举报
回复
换成for 后面的of 去掉 或改成after delete 也可以
AcHerat 2017-07-31
  • 打赏
  • 举报
回复
换 after

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧