我在一个表里面写了个添加、修改、删除的触发器
然后我在delphi程序里面调用数据集的post或delete的时候
就一直出现什么健列信息不足导致什么什么失败
但事实上不管是post还是delete都有真正反应到库里面
请问这是什么问题
多谢

解决方案 »

  1.   

    触发器代码贴出来。
    在触发器代码AS后加一行
    SET NOCOUNT ON
      

  2.   

    可能表中沒有主鍵,並且有完全相同的兩條紀錄,當想把其中一條刪除的時候,就會出錯。我都碰到好幾次這樣的情況了,解決辦法:先加入一個自動編號的ID字段,然後刪除一條,再把ID字段刪掉。
      

  3.   

    --创建触发器Trigger_NowDuty    
    CREATE TRIGGER Trigger_NowDuty
    ON Sal_HumanInfo_AdminOrClanDuty
    FOR INSERT, UPDATE, DELETE
    AS  
    declare @Table1 table (Fld1 nvarchar(25) not null , Fld2 nvarchar(100) not null primary key (Fld1,Fld2)) 
    declare @t_temp table (Fld1 nvarchar(25) not null , Fld2 nvarchar(100) not null primary key (Fld1,Fld2)) 
    insert into @Table1
    select num,DutyName from Sal_HumanInfo_AdminOrClanDuty  where IfCurrently = '是'
    union select a.num,b.name from Sal_HumanInfo_ProfessionalDuty a join code_posttitle b on a.EngageDutyName=b.code where a.IfCurrently='是'
    union select num,TitleName from Sal_HumanInfo_NationProfessionTitle where IfCurrently = '是'
    DECLARE @c_Fld  nvarchar(25),
            @c_Fld1 nvarchar(25),
        @c_Fld2 nvarchar(100)
    DECLARE first_cursor CURSOR FOR 
    SELECT distinct Fld1 FROM @Table1 ORDER BY Fld1
    OPEN first_cursor
    FETCH first_cursor INTO @c_Fld
    WHILE @@FETCH_STATUS = 0
    BEGIN   
       DECLARE second_cursor CURSOR FOR 
       SELECT Fld1, Fld2  FROM @Table1  WHERE Fld1 = @c_Fld    
       OPEN second_cursor
       FETCH second_cursor INTO @c_Fld1 , @c_Fld2
       SELECT @c_Fld1 = @c_Fld 
       WHILE @@FETCH_STATUS = 0
       BEGIN
            IF  NOT EXISTS(SELECT 1 FROM @t_temp WHERE Fld1 = @c_Fld)         
               BEGIN
                 INSERT INTO @t_temp(Fld1 , Fld2)
                 VALUES( @c_Fld1 , @c_Fld2 )
               END ELSE
               BEGIN
                 UPDATE @t_temp SET Fld2=Fld2 + ',' + @c_Fld2
                 WHERE  Fld1 = @c_Fld1
               END
               FETCH second_cursor INTO  @c_Fld1 , @c_Fld2
               SELECT @c_Fld1 = @c_Fld 
       END
       CLOSE second_cursor
       DEALLOCATE second_cursor  
       FETCH first_cursor INTO @c_Fld   
    END
    CLOSE first_cursor
    DEALLOCATE first_cursor
    UPDATE Sal_HumanInfo
    SET NowDuty = (SELECT Fld2 FROM @t_temp WHERE Fld1 = Num)--
      

  4.   

    看一下我的帖子,希望能帮到你:)
    http://expert.csdn.net/Expert/topic/2265/2265390.xml?temp=.9610102
      

  5.   

    http://expert.csdn.net/Expert/topic/2265/2265390.xml?temp=.4950067
      

  6.   

    我的帖子,希望能帮到你蚂蚁的

    你在MMC中删除或更新时,因为它要去找能确定你要删除或更新的记录的条件,就象
    delect table where aa=xx and bb=YY
    但是这个条件在表中有两条记录,所以系统认为你的条件不充分,所以它不知道应该把两条中的哪一条删除,所以出现上面的提示。
    TRY:
    select * into #temp from table where ........  --条件选出那两条
    delete table where.......insert into table 
       select top1 * from #temp
      

  7.   

    to 雨子,
    我那个肯定是触发器的问题
    在没有建立触发器之前都是正确的
    建立之后在delphi里面就不能对他进行添加修改删除了
    问题是具体出在什么地方
      

  8.   

    以前遇到过,原因我到现在也不太清楚,在PB,VB中都没有问题,只是在Delhpi中有错误提示,我的解决方法是:
    把触发器分为三个,分别处理for insert,for delete,for update的情况
      

  9.   

    to hhytsoft(雨中独行) 
    分成三个还是不行
    请各位通道继续赐教
      

  10.   

    如果暂时还玩不转触发器,那就不要纠缠不休了。利用TTable中的AfterXXXX、BeforeXXXX等事件不也同样搞掂吗?理论上比数据库中的触发器运行效率要低,但也有优点,那就是所有的处理完全是可控的。楼主你给出的触发器确实不怎么样,建议还是别浪费时间,先把应用程序做出来,有时间再研究触发器。不瞒你说,俺从认识、理解触发器原理、概念及特性,到首次在数据库设计中用到触发器,前后大概近两年时间,这期间跨越四个项目。原因很简单,一个不完备的触发器必然会带来诸多麻烦,而利用Delphi提供的强大的功能,可以轻松实现预期目标。
    当然,更有可能我本愚笨,否则也会在第一个项目中硬着头皮充分利用触发器。至于现在,无所谓用和不用,看哪个更快。
      

  11.   

    to cnsuyong(小可) 
    其实我从来没有用过触发器
    也很不赞成用触发器
    但现在我们做了个接收覆盖的功能
    捕捉不到After和Before等事件
    所以才要用触发器