簡體   English   中英

如何通過另一個模式的過程動態創建表

[英]how to create table dynamically through procedure from another schema

我需要通過另一個模式的過程動態創建表。 這是詳細信息..

user1 -- table T1_YYYMM where YYYYMM= year,month e.g T1_201912 needs to be created on this schema.
user2 -- procedure X to create T1_YYYYMM is created on this schema.
user3 -- want to access the procedure X from user3 which should create the tables on user1.

user3 已被授予 p1 的執行權限,但我仍然獲得權限被拒絕。我無權訪問 user1 和 user2。我只能通過 user3 訪問。 我不應該能夠在 user1 上創建除 T1_YYYYMM 以外的任何表。

請就此提出建議。

從用戶 2 我可以執行 p1 但是當我從用戶 3 嘗試這個時,我得到了權限不足的錯誤。

grant create any table to user2 -- done 

create or replace PROCEDURE USER2.x (owner_name in varchar2 , 
                                 table_name in varchar2 
                                     ) authid current_user
is
  sql_string VARCHAR2(4000);
  l_owner varchar2(30) := 'USER1';
  l_tab varchar2(100)  := 'T1'; 
  l_month varchar2(30) := to_char(add_months(sysdate),'YYYYMM');
BEGIN
IF  l_owner=owner_name AND l_tab = table_name then
  sql_string := 'CREATE TABLE '||l_owner||'.'||l_tab||'_'||l_month||' AS SELECT * FROM USER1.T2 WHERE 1=2';
  EXECUTE IMMEDIATE sql_string;
   dbms_output.put_line('Table created :'||l_tab||'_'||l_month);

 EXECUTE IMMEDIATE 'GRANT DELETE, INSERT, SELECT, UPDATE ON '||l_tab||'_'||l_month||' TO V_ROLE  ';
ELSE 
  dbms_output.put_line('Permission Denied...');
END IF;
EXCEPTION 
  WHEN OTHERS  THEN 
   DBMS_OUTPUT.PUT_LINE (SQLERRM);
END X;
/


grant execute on x to USER3 ;--DONE

/

EXEC USER3.X('USER1','T1');

ORA-01031: insufficient privileges


PL/SQL procedure successfully completed.

缺少的鏈接是特權

 grant create any table to user2;

沒有它你觀察

 ORA-01031: insufficient privileges

完整設置

1) 向user2授予create any tableuser2 ——由 DBA 完成

2)在user2創建過程

create procedure x as
begin
  execute immediate 'create table user1.tab1 (x number)';
end;
/

3) 將在xexecute USER3授予USER3

 grant execute on x to USER3;

4) USER3運行程序

begin 
  user2.x;
end;
/

另請參見此處- 簡單的CREATE TABLE權限不足以在其他模式中創建表。

另請注意,此權限必須直接授予用戶(即不通過角色)才能在過程中使用。

備擇方案

正如評論中所指出的,更安全的替代方法是將過程從 user2 移動到 user1 ,即要創建的過程和表將在同一架構中。

在這種情況下,只能將過程的execute權限授予USER3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM