Oracle

授予在另一個架構上創建具有標識列的表的權限

  • April 17, 2020

我有一個使用者負責在自己的模式之外的其他模式上部署 DDL。

該使用者可以在這些模式上創建一個表,它還可以在這些模式上創建序列。

但是當我嘗試在這些模式上創建一個帶有 GENERATED IDENTITY 列的表時,

使用者會遇到一個ORA-01031: privileges insuffisants

當這個使用者在自己的模式上嘗試相同的創建表時,他可以正確地做到這一點。

該使用者被授予以下權限:

GRANT CREATE ANY SEQUENCE TO ddl_role;
GRANT CREATE ANY TABLE TO ddl_role;

這是執行的查詢範例:

CREATE TABLE "sch1"."tab1"
  (        "col1" NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE)
TABLESPACE "sch1_data";

以下查詢有效:

CREATE TABLE "sch1"."tab1"
   (        "col1" NUMBER )
TABLESPACE "sch1_data";

CREATE SEQUENCE "sch1"."seq1";

參考:

https ://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1

為了使用該GENERATED BY...機制創建表,您還需要SELECT ANY SEQUENCE特權,除了CREATE ANY SEQUENCE.

我不知道為什麼會這樣,因為您可以創建一個獨立的序列。我懷疑這與建立表和序列之間的連結有關。

這是一個例子:

SQL> connect pg_test/pg_test@graphdb
Connected.

SQL> select privilege from user_sys_privs;

PRIVILEGE
-------------------------------------------------------------------------------
CREATE ANY TABLE
CREATE SESSION
CREATE ANY SEQUENCE
SELECT ANY SEQUENCE
ALTER SESSION

5 rows selected.

SQL> create table scott.t1 (i number GENERATED BY DEFAULT ON NULL AS IDENTITY);
Table created.

在另一個模式中:

SQL> connect scott/tiger@graphdb
Connected.

SQL> select * from cat;

TABLE_NAME                     TABLE_TYPE
------------------------------ ---------------------------------
...
T1                             TABLE
ISEQ$$_81682                   SEQUENCE

50 rows selected.

如果我撤銷SELECT ANY SEQUENCE使用者的權限,pg_test則表創建將失敗。

引用自:https://dba.stackexchange.com/questions/265186