【问题标题】:how to create table dynamically through procedure from another schema如何通过来自另一个模式的过程动态创建表
【发布时间】:2019-12-20 06:29:53
【问题描述】:

我需要通过另一个模式的过程动态创建表。 这是详细信息..

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 以外的任何表。

请就此提出建议。

从 user2 我可以执行 p1,但是当我从 user3 尝试这个时,我得到了权限不足的错误。

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.

【问题讨论】:

  • 您确定过程 P1 正在执行且用户 2(过程的所有者)没有错误吗?
  • @Tejash 是的,我可以从 user2 执行 P1,并且在 user1 上创建表。

标签: oracle plsql database-administration


【解决方案1】:

缺少链接是特权

 grant create any table to user2;

没有它你观察

 ORA-01031: insufficient privileges

完整设置

1) 将 create any table 授予 user2 -- 由 DBA 完成

2) 在user2 中创建过程

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

3) 将executeon x 授予USER3

 grant execute on x to USER3;

4) USER3 运行程序

begin 
  user2.x;
end;
/

另见here - 简单的CREATE TABLE 权限不足以在其他模式中创建表。

另请注意,此权限必须直接授予用户(即不是通过角色)才能在过程中使用。

替代品

正如评论中所指出的,更安全的替代方法是将过程从 user2 移动到 user1,即过程和要创建的表将位于同一架构中。

在这种情况下,只有execute 过程的特权必须授予USER3

【讨论】:

  • 授予 CREATE ANY 可能是一个安全漏洞。在我看来,答案应该包含重新考虑替代方案的评论(例如:在另一个用户模式中创建并向原始用户提供授权)。此外,在谈论授权、角色和过程时,提及调用者权限条款(使用当前用户授权的可能性)可能很有用。
  • @igr 考虑了安全提示调用者权限很重要,但在这种情况下不相关。
猜你喜欢
  • 1970-01-01
  • 2015-08-02
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多