Sql 插入到dblink表中的触发器

Sql 插入到dblink表中的触发器,sql,triggers,oracle10g,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; E

我试图做一个触发器,将值选择到一些表中,然后将它们插入到另一个表中

所以,现在我明白了。有很多列,所以我不复制它们,它只是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的新线

我知道这不是很清楚,但我不知道如何用另一种方式来解释。
如何解决此问题?,

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


到目前为止,您介绍的只是用于插入触发器。如果您想看到更新操作完成,请尝试添加
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.

由于您要通过数据库链接插入到删除表中,因此:

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

提交时,您正在将触发器执行的本地插入和远程插入作为一个原子单元提交。如果没有另一个,您无法提交其中一个,并且您不必执行任何额外操作来提交远程更改:

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

如果您在提交后看不到远程数据库中插入的数据,则在提交后其他内容已将其删除,或者更可能是您查看的数据库不正确

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


如果通过查询
t\u ag可以看到提交后的数据_ab@dblink_dev
从您运行过程的同一个数据库,但您无法看到当从您希望指向的数据库本地查询时,链接是否没有指向您认为的位置。插入将指向一个数据库,并且您正在执行qu但是,只有您可以决定哪一个是“正确的”数据库;或者重新定义链接(或者TNS条目,如果合适),或更改执行查询的位置。

我错过了重要部分:oracle 10g。添加标记。以下指南适用于PostgreSQL数据库,该数据库使用PL/pgSQL语法进行数据库查询等。PL/pgSQL与oracle的PL/SQL语法非常相似;因此您可能会发现该链接很有用:您不会在远程表中看到条目(或任何表格)从另一个会话到事务提交,但是您应该能够从同一个事务中看到它。您是说您希望远程表的插入在提交之前在其他地方可见-这将使它保持不变,即使事务随后回滚?除了一些日志记录情况外,这是一个奇怪的要求不,这不是问题所在。问题是,当触发器完成时,我看不到表中的新行。请清楚地说,我在存储过程中进行插入,并且在插入之后(因此在触发器之后),我正在做一个
提交工作
,但什么也没有做。事实上,我必须在
提交工作
,我必须做得更像是在数据库链接上提交。您的
提交工作
将提交本地表和远程表中的数据。如果事务结束后本地数据可见,但远程数据不可见,则会发生其他情况ening-有人正在删除它,或者您正在另一个事务中查看远程数据的预插入版本(它是否出现过?)。或者您的链接没有插入到您认为是的远程数据库中;您正在查询
t\u ag吗_ab@dblink_dev
或从其他数据库中查询,并且您是否检查了数据库链接定义以及(如果相关)正在使用的
tnsnames.ora
已经创建的DBLINK在数据库上对我造成了错误。我插入了一个旧数据库,而DBLINK没有被更改。
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.