各位大哥,我总算能编译通过了,不过还是出现了几个问题,:)1.我编译通过后,进行删除,增加,修改的时候,总是出现一些提示信息:比如键列信息不足或不正确,更新影响到多行;当前的数据信息可能已经在最后一次查询前已经修改;等等,但是它还是可以添加成功和删除成功的,不过老是出现这个提示信息,气死我了;我的数据库每个表都有触发器;2.如何写这样一个触发器:当一个表中删除一个数据,如何把另外一个表中书名相同的数据也同时删除?

解决方案 »

  1.   

    1: 设置主键 前更新方式设为依关键字  后台的触发器中不要更新自身数据  如果还不行将Refresh换成Close + Open + Locate2:
    Create Trigger tri_srctable_del on SrcTable
     For Delete
    AS
      Delete destTable from deleted d,destTable b where d.BookID=b.BookID
      

  2.   

    为什么做那么多触发器,在没有把握之前,最好少用触发器。
    CREATE TRIGGER [TRIGGER NAME] ON [table1] 
    FOR DELETE 
    AS
    begin
      delete from table2 where bookname in (select bookname from deleted)
    end
      

  3.   

    我的每个表都有一个主键的呀,我用的是DBnavigator来进行删除,增加,修改的啊,所以没有办法去把编号字段作为条件呢。
      

  4.   

    不知道你是用什么组建来处理数据的
    用query进行数据更新的前提是你的SQL语句不能出现 distinct,group by,order by,子查询等等,把把query1的requestlive属性设为true了吗?
      

  5.   

    我用的是Adotable来连接数据的,但是没有用它来处理数据
      

  6.   

    果然是触发器的问题,我删除了触发器就没有事了(怎么关闭呢?:))那怎么写这两个个触发器呢?
    1.当我在a表插入或者修改数据后,把相应的数据插入到b表2.当在a表插入或者修改数据后,a表中的2列减去1列,得到的数据插入3列。
      

  7.   

    0:怎么关闭呢?:))
    1)最简单的方法,在触发器的前面加上 return语句,就可以了
    2)使用以下脚本
    禁用: alter table 表名 disable trigger 触发器名
    启用: alter table 表名 enable trigger 触发器名我喜欢用第一种
    1.当我在a表插入或者修改数据后,把相应的数据插入到b表
    ps:不管是插入还是修改,对b表,你都现删除再插入,而不要对b修改2.当在a表插入或者修改数据后,a表中的2列减去1列,得到的数据插入3列。
    ps:这个你在a表建了主键应该不会有问题,你最好更新的时候用你的编号字段定位比较好。
      

  8.   

    TO: xhh_88(三友)
    谢谢了,但是对你说的触发器写法有点不懂,
    1.where语句应该怎么写呢?
    2.where应该怎么定位?TO:qizhanfeng(glacier) 
    请原谅我刚学呀,我不懂你说的呢。 
      

  9.   

    1.
    /* 当插入或者修改数据后,将数据插入到表Allbook */
    Create trigger TIUA_Publishbook ON Publishbook 
    after insert,update 
    ASDECLARE @Count int
        SELECT @Count = COUNT(*) FROM INSERTED -- Check if any rows were deleted. If so, delete from the dependent table
        IF @Count  > 0        Begin             Delete Allbook
            End    Begin 
          Insert into "Allbook"("BookID","Book_Name","Worksheet","Send_Com","Send_Need","End_Date")
       Select P.BookID,P.Book_Name,P.Worksheet,P.Send_Com,P.Send_Amount,P.End_Date
        From  Publishbook P
                --  Where  P.Book_Name=Allbook.Book_Name AND P.Send_Com=Allbook.Send_Com
                  
    End    -- If anything went wrong, roll the transaction back
        IF @@ERROR != 0
    ROLLBACK TRAN
    GO2.怎么设置计数字段呢,:),谢谢了,我在线等你呢
      

  10.   

    同意三友的,我以前也遇到过:
    0:怎么关闭呢?:))
    1)最简单的方法,在触发器的前面加上 return语句,就可以了
    2)使用以下脚本
    禁用: alter table 表名 disable trigger 触发器名
    启用: alter table 表名 enable trigger 触发器名我喜欢用第一种
    1.当我在a表插入或者修改数据后,把相应的数据插入到b表
    ps:不管是插入还是修改,对b表,你都现删除再插入,而不要对b修改2.当在a表插入或者修改数据后,a表中的2列减去1列,得到的数据插入3列。
    ps:这个你在a表建了主键应该不会有问题,你最好更新的时候用你的编号字段定位比较好。
      

  11.   

    Create trigger TIUA_Publishbook ON Publishbook 
    for insert,update,delete  
    AS
    delete from Allbook 
    where BookID in (select BookID from INSERTED )Insert into Allbook(BookID,Book_Name,Worksheet,Send_Com,Send_Need,End_Date)
       Select distinct P.BookID,P.Book_Name,P.Worksheet,P.Send_Com,P.Send_Amount,P.End_Date
        From  Publishbook P
    WHERE p.BookID in (select BookID from INSERTED )GO
      

  12.   

    下面是一个建表脚本,其中的fc就是计算字段create table ta(fa int default 0 ,fb int default 0 ,fc as (fa-fb) )
      

  13.   

    谢谢,谢谢。我看有Deleted,inserted表,那么有没有Updated表呢,呵呵,其实也挺有用的,要选择update前的数据时也可以用到,你说对吗?
      

  14.   

    你理解错了!Deleted 指修改前的数据记录inserted 是指修改后的的数据记录
    例如:表结构如下
    create table ta(fa int default 0 ,fb int default 0 ,fc as (fa-fb) )
    1:当执行
    insert ta(fa,fb) values(2,3)
    这时:Deleted为空记录,inserted 为 (2,3)
    2:当执行
    update ta  set fa=4 where fa=2
    这时:Deleted (2,3),inserted 为 (4,3)
    3:当执行
    delete ta  where fa=4
    这时:Deleted (4,3),inserted 为空记录所以怎么会有Updated阿,而是,不论你是增加,修改,删除,触发器中都会存在Deleted,inserted两个数据集,只有时它是空记录。
      

  15.   

    哦,呵呵,原来是这样,你好厉害呀,你在哪里学的呢?有什么窍门没有呢?对了,你帮我修改的那个触发器有点问题:
    可以修改,修改后的数据可以插入到Allbook;
    可删除,但是只对PublishBook有效,对Allbook无效,还出现错误信息:
    无法为更新定位行。一些值可能已在最后一次读取后已更改。
    可增加,数据对两个表都有效,但是会出现错误信息:
    无法为更新定位行。一些值可能已在最后一次读取后已更改。
      

  16.   

    Create trigger TIUA_Publishbook ON Publishbook 
    for insert,update,delete  
    AS
    delete from Allbook 
    where BookID in (select BookID from Deleted) --这里需要改一下Insert into Allbook(BookID,Book_Name,Worksheet,Send_Com,Send_Need,End_Date)
       Select distinct P.BookID,P.Book_Name,P.Worksheet,P.Send_Com,P.Send_Amount,P.End_Date
        From  Publishbook P
    WHERE p.BookID in (select BookID from INSERTED )GO
      

  17.   

    还有,你也给Allbook 表建一个主键.
         如果还保错,那你就要在修改表Publishbook 的时候,关闭表Allbook ,等修改完之后再打开Allbook 表。
      

  18.   

    我给bookid也设置了一个主键的了,但是还不行呢,增加的时候还是会报错,但是还是会把数据添加进去的,怎么回事呢?删除的没有问题了,谢谢,:)请问你是工作了吗?
      

  19.   

    那你还是考虑我这句话看看:
    如果还保错,那你就要在修改表Publishbook 的时候,关闭表Allbook ,等修改完之后再打开Allbook 表。
    -----工作了!
      

  20.   

    我是说在程序中不要连Allbook 表,或将连Allbook 的数据库控件的active:=false;
      

  21.   

    就没有办法在数据库中关闭吗?或者应该是数据库出的问题吧,在程序中只是一个查询操作呢,我不知道应该在哪里修改,让Allbook在Publishbook修改时关闭,修改完后打开,不懂呢
      

  22.   

    将与Allbook表关联的Adotable控件的active 属性设为false 不会阿!
      

  23.   

    还是一样出错呢,而且本来Adotable的Active就是False的呀,我把Dataset也设为False了,但是还是出错,怎么回事呢?
      

  24.   

    而且本来Adotable的Active就是False的呀
    -----那肯定在程序代码中有置它为真的语句了。
    --要不你将Allbook表除了书号以外你再加给自增的编号字段.