none
触发器 如何中止插入语句 RRS feed

答案

  • 使用前置触发器 如:

    CREATE TRIGGER TriggerName on TableName
    INSTEAD OF INSERT
    AS
    BEGIN
    
      if true 
      INSERT INTO TableName
           SELECT *
           FROM inserted
    END
    GO


    Microsoft



    2012年11月20日 13:40

  • 如何用代码实现

    插入语句时如果该语句判段错误,触发器中止执行该语句

    Hi ,

    假如我现在不想使用primary key,但我想利用触发器来实现这个功能,可以参照以下的代码:

    create table tab(id int, name varchar(20))
    insert into tab values(1,'aa')
    insert into tab values(2,'bb');
    
    select id from tab1 group by id having(COUNT(*)>1)
    
    --想让id作为primary key create trigger tr on tab1 for insert as begin if exists( select id from tab1 group by id having(COUNT(*)>1)) rollback end insert into tab1 values(2,'bb');

    Thanks,
    Amy Peng

    Description: Description: TechNet 论坛好帮手立刻免费下载TechNet论坛好帮手

    2012年11月21日 3:16
    版主
  • 不晓得我有没有会错你的意思,你可以试试看用DML Trigger在INSERT的时候判断是否要Rollback INSERT的动作,例如下列的脚本:

    use Northwind
    go
    
    if OBJECT_ID('dbo.tri_rollback') is not null
    	drop trigger dbo.tri_rollback
    go
    
    create trigger dbo.tri_rollback
    on dbo.Region
    after insert
    as
    begin
    	--若INSERT的RegionID大於5,則Rollback
    	if (select count(*) from inserted where RegionID > 5) > 0
    	rollback
    
    end
    go
    
    --RegionID小於5所以可以正常INSERT
    insert into Region(RegionID,RegionDescription) values (5,'111')
    
    select *
    from Region
    
    insert into Region(RegionID,RegionDescription) values (6,'222')
    /*
    訊息 3609,層級 16,狀態 1,行 1
    交易在觸發程序中結束。已中止批次。
    */
    


    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年11月23日 3:12

全部回复

  • 语句判段错误

    没看明白, 这个判断错误是指什么?

    2012年11月20日 8:50
  • 触发器只会在成功地变更了表数据(变更前或变更后) 才会触发, 如果因为其他错误根本就没有达到触发条件的话, 触发器是不工作的

    所以必须要明确你的判断错误是否影响到触发, 如果影响到触发, 那么这个功能就不可能在触发器中去实现

    2012年11月20日 8:52
  • 关注一下

    给我写信: QQ我:点击这里给我发消息

    2012年11月20日 12:39
  • 使用前置触发器 如:

    CREATE TRIGGER TriggerName on TableName
    INSTEAD OF INSERT
    AS
    BEGIN
    
      if true 
      INSERT INTO TableName
           SELECT *
           FROM inserted
    END
    GO


    Microsoft



    2012年11月20日 13:40

  • 如何用代码实现

    插入语句时如果该语句判段错误,触发器中止执行该语句

    Hi ,

    假如我现在不想使用primary key,但我想利用触发器来实现这个功能,可以参照以下的代码:

    create table tab(id int, name varchar(20))
    insert into tab values(1,'aa')
    insert into tab values(2,'bb');
    
    select id from tab1 group by id having(COUNT(*)>1)
    
    --想让id作为primary key create trigger tr on tab1 for insert as begin if exists( select id from tab1 group by id having(COUNT(*)>1)) rollback end insert into tab1 values(2,'bb');

    Thanks,
    Amy Peng

    Description: Description: TechNet 论坛好帮手立刻免费下载TechNet论坛好帮手

    2012年11月21日 3:16
    版主
  • 不晓得我有没有会错你的意思,你可以试试看用DML Trigger在INSERT的时候判断是否要Rollback INSERT的动作,例如下列的脚本:

    use Northwind
    go
    
    if OBJECT_ID('dbo.tri_rollback') is not null
    	drop trigger dbo.tri_rollback
    go
    
    create trigger dbo.tri_rollback
    on dbo.Region
    after insert
    as
    begin
    	--若INSERT的RegionID大於5,則Rollback
    	if (select count(*) from inserted where RegionID > 5) > 0
    	rollback
    
    end
    go
    
    --RegionID小於5所以可以正常INSERT
    insert into Region(RegionID,RegionDescription) values (5,'111')
    
    select *
    from Region
    
    insert into Region(RegionID,RegionDescription) values (6,'222')
    /*
    訊息 3609,層級 16,狀態 1,行 1
    交易在觸發程序中結束。已中止批次。
    */
    


    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年11月23日 3:12