Oracle
設置 max_string_size=EXTENDED 後,Oracle 不允許普通使用者使用大欄位
我正在使用 Oracle 19.3 企業 Docker 容器並啟用
max_string_size=EXTENDED
. 使用使用者創建具有大欄位的表時sys
,Oracle 允許創建該表。但是,當嘗試使用普通使用者創建具有大欄位的表時,Oracle 的行為就像沒有啟用擴展模式一樣。以下是複制步驟:
- 導航到Oracle 容器系統資料庫。
- 點擊“數據庫”,然後點擊“企業”。
- 接受右上角的許可條款。需要登錄。
- 確保 Docker Desktop 已安裝並在您的本地電腦上執行。
- 在命令提示符下,執行以下 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
- 等待幾分鐘讓 Oracle 數據庫啟動 - 檢查 Docker Desktop 中的日誌以查看進度。
- 使用 Docker 桌面圖示打開 Docker 容器的終端視窗。
- 跑
export ORACLE_SID=ORCLCDB
- 跑
sqlplus sys/Oradoc_db1 as sysdba
- 在
sqlplus
中,執行以下命令:SHUTDOWN IMMEDIATE STARTUP UPGRADE ALTER SYSTEM SET max_string_size=EXTENDED scope=spfile; START $ORACLE_HOME/rdbms/admin/utl32k.sql SHUTDOWN IMMEDIATE STARTUP
- 在 內
sqlplus
,驗證擴展模式是否正常工作:SHOW PARAMETER max_string_size CREATE TABLE char_test(c1 varchar2(32767));
- 在
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;
sqlplus
以普通使用者退出並重新連接:quit sqlplus C##COMMERCEDB/mypassword
- 在
sqlplus
中,嘗試創建一個包含大欄位的表:CREATE TABLE char_test(c1 varchar2(32767));
發生錯誤:
ERROR at line 1: ORA-00910: specified length too long for its datatype
你有一個容器數據庫。這不是在 CDB 中啟用擴展數據類型的方式。
由於篇幅原因,我不會在此處複製和格式化這些步驟,只需按照本節操作即可:
增加 CDB 中 VARCHAR2、NVARCHAR2 和 RAW 列的最大大小
你應該在一個可插入的數據庫中工作和創建對象,而不是根容器,這違背了這個概念。
更新:
上述文件特別提到這在 CDB 根目錄中不起作用:
**注意:**即使在 MAX_STRING_SIZE 設置為 EXTENDED 之後,根仍繼續使用 STANDARD 語義。在根中將 MAX_STRING_SIZE 設置為 EXTENDED 的原因是,CDB 中的所有 PDB 都可以從根中繼承 EXTENDED 設置。
這是我使它工作的輸出: