create table Depart
(
 Depart varchar(32) primary key 
)create table SubDepart
(
 Depart varchar(32),
 SubDepart varchar(32)
)Create Table Employee
(
  WorkNO varchar(18) primary key,
  WorkName varchar(8),
  depart varchar(32), 
  SubDepart varchar(32)
)goCreate trigger Depart_Update
on Depart
for update
as
begin
update SubDepart set Depart=(select Depart from inserted)
              where Depart=(Select Depart from Deleted)
update Employee set Depart=(select Depart from inserted)
              where Depart=(Select Depart from Deleted)
end
go
Create trigger SubDepart_Update
on SubDepart
for Update
as
begin
  if update(SubDepart) 
     begin
       update Employee set SubDepart=(select SubDepart from inserted)
              where Depart=(Select Depart from Deleted) and SubDepart=
              (select subDepart from deleted)
     end
end当我在DBGrid中更新Depart表时就会出现"键列信息不足或不正确,更新影响更多行!"
而在SQL企业管理器中做就不出问题,这是什么原因呀。是触发器的问题吗?

解决方案 »

  1.   

    表必须要有主键。不然如果两笔纪录一样的话Delphi就会保错。 Sql Server是不会保错了。
      

  2.   

    如果你只是需要屏蔽掉出错信息可以在Trigger里面加入:
    REATE TRIGGER  XXX
    FOR XX
    AS
    DECLARE
        @IntRowCount  Int,
    BEGIN
       SELECT @IntRowCount = @@RowCount
       SET NOCOUNT ON  --关闭
         --..........
          .............
       SET NOCOUNT OFF --恢复
    END如果你不想再Trigger里面更新多行,考虑更变表结构
      

  3.   

    代码不是这样写的
    set Depart=(select Depart from inserted)
      

  4.   

    加上:
    SET NOCOUNT ON 
    ...
    ... 
    ...
    ... 
    ...
    ...
    ... SET NOCOUNT OFF
      

  5.   

    你可能是在ORACLE里添加数据吧.若是就必须增加一个值永远不会重复的字段.
      

  6.   

    要不就是没有设置主键,要不就是你的语句有问题一个表没有主键的话,就无法定位记录,也就无法进行update,delete等操作还有,你的表设了主从表关系没有,如果有的话,检查一下从表是否有问题,从表有问题的话,也会导致你无法保存
      

  7.   

    我的错误跟楼主一样
    我的触发器代码如下
    CREATE TRIGGER [insertQXBMGN] ON [dbo].[QXBMGN] 
    FOR INSERT
    AS
      DECLARE
         @bmbh   varchar(30),
         @gnmc   varchar(30)
      select @bmbh=部门编号,@gnmc=功能名称 from inserted
      insert into QXBMAN(部门编号,窗体名,按钮名,按钮名称,是否可用)
      (select @bmbh,QXCTAN.窗体名,QXCTAN.按钮名,QXCTAN.按钮名称,0 from QXGNCT,QXCTAN where QXGNCT.功能名称=@gnmc and QXGNCT.窗体名=QXCTAN.窗体名)
    我添加是用缓存添加后提交代码如下:
    try
      UsPwoMainForm.QXBMGN.Connection.BeginTrans;
        showmessage('3443');
        UsPwoMainFORM.QXBMGN.UpdateBatch;
        showmessage('dsf');
        UsPwoMainForm.QXBMGN.Connection.CommitTrans;
        showmessage('设置权限成功!');
        close;
      except
        UsPwoMainForm.QXBMGN.Connection.RollbackTrans;
        showmessage('设置不成功,请重新设置!');
        UsPwoMainFORM.QXBMGN.CancelBatch;
      end;
    我的是什么原因