繁体   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