postgresql跨库触发器问题

ianoshen 2009-09-10 04:27:08
CREATE TABLE emp (
empname text NOT NULL,
salary integer
);

CREATE TABLE emp_audit(
operation char(1) NOT NULL,
stamp timestamp NOT NULL,
userid text NOT NULL,
empname text NOT NULL,
salary integer
);

CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
--
-- 在 emp_audit 里创建一行,反映对 emp 的操作,
-- 使用特殊变量 TG_OP 获取操作类型。
--
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL; -- 忽略结果,因为它是个 AFTER 触发器
END;
$emp_audit$ language plpgsql;

CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit()
;

上面是手册中的介绍,放在同一个数据库中能够实现触发。现在需要想把表emp放在test1库中,把emp_audit放在test2库中
请教:能不能实现跨库同步触发,在test1中对emp的增删即时对test2库的emp_audit中进行修改,这个在触发中应该做什么修改
...全文
392 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
是可以的,但由于进行了跨库操作,所以要用DBLink,参考操作和如下:

SELECT dblink_exec('dbname=test1 user=xxx password=yyy'::text, 'select * from test2.emp_audit')
trainee 2009-09-13
  • 打赏
  • 举报
回复
postgresql的一个连接只能是一个数据库,这和mysql有区别
如果要跨库操作,必须安装其附加模块的dblink模块,比较麻烦

但postgresql有schema概念,相当于 子数据库
所以设计数据库的时候,如果库间操作频繁,尽量用schema代替数据库
nianzhang747 2009-09-10
  • 打赏
  • 举报
回复
看看关于触发器应用部分

一个库一个触发器?
vinsonshen 2009-09-10
  • 打赏
  • 举报
回复
2个库在同一个库应该可以吧

-->
2个库在同一个服务器应该可以吧
vinsonshen 2009-09-10
  • 打赏
  • 举报
回复
2个库在同一个库应该可以吧,前提你确认可以跨库形式访问表,如:
select * from test1.test1

select * from test2.emp_audit

如果能这样访问表,那你的需求就可以实现了

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧