授予权限以在 oracle sql 过程中创建表

Posted

技术标签:

【中文标题】授予权限以在 oracle sql 过程中创建表【英文标题】:Grant privilege to create table INSIDE oracle sql procedure 【发布时间】:2018-12-03 17:21:10 【问题描述】:

我正在尝试在 oracle 的过程中创建一个表。但我不断得到 ORA-01031: 权限不足。我想也许我的用户需要特权才能这样做?

这是程序代码:

CREATE OR REPLACE PROCEDURE AjouterCol(TAB VARCHAR2, NOM VARCHAR2) IS 
REQ VARCHAR2(200);
RES VARCHAR2(200);
RES1 VARCHAR2(200);
NAME VARCHAR2(200);
BEGIN
  NAME:=TAB || '_' || NOM;

  RES:='CREATE TABLE '||NAME||' AS SELECT * FROM '|| TAB || ' WHERE Col9 = ''PARIS'' AND SOUNDEX(Col9) = SOUNDEX(''PARIS'')' ;
  EXECUTE IMMEDIATE RES;

  RES1:='ALTER TABLE '|| NAME ||' ADD MAGASIN VARCHAR2(5)';
  EXECUTE IMMEDIATE RES1;

  REQ:='UPDATE '|| NAME ||' SET MAGASIN = '''|| NOM ||''' WHERE MAGASIN IS NULL' ;
  EXECUTE IMMEDIATE REQ;

  END;
  /

有什么帮助吗?谢谢。

【问题讨论】:

嗯,你是数据库管理员吗?如果是这样,以具有必要权限的用户身份运行它?如果没有,请向 DBA 询问具有必要权限的用户?你已经有了答案;您需要具有必要权限的用户。那你的问题到底是什么? 我的问题是:用户需要哪些必要的权限(如果存在)才能执行创建表的过程。以前,我无法从我的用户创建视图,因此我以系统身份登录并使用以下命令将其授予我的用户:GRANT CREATE VIEW TO MyUser;在这种情况下有类似的事情吗? GRANT CREATE,ALTER,UPDATE ON TABLE/VIEW TO USER 权限不足的唯一解决方案 Can GRANT be used inside an Oracle Store Procedure?的可能重复 @HimanshuAhuja 哦不,我只是在问为什么我的程序一直返回错误并想知道赠款是否可以解决我的问题 【参考方案1】:

如果用户(执行该脚本)通过角色获得CREATE TABLE 权限,则它可以创建表。但是,这些权限在命名的 PL/SQL 过程中不起作用 - 您必须直接将该权限授予用户(即不通过角色)。

【讨论】:

有什么特权?一个标准的 GRANT CREATE、ALTER、UPDATE ON TABLE/VIEW TO USER ? @Littlefoot 正是 Pl/sql 不允许在过程和函数中使用授权语句,因为这些语句旨在操作/存储/返回作为 dml 操作(插入、更新、删除..)的数据另一边grant 与提供特权而不是操作而不是访问权限有关,因此在过程、函数中不起作用,而您应该直接使用授权作为单独的语句。 从 CREATE TABLE 开始(当你创建它时)。如有必要,继续使用您在该过程中使用的后续权限。不过,为什么要使用动态 SQL?你为什么不创建表正常?也许你不是把事情复杂化了吗?你可以做到这一点并不意味着你应该做到这一点。【参考方案2】:

谢谢大家的回答。我通过简单地将 AUTHID CURRENT_USER 添加到 proc 声明中解决了这个问题。再次感谢。

【讨论】:

以上是关于授予权限以在 oracle sql 过程中创建表的主要内容,如果未能解决你的问题,请参考以下文章

为了在模式中创建表,角色需要的完整权限列表是啥?

如何将现有用户的权限授予我在 Oracle 中创建的用户?谢谢

Oracle - 授予非 dba 用户权限以在另一个用户对象上创建授权

创建一个 MYSQL 存储过程以在不同的数据库中创建表

oracle中如何赋予该用户CONNECT、RESOURCE、DBA身份

oracle 创建用户授予权限问题