Oracle 模式用户无法在过程中创建表
Posted
技术标签:
【中文标题】Oracle 模式用户无法在过程中创建表【英文标题】:Oracle schema user cannot create table in procedure 【发布时间】:2018-05-25 06:08:29 【问题描述】:我正在尝试在一个过程中创建一个临时表:
PROCEDURE pr_create_tmp_bp_table(fp_id NUMBER) IS
tbl_name CONSTANT VARCHAR2(20) := 'BP_TO_DELETE';
BEGIN
-- sanity checks removed for readablity
EXECUTE IMMEDIATE
'CREATE GLOBAL TEMPORARY TABLE ' || tbl_name || ' ' ||
'ON COMMIT PRESERVE ROWS AS ' ||
'SELECT * FROM infop_stammdaten.bp';
END;
如果我将 BEGIN.._END
块复制到 SQL 工作表,一切正常。所以我认为用户有权创建临时表。如果我从同一个 SQL 工作表中执行该过程,我会得到
Fehlerbericht -
ORA-01031: Nicht ausreichende Berechtigungen
ORA-06512: in "INFOP_STAMMDATEN.PA_DELETE_FP", Zeile 16
ORA-06512: in Zeile 6
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a database operation without
the necessary privileges.
*Action: Ask your database administrator or designated security
administrator to grant you the necessary privileges
第 16 行 (Zeile 16) 指向创建临时表的 EXECUTE IMMEDIATE 语句。
在我看来,用户在 sql 工作表中没有相同的权限,并且当它执行一个过程时,该过程也在它自己的架构中。
【问题讨论】:
您必须指定以下内容: 1. 您是否使用同一用户在同一数据库/容器上运行此程序? 2. 如果用户是相同的 - 你确定语句通过并执行(在工作表中)? 3. 我看到INFOP_STAMMDATEN.PA_DELETE_FP
的第16 行发生了错误- 是包含过程pr_create_tmp_bp_table
的包吗? 4.最重要的——你的用户有CRATE TABLE
权限吗?
【参考方案1】:
您的直接问题的答案是您得到ORA-01031: insufficient privileges
,因为您的用户具有通过角色授予的 CREATE TABLE 权限:Oracle 安全模型强制执行一个规则,即我们不能使用通过 PL/SQL 中的角色授予的权限.因此,您需要您的 DBA 直接向您的用户授予 CREATE TABLE 权限。
你呢?
因为您尝试做的事情在 Oracle 中没有意义。在 Oracle 中,全局临时表是永久结构;只是其中的数据是临时的。因此,正确的解决方案是使用普通的 DDL 脚本构建表一次,就像任何其他数据库对象一样。然后,您可以根据需要插入到全局临时表中。
您不是本网站上第一个犯此错误的人 (read this pertinent thread)。通常是因为人们来自另一个数据库,例如 SQL Server,它有一个名为“临时表”的结构,实际上与 Oracle 的全局临时表不同。如果这是您的场景,那么您将对 Oracle 18c 的新特性感兴趣,称为私有临时表。这些与 SQL Server 临时表完全类似。 Find out more.
【讨论】:
好的,我尝试GRANT CREATE TABLE TO INFOP_STAMMDATEN;
作为 shema 用户。不幸的是,我又收到了ORA-01031: insufficient privileges
。
您使用的用户没有 WITH GRANT 选项,因此不允许将其 CREATE TABLE 权限传递给其他用户。这就是为什么我建议您需要让 DBA 参与进来。
@BetaRide 我不确定您所说的 GRANT CREATE TABLE TO INFOP_STAMMDATEN 是什么意思;作为架构用户。 架构用户是INFOP_STAMMDATEN吗?如果您正在尝试这样做,您不能只授予自己系统权限。
我在截断另一个用户的表时遇到了同样的问题。我授予用户 DROP ANY TABLE 权限,但它解决了问题。我仍然没有足够的权限
@Amir - 截断属于另一个用户的表是一个不同的问题。我建议您提出一个新问题,尽可能提供详细信息。可能这个问题已经在这个网站上得到了回答,但是如果没有更多关于你想要达到的目标的信息,就很难说清楚。以上是关于Oracle 模式用户无法在过程中创建表的主要内容,如果未能解决你的问题,请参考以下文章