我有一个系统,系统内有两个表,采用adoquery连接,两个表为主从表a,b 表a,b内
用一个相同的字段联系,a表内有一个触发器,当程序删除a表的数据时,删除b表内相关的数据,可是执行是报错,错误:无法定位记录,记录在最后读取后改变,或更新影响过多行,用odbc 连接则没有问题,sql server 查询分析器内执行也没有问题
触发器代码:
create triiger trii1 on a
as
declare @bneno varchar(10)
  select @bneno=bneno
  from a
  delete from b
  where bneno=@bneno
go

解决方案 »

  1.   

    经过实验,我发现,如果用adoquery.delete 时出错,但是只要在触发器内delete from 语句之前加上print 返回任何信息就不报错,执行正常,如果用adoquery 的sql 属性直接编写delete 语句删除a 表内的数据则不用加print 执行正常,
      

  2.   

    一,你可以设外键而不需写触发器
    二,如果确实有写的话:
    1.你的触发器出错是那句select 引起的而导致Delete出错.
    2.你可以这样写:
    你可以A表中定义一个删除型触发器,
    create triiger trii1 on a for delete
    as
    declare @bneno varchar(10)
      select @bneno=bneno
      from deleted
      delete from b
      where bneno=@bneno
      

  3.   

    完全同意 nxfbccu() 
    解决问题就是要找到简洁而高效的办法
    触发器用多了,加重数据库系统的负荷,不太好,注意我不是说不用,要到用的时候:)
      

  4.   

    非常抱歉,由于疏忽,提问的时候,触发器代码写错了,我的是和nxfbccu() 写的触发器相同,但是还是出错,由于用ODBC 连数据库时不存在这个问题,而且用sql语言写也没有问题,我在sql查询分析器上执行过,也可以,就是ado出错,不管是用事物提交还是即时提交,都有错。所以想和大家讨论一下,希望大家踊跃发言啊
      

  5.   

    我现在也遇到这个问题,用ADO就出错,但用DBE就没问题,如果去掉触发器ADO就不出错,这是不是ADO的BUG。欢迎继续讨论。
      

  6.   

    可以利用deleted表:
    create triiger trii1 on a for delete
    as
    declare @bneno varchar(10)
      select @bneno=bneno
      from deleted
      delete from b
      where bneno=@bneno
      

  7.   

    试试这个。Create Trigger _trg1 on [A] for delete
    as
    Delete from B 
      From B Inner Join Deleted on deleted.bneno = B.bneno
    GO用你的做法不管是用ADO还是用ODBC,删除超过一行时就会有问题!
      

  8.   

    同样如上面的哥们所说,使用Sql2000的极联删除外键是最好的选择。