Oracle

未顯示 NOT NULL 約束衝突的列名

  • June 23, 2020

我正在使用一個 Oracle 19 DB,它通過使用 DB 使用者構造成多層。這是結構的簡化概述:

  • 使用者數據:有表XTEST和視圖TEST。視圖是使用CREATE VIEW TEST AS SELECT * FROM XTEST語句創建的,因此它包含表的所有列。
  • 使用者 APP:使用DATA.TEST所有 SQL 和 DML 的視圖。

APP 使用者對錶沒有任何授權DATA.XTEST,但對視圖有 SELECT、INSERT、UPDATE、DELETE 授權DATA.TEST

現在我的問題是:

如果違反了表上的 NOT NULL 約束DATA.XTEST,則錯誤消息不會顯示列名。錯誤消息的字面意思是:

ORA-01400: 無法將 NULL 插入 (???)

數據庫前段時間使用 Oracle 11,那時我們遇到了同樣的問題,但可以通過REFERENCES將表上的權限授予DATA.XTESTAPP 使用者來修復它(請參閱相關問題:授予權限以查看插入時違反空約束的列名意見)。但這在 Oracle 19 中不再起作用。

有誰知道如何在錯誤消息中獲取列名?

除了明顯的解決方案 ( ),您可以通過將SQL92_SECURITY設置為 來grant select on data.xtest to app;恢復舊行為。在11.2中,它的預設值是,但在19c中,它的預設值是.FALSE``FALSE``TRUE

alter system set sql92_security=false scope=spfile;

然後重啟數據庫,因為這個參數不能線上更改。

展示:

create table bp.test (c1 number not null);
create view bp.xtest as select * from bp.test;
create user u1 identified by u1;
grant create session to u1;
grant select, insert, update, delete on bp.xtest to u1;
grant references on bp.test to u1;

SQL> show parameter sql92

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sql92_security                       boolean     TRUE
SQL>

SQL> conn u1/u1
Connected.

SQL> insert into bp.xtest values(null);
insert into bp.xtest values(null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into (???)

通過更改參數:

SQL> conn / as sysdba
Connected.
SQL> alter system set sql92_security=false scope=spfile;

System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area 2147481656 bytes
Fixed Size                  8898616 bytes
Variable Size             553648128 bytes
Database Buffers         1577058304 bytes
Redo Buffers                7876608 bytes
Database mounted.
Database opened.
SQL> show parameter sql92

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sql92_security                       boolean     FALSE
SQL> conn u1/u1
Connected.
SQL> insert into bp.xtest values(null);
insert into bp.xtest values(null)
                           *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("BP"."TEST"."C1")

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