Oracle:基于角色更改架构

Oracle:基于角色更改架构,oracle,triggers,schema,Oracle,Triggers,Schema,有一个例子描述了如何设置触发器以在登录时更改模式。有没有办法检查用户的角色,看它是否匹配特定的角色,而不是用户名本身 我试图在when子句中对子查询user_role_privs,但它不允许这样做。想法 更新 这就是我根据Yahia建议的解决方案所使用的。但它似乎不起作用。当我使用角色用户登录时,它仍然无法识别前面没有架构名称的表 CREATE OR REPLACE TRIGGER db_logon AFTER logon ON DATABASE DECLARE v_count NUMB

有一个例子描述了如何设置触发器以在登录时更改模式。有没有办法检查用户的角色,看它是否匹配特定的角色,而不是用户名本身

我试图在when子句中对子查询user_role_privs,但它不允许这样做。想法

更新

这就是我根据Yahia建议的解决方案所使用的。但它似乎不起作用。当我使用角色用户登录时,它仍然无法识别前面没有架构名称的表

CREATE OR REPLACE TRIGGER db_logon
AFTER logon ON DATABASE
DECLARE
    v_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO v_count FROM user_role_privs WHERE granted_role = 'USER_ROLE' and username <> 'DEFAULT_SCHEMA';
    IF v_count > 0 THEN
        execute immediate 'ALTER SESSION SET CURRENT_SCHEMA = DEFAULT_SCHEMA';
    END IF;
END;
创建或替换触发器db\u登录
登录数据库后
声明
v_计数编号;
开始
从user_role_privs中选择COUNT(*)进入v_COUNT,其中授予的_role='user_role'和用户名'DEFAULT_SCHEMA';
如果v_计数>0,则
立即执行“ALTER SESSION SET CURRENT_SCHEMA=DEFAULT_SCHEMA”;
如果结束;
结束;

是-放弃WHEN部分,在触发器内动态生成SQL字符串:

CREATE OR REPLACE TRIGGER db_logon
AFTER logon ON DATABASE 
使用
USER\u ROLE\u PRIVS
上的
选择
,并将所需内容从
角色
映射到
架构


然后为
executeimmediate
构建一个SQL字符串,包括映射的
SCHEMA

,一旦你说出来,它就显得非常明显。不过,我在让它工作时遇到了一个问题。用我正在使用的更新post。当我删除if语句并总是将其强制到模式时,它就会起作用。但看不出if语句有什么问题。当我以用户身份运行select计数时,它返回1。出于某种原因,我从where子句中删除了用户名和“DEFAULT_SCHEMA”后,它就开始工作了,即使整个查询在以用户身份登录时也可以工作。考虑到它是固定的。谢谢