查看: 2253|回复: 8

如何在trigger中获得当前执行的SQL?

[复制链接]
论坛徽章:
0
发表于 2004-11-27 11:57 | 显示全部楼层 |阅读模式
我有两个数据库DB1、DB2。
两个数据库都有一个表叫test_table。
我想在DB1的test_table中进行增加、删除、修改时,要在DB2的test_table上执行相同的操作。我这样写感觉很麻烦,因为这样的表很多,几乎要把所有的字段都写出来。
create or replace trigger t_test_table
before insert or update or delete for each row......
if inserting then
    insert into test_table@DB2(.....)vales(:new............);
if updating then
    update test_table@db2 set ...=.... where ...= ld..... and .......
if deleting then
    delete test_table@DB2 where ........= ld........ and ...........

我能不能有其他的简便的方法实现这个,例如如果能在trigger中捕获到完整的在test_table上执行的语句,就好了。。。。。。

集思广益!谢谢!
论坛徽章:
8
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34会员2007贡献徽章
日期:2007-09-26 18:42:102011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32兰博基尼
日期:2014-01-31 14:56:26优秀写手
日期:2015-01-08 06:00:14优秀写手
日期:2015-02-12 06:00:15
发表于 2004-11-27 13:12 | 显示全部楼层
用复制功能就可以简单实现了

使用道具 举报

回复
论坛徽章:
63
版主7段
日期:2012-05-15 15:24:11itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-10 14:34:59马上加薪
日期:2015-01-08 15:39:192015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
发表于 2004-11-27 13:17 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2004-11-27 16:01 | 显示全部楼层
最初由 西门吹牛 发布
[B]用复制功能就可以简单实现了 [/B]


什么意思?什么复制功能?详细说说!

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2004-11-27 16:02 | 显示全部楼层
最初由 jlandzpa 发布
[B]http://www.*****.org/archive/index.php/t-1824.html [/B]


你这是什么地址啊?www.*****.org????

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
0
发表于 2004-11-27 18:38 | 显示全部楼层
SQL>create or replace trigger tri_test_t1
  2    after update on t1
  3  declare
  4    n        int;
  5    sql_text ora_name_list_t;
  6    stmt     VARCHAR2(2000);
  7  begin
  8    n:=ora_sql_txt(sql_text);
  9    FOR i IN 1 .. n LOOP
10      stmt := stmt || sql_text(i);
11    END LOOP;
12    dbms_output.put_line('>>>'||stmt);
13  end;
14  /

触发器已创建

已用时间:  00: 00: 00.00
SQL>update t1 set object_id=1 where 1=0;
>>>update t1 set object_id=1 where 1=0

已更新0行。

已用时间:  00: 00: 00.00

使用道具 举报

回复
论坛徽章:
0
发表于 2004-11-30 19:24 | 显示全部楼层
用快照是不是比这个好一些

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2004-12-1 16:12 | 显示全部楼层
最初由 gclizh 发布
[B]SQL>create or replace trigger tri_test_t1
  2    after update on t1
  3  declare
  4    n        int;
  5    sql_text ora_name_list_t;
  6    stmt     VARCHAR2(2000);
  7  begin
  8    n:=ora_sql_txt(sql_text);
  9    FOR i IN 1 .. n LOOP
10      stmt := stmt || sql_text(i);
11    END LOOP;
12    dbms_output.put_line('>>>'||stmt);
13  end;
14  /

触发器已创建

已用时间:  00: 00: 00.00
SQL>update t1 set object_id=1 where 1=0;
>>>update t1 set object_id=1 where 1=0

已更新0行。

已用时间:  00: 00: 00.00 [/B]




这招不错,但是有个问题?
如果操作的语句使用绑定变量,捕获的语句为:
insert into test(id ,name) values(:1,:2);
不是具体的值,有没有什么办法?

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2004-12-1 16:14 | 显示全部楼层
最初由 xingkong163 发布
[B]用快照是不是比这个好一些 [/B]


怎么用????

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表