DB2触发器,用于将记录插入/更新到不同的数据库中



我想在一个数据库的表上创建一个触发器,并将该记录添加到另一个数据库表中。让我们假设,我在第一个数据库中有一个表,它有5行2列。另一边我有一张桌子在另一边数据库,它有3行2列,其中另一个数据库的表的3行与第一个数据库的表格的3行完全相同。

我知道,如何在同一个数据库上触发Insert/Update表。但是如何触发表从一个数据库到另一个数据库呢?

下面是用于触发同一数据库中的表的代码。

database_1--->schema_1--->表_1

|col1  col2|
_____|_____
|1a   1b   |
|2a   2b   |
|3a   3b   |
|4a   4b   |
|5a   5b   |

database_2--->schema_2--->表_2

|col1  col2|
_____|_____
|1a   1b   |
|2a   2b   |
|3a   3b   |

CREATE OR REPLACE TRIGGER "SCHEMA_1"."TRG_table_1_AFTER_UPDATE" 
AFTER UPDATE ON "SCHEMA_1"."table_1"
REFERENCING NEW AS new_row
FOR EACH ROW
NOT SECURED

Insert into SCHEMA_2.TABLE_2(col1, col2, col3) 
VALUES (new_row.val1, new_row.val2, new_row.val3);
END

没有办法用触发器来实现。

更新另一个数据库中的表的方法是使用昵称
但是CREATE TRIGGER语句声明:

SQL过程语句
指定要作为触发操作一部分的SQL语句搜索的更新、搜索的删除、插入或合并操作不支持在复合SQL中使用昵称

一个过程,包含对搜索中昵称的引用UPDATE语句、搜索的DELETE语句或INSERT语句不支持(SQLSTATE 25000(。

您可以对启用2PC的联邦服务器使用一些过程逻辑,但不使用触发器
为联合事务启用两阶段提交

更新:
您应该首先熟悉Db2中的联邦概念
Db2->的关键技术主题;Db2联合是:
使联合服务器能够访问数据源(如果需要,请更新dbm-cfg参数并重新启动联合服务器实例(
配置远程Db2数据源信息:

在联合服务器上:

CREATE WRAPPER DRDA;
-- MYREMDB the alias of a cataloged remote database
CREATE SERVER MYSERVER
TYPE DB2/UDB 
VERSION '11.5' 
WRAPPER "DRDA"
AUTHORIZATION some_user PASSWORD "some_password"
OPTIONS
(
DBNAME  'MYREMDB'
, DB2_TWO_PHASE_COMMIT  'Y'
-- may be other options like:
, DB2_MAXIMAL_PUSHDOWN 'Y'
);
-- User mapping for some MY_LOCAL_USER
-- all work from MY_LOCAL_USER with remote tables will be with
-- this MY_REMOTE_USER account.
-- The corresponding GRANT statements must be run on
-- MY_LOCAL_USER locally and MY_REMOTE_USER remotely
-- to work with the corresponding tables
CREATE USER MAPPING FOR MY_LOCAL_USER
SERVER MYSERVER
OPTIONS
(
REMOTE_AUTHID  'my_remote_user'
, REMOTE_PASSWORD  'my_remote_password'
);
-- Create a nickname or use 3-part name directly in your statements
-- MYSERVER.MY_REMOTE_SCHEMA.MY_REMOTE_TABLE
CREATE NICKNAME MY_SCHEMA.MY_REMOTE_TABLE_NICKNAME
FOR MYSERVER.MY_REMOTE_SCHEMA.MY_REMOTE_TABLE;
-- Usage
-- Switch the autocommit off in your session
-- Both statements are either committed or rolled back successfully in their databases
-- because of 2PC option (DB2_TWO_PHASE_COMMIT) of the server MYSERVER
-- disregarding of what or where fails
INSERT INTO MY_LOCAL_TABLE ...;
INSERT INTO MY_SCHEMA.MY_REMOTE_TABLE_NICKNAME ...;
-- OR
-- INSERT INTO MYSERVER.MY_REMOTE_SCHEMA.MY_REMOTE_TABLE ...;
COMMIT;

最新更新