加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长百科 > 正文

Oracle数据库中表触发的多模式权限

发布时间:2021-01-01 22:46:24 所属栏目:站长百科 来源:网络整理
导读:我正在尝试编写一个表触发器,用于查询触发器所在架构之外的另一个表.这可能吗?在我的架构中查询表似乎没有问题,但我得到: Error: ORA-00942: table or view does not exist 尝试查询我的架构外的表时. 编辑 我很抱歉第一次没有提供尽可能多的信息.我的印象

我正在尝试编写一个表触发器,用于查询触发器所在架构之外的另一个表.这可能吗?在我的架构中查询表似乎没有问题,但我得到:

Error: ORA-00942: table or view does not exist

尝试查询我的架构外的表时.

编辑

我很抱歉第一次没有提供尽可能多的信息.我的印象是这个问题更简单.

我正在尝试在表上创建一个触发器,该表根据某些数据的存在来更改新插入的行上的某些字段,这些数据可能存在于另一个模式中的表中,也可能不存在.

我用来创建触发器的用户帐户确实具有独立运行查询的权限.事实上,我有触发器打印我正在尝试运行的查询,并且能够成功运行它.

我还应该注意,我正在使用EXECUTE IMMEDIATE语句动态构建查询.这是一个例子:

CREATE OR REPLACE TRIGGER MAIN_SCHEMA.EVENTS
BEFORE INSERT
ON MAIN_SCHEMA.EVENTS REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE 
    rtn_count NUMBER := 0;
    table_name VARCHAR2(17) := :NEW.SOME_FIELD;
    key_field VARCHAR2(20) := :NEW.ANOTHER_FIELD;
BEGIN
    CASE
        WHEN (key_field = 'condition_a') THEN
            EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_A.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count;
        WHEN (key_field = 'condition_b') THEN
            EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_B.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count;
        WHEN (key_field = 'condition_c') THEN
            EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_C.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count;
    END CASE;

    IF (rtn_count > 0) THEN
        -- change some fields that are to be inserted
    END IF; 
END;

使用前面提到的错误,触发器在EXECUTE IMMEDIATE上接收失败.

编辑

我做了更多的研究,我可以提供更多的澄清.

我用来创建此触发器的用户帐户不是MAIN_SCHEMA或OTHER_SCHEMA_X中的任何一个.我正在使用的帐户(ME)通过架构用户自己获得所涉及表的权限.例如(USER_TAB_PRIVS):

GRANTOR        GRANTEE TABLE_SCHEMA    TABLE_NAME PRIVILEGE GRANTABLE HIERARCHY
MAIN_SCHEMA    ME       MAIN_SCHEMA    EVENTS     DELETE    NO        NO
MAIN_SCHEMA    ME       MAIN_SCHEMA    EVENTS     INSERT    NO        NO
MAIN_SCHEMA    ME       MAIN_SCHEMA    EVENTS     SELECT    NO        NO
MAIN_SCHEMA    ME       MAIN_SCHEMA    EVENTS     UPDATE    NO        NO
OTHER_SCHEMA_X ME       OTHER_SCHEMA_X TARGET_TBL SELECT    NO          NO

我有以下系统权限(USER_SYS_PRIVS):

USERNAME   PRIVILEGE            ADMIN_OPTION
ME         ALTER ANY TRIGGER    NO
ME         CREATE ANY TRIGGER   NO
ME         UNLIMITED TABLESPACE NO

这就是我在Oracle文档中找到的内容:

To create a trigger in another user’s
schema,or to reference a table in
another schema from a trigger in your
schema,you must have the CREATE ANY
TRIGGER system privilege. With this
privilege,the trigger can be created
in any schema and can be associated
with any user’s table. In addition,
the user creating the trigger must
also have EXECUTE privilege on the
referenced procedures,functions,or
packages.

这里:Oracle Doc

因此,在我看来这应该可行,但我不确定它在文档中提到的“EXECUTE特权”.

解决方法

您应该为涉及的每个表和模式执行此操作:

grant select on OTHER_SCHEMA_%.table_name to MAIN_SCHEMA;

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读