2011-09-30 85 views
3

this post,它描述了在登录时设置触发器以更改架构。有没有办法检查用户的角色,看它是否与特定角色而不是用户名本身相匹配?Oracle:根据角色更改架构

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

UPDATE

这是我使用的每叶海亚的建议的解决方案是什么。它似乎并没有工作。当我与具有角色的用户一起登录时,它仍然无法识别没有之前的模式名称的表。

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; 

回答

3

是 - 沟WHEN部分,并建立动态的触发器内SQL字符串:

CREATE OR REPLACE TRIGGER db_logon 
AFTER logon ON DATABASE 

使用SELECT上无论你从ROLESCHEMAUSER_ROLE_PRIVS和地图。

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

+0

一旦你说出来,这似乎很愚蠢明显。我有一个问题让它工作。使用我正在使用的内容更新帖子。 – MacAnthony

+0

它在我删除if语句并且只是始终将其强制到模式时起作用。不过,看不清if语句有什么问题。当我作为用户运行时,select count返回1。 – MacAnthony

+0

出于某种原因,即使整个查询在以用户身份登录时工作,但我从where子句中删除了AND用户名<>'DEFAULT_SCHEMA'后,便得到了工作。考虑到它是固定的。谢谢 – MacAnthony