我正在嘗試創建一個包,我在其中使用 CTAS 查詢洗掉并創建一個表。該表需要經常重繪 ,并且始終從基礎資料中添加/洗掉列。由于表的結構不斷變化,因此每次重繪 都更新合并/更新查詢以考慮新/缺失列會非常麻煩。目前,我有執行簡單洗掉和創建的外部腳本,但我需要將其集中在資料庫中;因此我正在嘗試創建一個包來做到這一點;但是,我在特權方面遇到了麻煩。
作為概念證明,以下代碼在作為匿名塊運行時有效:
create table my_test_table as select * from dual; --create test table
declare
v_count int;
begin
select count(*) into v_count from all_tab_columns where table_name = upper('my_test_table');
if v_count >= 1 then
execute immediate 'drop table my_test_table';
end if;
execute immediate q'[
create table my_test_table as
select * from dual
]';
end;
select * from my_test_table; -- shows expected results
但是當創建一個包來做同樣的事情時;
CREATE OR REPLACE PACKAGE test_pkg AS
PROCEDURE test_procedure;
END test_pkg;
CREATE OR REPLACE package body test_pkg as
procedure test_procedure
is
v_count int;
begin
select count(*) into v_count from all_tab_columns where table_name = upper('my_test_table');
if v_count >= 1 then
execute immediate 'drop table my_test_table';
end if;
execute immediate q'[
create table my_test_table as
select * from dual
]';
end test_procedure;
end test_pkg;
/
并使用以下代碼進行測驗:
create table my_test_table as select * from dual; --make sure table exists
execute TEST_PKG.TEST_PROCEDURE; --results in errors
select * from my_test_table; --table does not exist; therefore, DROP statement works but not CREATE
我收到以下錯誤(關于執行 TEST_PKG.TEST_PROCEDURE):
ORA-01031: insufficient privileges
ORA-06512: at test_pkg, line 15
在執行包后測驗測驗表是否存在時,我可以看到它不再存在。這意味著 DROP 陳述句正在作業,但 CREATE TABLE 陳述句導致權限不足錯誤。
深入了解我需要從包中創建表所需的權限將非常有幫助。
uj5u.com熱心網友回復:
僅當您具有“創建表”或“創建任何表”權限但直接授予用戶(由角色授予不起作用)時,才允許在程序中創建表。
https://docs.oracle.com/cd/B19306_01/network.102/b14266/authoriz.htm#i1008334
PL/SQL 塊和角色
PL/SQL 塊中角色的使用取決于它是匿名塊還是命名塊(存盤程序、函式或觸發器),以及它是以定義者權限還是呼叫者權限執行。
具有定義者權限的命名塊
在使用定義者權限執行的任何命名的 PL/SQL 塊(存盤程序、函式或觸發器)中,所有角色都被禁用。角色不用于權限檢查,您不能在定義者的權限程序中設定角色。
要檢查直接授予您的用戶的系統權限(而不是按角色/角色),您可以從您的用戶運行此查詢:
SELECT * FROM USER_SYS_PRIVS;
uj5u.com熱心網友回復:
AUTHID CURRENT_USER
在沒有條款的情況下,您創建的包是定義者的權限包。它只能做直接授予包定義者的權限允許的事情。“直接”是這里的關鍵點——通過啟用的角色授予的權限在包執行期間不被尊重。
您可能已經RESOURCE
為您的用戶啟用了或類似的角色,這可以解釋為什么您可以在測驗期間創建表,但不能通過您的包程序。
嘗試直接向您的用戶授予CREATE TABLE
和UNLIMITED TABLESPACE
系統權限,然后重新創建包。(如果可行,UNLIMITED TABLESPACE
請用資料庫中相應表空間的配額替換)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506862.html
標籤:sql 甲骨文 plsql oracle19c plsql 包