4 回答

TA貢獻1752條經(jīng)驗 獲得超4個贊
1、把這個函數(shù)的訪問權(quán)限付給其它用戶。grant execute on 函數(shù)名 to 其它用戶。
其它用戶調(diào)用函數(shù)時,前面要加上創(chuàng)建用戶名 如:a創(chuàng)建函數(shù) getFunction 。 b調(diào)用的時候為a.getFunction.
2、可以把函數(shù)建成全局函數(shù)。

TA貢獻1815條經(jīng)驗 獲得超13個贊
同一個包,在相同的用戶下的匿名程序塊中可以執(zhí)行,但是在存儲過程中卻沒有權(quán)限執(zhí)行,查了下資料,一些DBMS_開頭的pkg在pl/sql中用到的時候,需要顯示的執(zhí)行
grant execute on dbms_xxxx to xxx 來賦下權(quán)限才可以。此外這個授權(quán)system用戶是沒有權(quán)限的,要sys 或者plsql / as dba登錄才有權(quán)限授權(quán)。
授權(quán)以后可以看到:
SYSTEM@RACTEST> select grantee,owner,table_name,grantor,privilege from dba_tab_privs where table_name like 'DBMS_LOCK';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE
-------------------- ---------- ---------- ---------- ----------
EXECUTE_CATALOG_ROLE SYS DBMS_LOCK SYS EXECUTE
DMSYS SYS DBMS_LOCK SYS EXECUTE
CTXSYS SYS DBMS_LOCK SYS EXECUTE
EXFSYS SYS DBMS_LOCK SYS EXECUTE
MDSYS SYS DBMS_LOCK SYS EXECUTE
OLAPSYS SYS DBMS_LOCK SYS EXECUTE
SYSMAN SYS DBMS_LOCK SYS EXECUTE
ETL SYS DBMS_LOCK SYS EXECUTE
8 rows selected.
然后再次執(zhí)行:
SYSTEM@RACTEST> CREATE OR REPLACE PROCEDURE etl.pliutest
2 authid current_user
3 AS
4 BEGIN
5 DBMS_LOCK.sleep(1);
6 END;
7 /
Procedure created.
OK了!

TA貢獻1783條經(jīng)驗 獲得超4個贊
這是oracle的an quan 機制,在存儲過程或者函數(shù)中調(diào)用其他用戶下的過程、表、函數(shù)等 一定要顯式fu quan才可以,利用角色fu quan是不可以的。
因此:
為什么我在B用戶下查詢A用戶的表,用sql語句可以直接查
===這個是角色fu quan導致的,比如B用戶有數(shù)據(jù)庫管理員角色
添加回答
舉報