不應在調用程序的權限程序包中使用沒有架構的標識符。
在調用程序的權限或 AUTHID CURRENT_USER 程序包中,標識符是根據當前用戶的架構首先解析的。如果該代碼的定義程序未明確表明標識符所屬的架構,這可能會導致意外的行為。
例:下列代碼通過在權限表中查找用戶來檢查該用戶是否具有執行相應操作的權限。大多數用戶僅具有 SYS.PERMISSIONS 的讀取權限,且無法修改已定義的權限。
CREATE or REPLACE FUNCTION check_permissions(
p_name IN VARCHAR2, p_action IN VARCHAR2)
RETURN BOOLEAN
AUTHID CURRENT_USER
IS
r_count NUMBER;
perm BOOLEAN := FALSE;
BEGIN
SELECT count(*) INTO r_count FROM PERMISSIONS
WHERE name = p_name AND action = p_action;
IF r_count > 0 THEN
perm := TRUE;
END IF;
RETURN perm;
END check_permissions
check_permissions 函數的用戶在其架構中定義了一個 PERMISSIONS 表,則該數據庫會解析該標識符以引用本地表。該用戶將具有對新表的寫入權限,并可以對其進行修改以獲得在其他情況下不可能擁有的權限。
[1] Oracle Oracle Database PL/SQL Language Reference