PUBLIC とはマニュアル上では 「特別なユーザー・グループ*1」と記載されている。
CREATE PUBLIC 〜 の場合にはキーワードとして覚える方が便利かもしれないが 「PUBLIC ロール」に権限を付与する GRANT .. TO PUBLIC などを含めると PUBLIC というユーザー・グループが管理していると思った方が理解しやすい。
実際、一部の開発ツールでは PUBLIC は ユーザー として閲覧できる。しかし PUBLIC は スキーマ を所有していない。
ただ、他のユーザーの スキーマ・オブジェクト のオブジェクト権限などを 全ユーザーに付与 という意味を含めて仮想的なユーザー?の位置付け(ユーザー・グループ)としては好都合な説明であると思う。
-- SYSで実行REVOKE EXECUTE ON UTL_SMTP FROM PUBLIC ;
REVOKE EXECUTE ON UTL_TCP FROM PUBLIC ;
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC ;
REVOKE EXECUTE ON UTL_FILE FROM PUBLIC ;
REVOKE EXECUTE ON DBMS_SQL FROM PUBLIC ;
REVOKE EXECUTE ON DBMS_RANDOM FROM PUBLIC ;
権限状態の確認 SQL
SELECT *
FROM
DBA_TAB_PRIVS
WHERE
PRIVILEGE = 'EXECUTE'
AND GRANTEE = 'PUBLIC'
AND TABLE_NAME IN(
'UTL_SMTP', 'UTL_TCP', 'UTL_HTTP',
'DBMS_SQL', 'DBMS_RANDOM'
) ;
-- ユーザー管理のシノニムSELECT *
FROM
USER_SYNONYMS
;
-- PUBLIC シノニムSELECT *
FROM
DBA_SYNONYMS
WHERE
OWNER = 'PUBLIC'
AND NOT TABLE_OWNER IN (
'SYS', 'SYSMAN', 'SYSTEM'
,'WMSYS', 'EXFSYS', 'ORDSYS'
,'MDSYS', 'XDB'
);