Oracle

設置 max_string_size=EXTENDED 後,Oracle 不允許普通使用者使用大欄位

  • August 1, 2022

我正在使用 Oracle 19.3 企業 Docker 容器並啟用max_string_size=EXTENDED. 使用使用者創建具有大欄位的表時sys,Oracle 允許創建該表。但是,當嘗試使用普通使用者創建具有大欄位的表時,Oracle 的行為就像沒有啟用擴展模式一樣。以下是複制步驟:

  1. 導航到Oracle 容器系統資料庫
  2. 點擊“數據庫”,然後點擊“企業”。
  3. 接受右上角的許可條款。需要登錄。
  4. 確保 Docker Desktop 已安裝並在您的本地電腦上執行。
  5. 在命令提示符下,執行以下 shell 命令以登錄、下載和執行 docker 映像:
docker login -u <email> -p <password> container-registry.oracle.com
docker run -d -it --name oracle-19-db -p 1521:1521 -e ORACLE_PWD=Oradoc_db1 container-registry.oracle.com/database/enterprise:19.3.0.0
  1. 等待幾分鐘讓 Oracle 數據庫啟動 - 檢查 Docker Desktop 中的日誌以查看進度。
  2. 使用 Docker 桌面圖示打開 Docker 容器的終端視窗。
  3. export ORACLE_SID=ORCLCDB
  4. sqlplus sys/Oradoc_db1 as sysdba
  5. sqlplus中,執行以下命令:
SHUTDOWN IMMEDIATE
STARTUP UPGRADE
ALTER SYSTEM SET max_string_size=EXTENDED scope=spfile;
START $ORACLE_HOME/rdbms/admin/utl32k.sql
SHUTDOWN IMMEDIATE
STARTUP
  1. 在 內sqlplus,驗證擴展模式是否正常工作:
SHOW PARAMETER max_string_size
CREATE TABLE char_test(c1 varchar2(32767));
  1. sqlplus中,創建普通使用者:
CREATE USER C##COMMERCEDB PROFILE DEFAULT IDENTIFIED BY mypassword
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS ACCOUNT UNLOCK;

GRANT CONNECT, CREATE TABLE, CREATE SEQUENCE, CREATE PROCEDURE TO C##COMMERCEDB;
GRANT EXECUTE ON DBMS_XA TO C##COMMERCEDB;
GRANT SELECT ON PENDING_TRANS$ TO C##COMMERCEDB;
GRANT SELECT ON DBA_2PC_PENDING TO C##COMMERCEDB;
GRANT SELECT ON DBA_PENDING_TRANSACTIONS TO C##COMMERCEDB;
  1. sqlplus以普通使用者退出並重新連接:
quit
sqlplus C##COMMERCEDB/mypassword
  1. sqlplus中,嘗試創建一個包含大欄位的表:
CREATE TABLE char_test(c1 varchar2(32767));

發生錯誤:

ERROR at line 1:
ORA-00910: specified length too long for its datatype

你有一個容器數據庫。這不是在 CDB 中啟用擴展數據類型的方式。

MAX_STRING_SIZE

由於篇幅原因,我不會在此處複製和格式化這些步驟,只需按照本節操作即可:

增加 CDB 中 VARCHAR2、NVARCHAR2 和 RAW 列的最大大小

你應該在一個可插入的數據庫中工作和創建對象,而不是根容器,這違背了這個概念。

更新:

上述文件特別提到這在 CDB 根目錄中不起作用:

**注意:**即使在 MAX_STRING_SIZE 設置為 EXTENDED 之後,根仍繼續使用 STANDARD 語義。在根中將 MAX_STRING_SIZE 設置為 EXTENDED 的原因是,CDB 中的所有 PDB 都可以從根中繼承 EXTENDED 設置。

這是我使它工作的輸出:

https://pastebin.com/UaMQJtJL

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