触发插入dblink表

时间:2014-07-04 15:06:34

标签: sql triggers oracle10g

我正在尝试触发,在某些表中选择值,然后将它们插入另一个表中。

所以,现在我得到了这个。有很多列,所以我不复制它们,它只是varchar2值,这部分有用,所以我认为它没用:

   create or replace 
TRIGGER TRIGGER_FICHE 
AFTER INSERT ON T_AG 

BEGIN
  declare 
  begin


INSERT INTO t_ag_hab@DBLINK_DEV
()
values
();

/*commit;*/
end;
END;

将调用触发器的存储过程(同样是许多参数,与复制它们无关:

INSERT INTO T_AG()
       VALUES
                  ();


commit work;

问题是,我们不能做出触发器,我读了它,并理解它。

但是,如何使用新值查看我的表的更新?

当进程运行时,也没有错误,但我没有看到t_ag_hab的新行。

我知道它不是很清楚,但我不知道如何以其他方式解释它。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

因为您通过数据库链接插入删除表,所以您有a distributed transaction

  

...分布式事务处理更复杂,因为数据库必须将事务中的更改提交或回滚作为原子单元进行协调。整个事务必须提交或回滚。

提交时,您将触发器执行的本地插入和远程插入作为原子单元提交。你不能在没有另一个的情况下提交一个,并且你不需要做任何额外的事情来提交远程更改:

  

两阶段提交机制对发布分布式事务的用户是透明的。实际上,用户甚至不需要知道事务是分布式的。表示事务结束的COMMIT语句会自动触发两阶段提交机制。在数据库应用程序的主体中包含分布式事务不需要编码或复杂的语句语法。

如果之后无法从远程数据库中看到插入的数据,那么在提交后其他内容已将其删除,或者更有可能是您正在查看错误的数据库。

数据库链接的一个轻微缺点(虽然也是一个特性)是它隐藏了工作完成的细节。您可以删除并重新创建链接,以使代码更新为不同的目标数据库,而无需修改代码本身。但这意味着您的代码不知道插入的实际位置 - 您需要检查数据字典以查看链接指向的位置。即便如此,您可能也不知道链接可以使用TNS别名来标识数据库,并且在数据库中看不到对tnsnames.ora的更改。

如果您通过从同一个数据库查询t_ag_ab@dblink_dev来查看提交后的数据,那么您运行了您的程序,但是您无法看到当您从数据库本地查询到您希望指向的数据时,那么链接没有指向您认为的位置。插入将转到一个数据库,您正在针对另一个数据库执行查询。只有你可以决定哪个是'正确的'数据库;并重新定义链接(或TNS条目,如果适用),或更改您正在进行查询的位置。

答案 1 :(得分:0)

我无法清楚地理解你的要求。用于更新主表中的记录并在审计表中插入旧记录。我们可以使用以下查询作为触发器。(MS-SQL)

Create trigger trg_update ON T_AGENT
AFTER UPDATE AS 
BEGIN

UPDATE Tab1
SET COL1 = I.COL1, COL2=I.COL2
FROM INSERTED I INNER JOIN Tab1 ON I.COL3=Tab1.Col3

INSERT Tab1_Audit(COL1,COL2,COL3)
SELECT Tab1 FROM DELETED

RETURN;
END;

答案 2 :(得分:0)

到目前为止,您提供的内容仅适用于Inserting触发器。如果您想看到更新操作已完成,请尝试添加此示例中的Update

SQL> CREATE OR REPLACE TRIGGER validate_update
  2  AFTER INSERT OR UPDATE ON T_AGENT
  3  FOR EACH ROW
  4  BEGIN
  5    IF UPDATING('ACCOUNT_ID') THEN     -- do something like this when updating
  6      DBMS_OUTPUT.put_line ('ERROR');  -- add your action here
  7    ELSIF INSERTING THEN
  8      INSERT INTO t_ag_hab@DBLINK_DEV() values();
  9    END IF;
  10  END;
  11  /

  Trigger created.