在 PL SQL 游标中查询 DBA_TABLES 和 USER_TABLES
Query DBA_TABLES and USER_TABLES in PL SQL cursor
我在 PLSQL 过程中有一个游标,从 DBA_TABLES
到 select 和 USER_TABLES
。
CURSOR c1 IS
SELECT DISTINCT(DB.TABLE_NAME) FROM DBA_TABLES DB, USER_TABLES UT WHERE DB.TABLE_NAME = UT.TABLE_NAME AND DB.IOT_TYPE IS NOT NULL;
BEGIN
OPEN c1;
FETCH c1 INTO IOT_TABLE;
CLOSE c1;
但是程序报错
"ORA-00942 Table or View does not exist"
执行中。
用户必须对该视图具有 SELECT 权限。
要检查用户是否具有针对此视图的 SELECT 权限,请以此用户身份登录并 运行 以下查询:
select * from user_tab_privs WHERE table_name = 'DBA_TABLES';
如果此查询 returns none,则用户无权查看该视图。
为了将此权限授予该用户,请以 SYS 或 SYSTEM 身份登录,然后发出:
GRANT select ON DBA_TABLES TO username;
在此之后,用户应该会看到如下所示的结果,并且可以访问该视图:
select table_name, privilege from user_tab_privs WHERE table_name = 'DBA_TABLES';
TABLE_NAME PRIVILEGE
---------- ---------
DBA_TABLES SELECT
如果您只需要 DBA_TABLES,请按照 krokodilko 的回答中的步骤进行操作。如果您需要查询多个数据字典对象,则 SELECT ANY DICTIONARY
权限是另一种选择。它授予 select 访问 DBA 视图的权限(包括 DBA_TABLES)。以 SYSTEM 身份登录并 运行:
grant select any dictionary to your-username;
SELECT ANY DICTIONARY 权限允许用户查询 SYS 模式中的任何数据字典对象,但以下对象除外:DEFAULT_PWD$、ENC$、LINK$、 USER$、USER_HISTORY$ 和 XS$VERIFIERS。
顺便说一句,问题中的 c1 游标可能不需要访问 DBA_TABLES。以下查询应产生相同的结果:
CURSOR c1 IS
SELECT TABLE_NAME FROM USER_TABLES WHERE IOT_TYPE IS NOT NULL;
我在 PLSQL 过程中有一个游标,从 DBA_TABLES
到 select 和 USER_TABLES
。
CURSOR c1 IS
SELECT DISTINCT(DB.TABLE_NAME) FROM DBA_TABLES DB, USER_TABLES UT WHERE DB.TABLE_NAME = UT.TABLE_NAME AND DB.IOT_TYPE IS NOT NULL;
BEGIN
OPEN c1;
FETCH c1 INTO IOT_TABLE;
CLOSE c1;
但是程序报错
"ORA-00942 Table or View does not exist"
执行中。
用户必须对该视图具有 SELECT 权限。
要检查用户是否具有针对此视图的 SELECT 权限,请以此用户身份登录并 运行 以下查询:
select * from user_tab_privs WHERE table_name = 'DBA_TABLES';
如果此查询 returns none,则用户无权查看该视图。
为了将此权限授予该用户,请以 SYS 或 SYSTEM 身份登录,然后发出:
GRANT select ON DBA_TABLES TO username;
在此之后,用户应该会看到如下所示的结果,并且可以访问该视图:
select table_name, privilege from user_tab_privs WHERE table_name = 'DBA_TABLES';
TABLE_NAME PRIVILEGE
---------- ---------
DBA_TABLES SELECT
如果您只需要 DBA_TABLES,请按照 krokodilko 的回答中的步骤进行操作。如果您需要查询多个数据字典对象,则 SELECT ANY DICTIONARY
权限是另一种选择。它授予 select 访问 DBA 视图的权限(包括 DBA_TABLES)。以 SYSTEM 身份登录并 运行:
grant select any dictionary to your-username;
SELECT ANY DICTIONARY 权限允许用户查询 SYS 模式中的任何数据字典对象,但以下对象除外:DEFAULT_PWD$、ENC$、LINK$、 USER$、USER_HISTORY$ 和 XS$VERIFIERS。
顺便说一句,问题中的 c1 游标可能不需要访问 DBA_TABLES。以下查询应产生相同的结果:
CURSOR c1 IS
SELECT TABLE_NAME FROM USER_TABLES WHERE IOT_TYPE IS NOT NULL;