Oracle 在触发器内使用字典表时输出不正确
我正在使用Oracle 在触发器内使用字典表时输出不正确,oracle,oracle11g,triggers,Oracle,Oracle11g,Triggers,我正在使用ALL_TABLES/ALL_TAB_COLUMNS获取我的模式(EDW\u SRC)和另一个模式(EDW\u STG)中的表数。在sql developer中运行查询时,我得到了正确的计数,如下所示。但是,如果我将相同的查询放在触发器中,我会得到其他模式的错误计数(EDW\u STG) 请参阅以下代码: (这只是一个复制问题的示例代码,而不是我的业务需求。我在实际代码中引用ALL_TAB_COLUMNS,以获取不同架构中特定表中的列数,我有权选择访问这些列。) 不同的架构计数应为10
ALL_TABLES/ALL_TAB_COLUMNS
获取我的模式(EDW\u SRC
)和另一个模式(EDW\u STG
)中的表数。在sql developer中运行查询时,我得到了正确的计数,如下所示。但是,如果我将相同的查询放在触发器中,我会得到其他模式的错误计数(EDW\u STG
)
请参阅以下代码:
(这只是一个复制问题的示例代码,而不是我的业务需求。我在实际代码中引用ALL_TAB_COLUMNS
,以获取不同架构中特定表中的列数,我有权选择访问这些列。)
不同的架构计数应为101。为什么是2
Oracle版本:
Oracle数据库11g企业版11.2.0.4.0版-64位生产
谢谢
K您确定在同一数据库的连接中运行
触发器和查询吗?您对EDW\u STG
模式中的对象的访问权限是通过角色授予的吗?@KaushikNayak是的,我在同一数据库连接中运行它。@AlexPoole是的,访问权限是通过角色授予的。@Kapil-然后,这解释了发生的事情。在触发器中,您看不到来自角色的访问的表。在执行set role none
之后,尝试运行独立计数,您将看到相同的结果。
select user from dual;
USER
-----
EDW_SRC
DROP TABLE ABC;
Table ABC dropped.
CREATE TABLE ABC(ID NUMBER);
Table ABC created.
select count(1) EDW_STG_CNT
from all_tables
where owner='EDW_STG';--Different Schema
EDW_STG_CNT
----------
101
select count(1) EDW_SRC_CNT
from all_tables
where owner='EDW_SRC';--My Schema
EDW_SRC_CNT
------------
1554
create or replace trigger trig_test_dml_abc
before insert on abc
DECLARE
V_STG_CNT number :=NULL;
V_SRC_CNT number :=NULL;
begin
DBMS_OUTPUT.PUT_LINE('***** TRIGGER OUTPUT *****');
select count(1) into V_SRC_CNT from all_tables
where owner='EDW_SRC'; --My Schema
DBMS_OUTPUT.PUT_LINE('My Schema EDW_SRC_CNT :'||V_SRC_CNT);
select count(1) into V_STG_CNT from all_tables
where owner='EDW_STG'; --Different Schema
DBMS_OUTPUT.PUT_LINE('Different Schema EDW_STG_CNT :'||V_STG_CNT);
end;
Trigger TRIG_TEST_DML_ABC compiled
INSERT INTO ABC VALUES (2);
1 row inserted.
***** TRIGGER OUTPUT *****
My Schema EDW_SRC_CNT :1554
Different Schema EDW_STG_CNT :2