DM8通过触发器实现用户建表自动为其他用户授予对象权限

发布时间 2023-10-20 17:25:31作者: 万物皆可rua

需求

业务用户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用户创建的TESTxxxxxx的表将被自动赋权给B用户。

处理思路参考了该博文:
https://www.cnblogs.com/lvcha001/p/11088611.html