【问题标题】:Oracle: Change Schema based on roleOracle:根据角色更改架构
【发布时间】:2011-11-28 19:17:54
【问题描述】:

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

我尝试在 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;

【问题讨论】:

    标签: oracle triggers schema


    【解决方案1】:

    是的 - 放弃 WHEN 部分并在触发器内动态构建 SQL 字符串:

    CREATE OR REPLACE TRIGGER db_logon
    AFTER logon ON DATABASE 
    

    USER_ROLE_PRIVS 上使用SELECT 并将您想要的任何内容从ROLE 映射到SCHEMA

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

    【讨论】:

    • 一旦你说出来,这似乎很愚蠢。我在让它工作时遇到问题。用我正在使用的内容更新帖子。
    • 当我删除 if 语句并始终将其强制到架构时它可以工作。虽然看不出 if 语句有什么问题。当我以用户身份运行时,选择计数返回 1。
    • 出于某种原因,一旦我从 where 子句中删除了 AND 用户名 'DEFAULT_SCHEMA',我就让它工作了,即使整个查询在以用户身份登录时工作。考虑固定。谢谢
    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2023-02-10
    • 2015-07-26
    • 2015-12-07
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多