参考:https://www.cnblogs.com/lottu/p/13331387.html
目录
dblink是一个支持从数据库会话中连接到其他Kingbase数据库的插件。在其他数据库跨库操作也是采用dblink的方式。
1、安装dblink:
create extension dblink ;
2、创建dblink连接
select dblink_connect('base_dblink','hostaddr=127.0.0.1 port=54321 dbname=base user=base password=base');
3、查询dblink连接
select dblink_get_connections()
4、关闭dblink连接
SELECT dblink_disconnect('base_dblink');
5、跨库查询
使用dblink;我们更多是跨库查询操作;由于上面创建dblink_connect连接;所以我们可以拿来使用。
SELECT * FROM dblink('base_dblink', 'select id, info from public.t1') as base_t1(id int, info text);
id | info
------+-------
1001 | xxx
(1 row)
我们也可以直接使用;无需先创建dblink_connect。这是常用的方式。
SELECT * FROM dblink('host=192.168.1.2 port=6000 user=base password=base dbname=base', 'select id, info from public.t1') as base_t1(id int, info text);
id | info
------+-------
1001 | xxx
(1 row)
6、跨库执行ddl,dcl操作(dblink_exec)
若我们跨库操作create、insert、update、delete语句;其实这种行为一般不跨库操作。慎用!下面演示下insert操作。
SELECT dblink_exec('base_dblink', 'insert into public.t1 values (1002,''hello'')');
dblink_exec
-------------
INSERT 0 1
(1 row)
# OR
SELECT dblink('base_dblink', format('insert into public.t1 select %L, %L', 1003, 'lottu'));
dblink
----------------
("INSERT 0 1")
(1 row)
7、触发器执行ddl
CREATE OR REPLACE TRIGGER TR_USER_DEPARTMENT_DATA
after insert or update or delete
ON sfs_user_department
FOR EACH ROW
BEGIN
IF TG_OP = 'INSERT' THEN
dblink_exec('base_dblink', format('INSERT INTO sfs_user(USERID,USERNAME)
VALUES(%L, %L);,
:new.USERID, :new.USERNAME
));
ELSIF TG_OP = 'UPDATE' THEN
dblink_exec('base_dblink', format('UPDATE sfs_user set USERID=%L,USERNAME=%L
WHERE USERID=%L;',:new.USERID, :new.USERNAME, :old.USERID
));
ELSIF TG_OP = 'DELETE' THEN
dblink_exec('base_dblink', format('DELETE FROM sfs_user WHERE USERID=%L;', :old.USERID));
END IF;
END;