Oracle模式用户无法在过程中创建表

时间:2018-05-25 06:08:30

标签: oracle plsql create-table

我正在尝试在过程中创建一个临时表:

\"

如果我将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; 块复制到SQL工作表,一切正常。所以我认为用户有权创建临时表。如果我从同一个SQL工作表中执行该过程,我得到

BEGIN.._END

第16行(Zeile 16)指向创建临时表的EXECUTE IMMEDIATE语句。

对我来说,这看起来用户在sql工作表中没有相同的权限,当它执行一个过程时,该过程也在它自己的模式中。

1 个答案:

答案 0 :(得分:3)

您当前问题的答案是,您获得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