Oracle
未顯示 NOT NULL 約束衝突的列名
我正在使用一個 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.XTEST
APP 使用者來修復它(請參閱相關問題:授予權限以查看插入時違反空約束的列名意見)。但這在 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")