DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 19137911446
今日帖子: 5
在线用户: 24
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 13:23:12
标题:
怎样用触发器保持两表间相同字段内容的一致性 浏览:2245
加入我的收藏
楼主: 我写了以下触发器,欲想保持EMP_InActiveServiceEmpFile表和Bas_Dept表字段
DeptName的一致性,即当修改Bas_Dept表的DeptName字段内容时,检测表EMP_InActiveServiceEmpFile中的字段DeptName是否有相同的内容,如果有就修改之,使其保持一致性,但修改Bas_dept表的字段DeptName时就报错(注:两表只有DeptName字段内容有联系)
CREATE TRIGGER UpdateDeptID
ON BAS_Dept
FOR update
AS
UPDATE EMP_InActiveServiceEmpFile  SET DeptName=(SELECT  DeptName FROM 
Bas_Dept  b WHERE EMP_InActiveServiceEmpFile.DeptName=b.DeptName) 

----------------------------------------------
-
作者:
男 bryan (bao) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 15:13:05
1楼: MSSQL 的触发器会产生相关的inserted和deleted临时表,
保存你修改过的新旧记录,你这一例用inserted表处理就可以了,
试试下面这个,如果还有错,就用查询分析器修改一次,看看什么提示,
如果在字段DeptName定义了外键,修改就要注意次序.

CREATE TRIGGER UpdateDeptID ON BAS_Dept
FOR update
AS
 If Update(DeptName) begin 
    UPDATE  A set A.DeptName=B.DeptName 
       from EMP_InActiveServiceEmpFile A ,inserted B  
         Where A.DeptName=B.DeptName
 End
Return
----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 15:26:13
2楼: EMP_InActiveServiceEmpFile 表的 DeptName 字段没有改变
----------------------------------------------
-
作者:
男 bryan (bao) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 15:28:38
3楼: Sorry,错了,应该用Deleted表,因为inserted表中已经是新值了.

CREATE TRIGGER UpdateDeptID ON BAS_Dept
FOR update
AS
  If Update(DeptName) begin    
     UPDATE  A set A.DeptName=B.DeptName 
       from EMP_InActiveServiceEmpFile A ,Deleted B  
         Where A.DeptName=B.DeptName
  End
Return 

----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 15:38:03
3楼: 现在可以了,谢谢 bryan (bao)的帮助
----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 15:44:20
4楼: 我刚才删除了Where A.DeptName=B.DeptName还以为真的可以
可是问题又来了
当我修改BAS_Dept表的deptname字段时,EMP_InActiveServiceEmpFile 表的deptname字段所有数据都改变了
----------------------------------------------
-
作者:
男 bryan (bao) ★☆☆☆☆ -
盒子活跃会员
2004/1/3 15:51:31
5楼: Where A.DeptName=B.DeptName是两个表关连的条件,不可以删除啊!
你用3楼的代码不行吗?
----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/5 9:09:42
6楼: 在查询分析器里update表BAS_Dept时是看到有影响两行的信息,当查看
EMP_InActiveServiceEmpFile 表时结果却没有更新
----------------------------------------------
-
作者:
男 bryan (bao) ★☆☆☆☆ -
盒子活跃会员
2004/1/5 9:23:55
7楼: 这就要调试触发器了,在if语句中加个print,看看有没有进入,
如果进入了再用select语句将两个表Join后的结果显示在查询分析器中,
如果没有记录说明BAS_Dept和EMP_InActiveServiceEmpFile没有相同的deptname,
或者两个表字段deptname定义的不一致.

CREATE TRIGGER UpdateDeptID ON BAS_Dept
FOR update
AS
  Set nocount off   
  If Update(DeptName) begin    
     print 'Enter'
     select a.*  from EMP_InActiveServiceEmpFile A ,Deleted B  
         Where A.DeptName=B.DeptName
     /*UPDATE  A set A.DeptName=B.DeptName 
       from EMP_InActiveServiceEmpFile A ,Deleted B  
         Where A.DeptName=B.DeptName*/
  End
Return 


----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/5 9:32:13
8楼: 已经调试过了,还是不行,我把触发器改了,也不行
CREATE TRIGGER UpdateDeptID 
ON BAS_Dept
--WITH  ENCRYPTION       --加密觸發器
FOR UPDATE
AS
IF UPDATE(DeptName) BEGIN
   UPDATE  EMP_InActiveServiceEmpFile SET DeptName=B.DeptName 
   FROM Deleted B
   WHERE EMP_InActiveServiceEmpFile.DeptName=B.DeptName
END
RETURN
----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/5 9:55:06
9楼: 终于修改好了
----------------------------------------------
-
作者:
男 oupj (oupj) ★☆☆☆☆ -
盒子活跃会员
2004/1/5 9:56:48
10楼: 谢谢bryan (bao)的大力帮助
----------------------------------------------
-
作者:
男 ymzlx (sheep) ★☆☆☆☆ -
普通会员
2004/2/22 0:19:59
11楼: 麻烦oupj (oupj)把改好的源码贴出来看一下好吗?多谢了。文字

----------------------------------------------
爱就没商量
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行72.26563毫秒 RSS