实现Oracle数据库中不同用户下的表之间的更新联动操作。
今天,老师突然让我写一个触发器,实现在admin用户下的admin表进行更新操作时,files用户下的files表同时进行相应操作。
检查权限问题
由于我是对不同用户下的两个表进行操作,所以我先查看了权限的问题。
// 查询当前用户拥有的对象权限;
SELECT * FROM USER_TAB_PRIVS;
使用这个语句可以看到对表是否有更新的的权限。
赋予权限
因为我这个用户没有这个权限,所以我到file用户下对admin赋予了增删改的权限。
// 赋予用户增删改的权力;
GRANT DELETE ON FILES.FILES TO ADMIN;
GRANT UPDATE ON FILES.FILES TO ADMIN;
GRANT INSERT ON FILES.FILES TO ADMIN;
生成触发器
因为触发器的语句太多了,所以我分着写了三个触发器,分别实现增删改的功能。
// update时的触发器;
CREATE OR REPLACE TRIGGER admin_update
BEFORE UPDATE ON admin.admin
FOR EACH ROW
BEGIN
UPDATE files.files
set ID =TO_CHAR(:NEW.ID),
LID=TO_CHAR(:NEW.LID),
TYPE='treetype' ||:NEW.TYPE,
NAME=:NEW.NAME,
CREATE_TIME=:NEW.CREATE_TIME,
UPDATE_TIME=:NEW.UPDATE_TIME where ID=TO_CHAR(:OLD.ID);
END;
// delete时的触发器;
CREATE OR REPLACE TRIGGER admin_delete
BEFORE DELETE ON admin.admin
FOR EACH ROW
BEGIN
DELETE FROM files.files WHERE ID =:OLD.ID;
END;
// insert时的触发器;
CREATE OR REPLACE TRIGGER admin_insert
AFTER INSERT ON admin.admin
FOR EACH ROW
BEGIN
INSERT INTO files.files(ID, LID,TYPE,NAME,CREATE_TIME,UPDATE_TIME)
VALUES(:NEW.ID, :NEW.LID,'treetype' ||:NEW.TYPEID,:NEW.NAME,:NEW.CREATE_TIME,:NEW.UPDATE_TIME);
END;
主要注意三点:
1、Oracle的:OLD和:NEW,这个可以自行百度;
2、数据拼接形式:常量||变量,拼接符号为||
.;
3、最为重要的一点是要注意两个表中的字段类型是否一致,若是不一致会报错误;
测试
主要是通过对admin数据库中的admin数据表执行插入、更新、删除操作时,files数据库中的files 表有没有实现联动的插入、更新、删除操作。