需求
业务用户A会周期性的创建临时表,这部分临时表又有需要被其他用户B访问的需求。
手动授权仅能将授权时存在的表进行授权,我们尝试通过触发器实现。
处理方法
-- 前提1:DDL_TV_TRIGGER = 1(默认0,静态参数,添加后需要重启数据库)
-- 前提2:SP_INIT_DBMS_SCHEDULER_SYS(1);
/* SYSDBA创建触发器 */
create or replace trigger TR_GRANT_NEWTABLE after CREATE ON DATABASE
DECLARE
v_owner varchar(100);
v_object_type varchar(100);
v_table_name varchar(100);
v_grant_sql varchar(300);
begin
v_owner = DM_DICT_OBJ_OWNER;
v_object_type = DM_DICT_OBJ_TYPE;
v_table_name = DM_DICT_OBJ_NAME;
IF (v_owner = 'A' and v_object_type = 'TABLE' and v_table_name like 'TEST%') THEN
v_grant_sql = 'grant select on ' || v_owner || '.' || v_table_name || ' TO B';
/* 通过创建立即完成的JOB来绕过触发器内直接赋权带来的死锁问题,该作业自动执行,自动删除(参数见系统包使用手册) */
DBMS_SCHEDULER.CREATE_JOB (
'job_grant_newtable',
'PLSQL_BLOCK',
'begin execute immediate '''||v_grant_sql||'''; end;',
0,
NULL,
NULL,
NULL,
'DEFAULT_JOB_CLASS',
TRUE,
TRUE,
NULL,
NULL,
NULL);
END IF;
end;
-- 此时A用户创建的TEST开头的表将被自动赋权给B用户select权限。
处理思路参考了该博文:
https://www.cnblogs.com/lvcha001/p/11088611.html