اوراکل 23ai- افزایش حداکثر اندازه پسورد از 30 بایت به 1024 بایت

تا قبل از نسخه 23ai، پسورد کاربران و roleها حداکثر می توانست 30 بایت باشد:

SQL> create user u1 identified by a123456789012345678901234567890;
ORA-00972: identifier is too long
SQL> create role r1 identified by a123456789012345678901234567890;
ORA-00972: identifier is too long

در اوراکل 23ai این محدودیت به 1024 بایت تغییر کرده است:

SQL> create user u1 identified by a123456789012345678901234567890;
User created.
SQL> create role r1 identified by a123456789012345678901234567890;
Role created.

اوراکل 23ai- پشتیبانی توابع CEIL و FLOOR از دیتاتایپهای DATE، TIMESTAMP و INTERVAL

همانطور که می دانید توابع CEIL و FLOOR برای round کردن(گرد کردن) اعداد استفاده می شوند به این صورت که تابع CEIL اعداد را به سمت بالا گرد می کند و تابع FLOOR هم برای گردن کردن به سمت پایین استفاده می شود.

SQL> select floor(6.45) from dual;
FLOOR(6.45)
-----------
          6
SQL> select CEIL(6.45) from dual;
CEIL(6.45)
----------
         7

از نسخه 23c می توان از توابع CEIL و FLOOR برای انواع داده DATE، TIMESTAMP و INTERVAL هم استفاده کرد. برای مثال می توانیم برای تاریخ 2024/02/05 ماه را به سمت بالا گرد کنیم که در این صورت این تاریخ به 2024/03/01 رند خواهد شد.

(بیشتر…)

قابلیت JSON Schema در اوراکل 23ai

یکی دیگر از قابلیتهای جدید اوراکل در نسخه 23cء، JSON Schema است از طریق این قابلیت می توانیم برای هر کدام از keyهای JSON، دیتاتایپی را تنظیم کنیم و محدودیتهای دیگر نظیر minLength و maxLength را برای هر کدام از کلیدها اعمال کنیم. این کار با اضافه کردن عبارت VALIDATE به متن دستور create table قابل انجام است.

ساختار جدول زیر را در نظر بگیرید! در این جدول صرفا JSON Documentای را می توانیم در ستون ettelaat ذخیره کنیم که حداقل شامل فیلدهای  First_Name و Last_Name باشند(“required”: [“First_Name”, “Last_Name”]) و این دو فیلد باید از نوع string هم باشند همچنین در صورت وجود فیلد Age در داکیومنت JSON، این فیلد باید از نوع number باشد.

SQL> CREATE TABLE TB_Person (
  2    id          NUMBER PRIMARY KEY,
  3    ettelaat json VALIDATE '{
  4      "type": "object",
  5      "properties": {
  6        "First_Name": {
  7          "type": "string",
  8          "minLength": 5,
  9          "maxLength": 20
 10        },
 11        "Last_Name": {
 12          "type": "string",
 13          "minimum": 5,
 14          "maximum": 30
 15        },
 16  	  "Age": {
 17          "type": "number"
 18        }
 19      },
 20      "required": ["First_Name", "Last_Name"]
 21    }'
 22    );

Table created

(بیشتر…)

اوراکل 23ai– قابلیت Automatic List Partitioning برای جداول هیبریدی

Hybrid Partitioned Table قابلیت جدیدی است که اوراکل در نسخه 19c ارائه کرده است با کمک این قابلیت می توان برای یک جدول، تلفیقی از پارتیشنهای external و internal را ایجاد کرد.

این روش از پارتیشن بندی، صرفا متدهای Range و List را پشتیبانی می کند البته در نسخه 19c امکان استفاده از متد Automatic List برای Hybrid Partitioned Table وجود ندارد و این امکان از نسخه 23c به وجود آمد.

بنابرین از این نسخه(23c) می توانیم برای جداول Hybrid Partitioned Table از قابلیت Automatic List Partitioning استفاده کنیم.

قبل از ایجاد جدول مورد نظر، دایرکتوری مربوط به دیتایی که در سیستم عامل قرار دارند را ایجاد می کنیم:

SQL> create directory E_PARTITIONs as '/PARTITIONs';
Directory created

جدول mytbl از نوع هیبریدی است و  به روش Automatic List پارتیشن بندی شده است:

SQL> CREATE TABLE mytbl
  2  (
  3  national_id NUMBER,
  4  name        VARCHAR2(20),
  5  last_name   VARCHAR2(20),
  6  org_id      NUMBER
  7  )
  8  EXTERNAL PARTITION ATTRIBUTES(
  9  TYPE ORACLE_LOADER
 10  DEFAULT DIRECTORY E_PARTITIONs
 11  ACCESS PARAMETERS
 12  (
 13  FIELDS TERMINATED BY ',' (national_id,name,last_name,org_id)
 14  )
 15  REJECT LIMIT UNLIMITED
 16  )
 17      PARTITION BY LIST (org_id) AUTOMATIC
 18          (
 19              PARTITION p1 VALUES (1),
 20              PARTITION p2 VALUES (2),
 21  		     PARTITION p_external VALUES (3) EXTERNAL LOCATION('part1.txt')
 22          );

Table created

(بیشتر…)

اوراکل 23ai- قابلیت Dictionary Protection

زمانی که یکی از مجوزهای system “ANY” privilege نظیر select any table، drop any table و … را به کاربری می دهیم، آن کاربر امکان دسترسی به objectهای شمای sys و جداول Data Dictionary را ندارد:

SQL*Plus: Release 10.1.0.4.2 - Production on Tue Jan 9 10:38:31 2024
SQL> show user
USER is "SYS"
SQL> create table sys.tb as select * from dual;
Table created.
SQL> create user usef identified by a;
User created.
SQL> grant create session,select any table to usef;
Grant succeeded.
SQL> conn usef/a
Connected.
SQL> select * from sys.tb;
ORA-00942: table or view does not exist
SQL> select * from v$datafile;
ORA-00942: table or view does not exist

اگر تصمیم داریم این محدودیت را حداقل در مورد مجوز select any table برای یک کاربر برداریم، می توانیم مجوز SELECT ANY DICTIONARY را به آن کاربر اعطا کنیم:

SQL> grant SELECT ANY DICTIONARY to usef;
Grant succeeded.
SQL> conn usef/a
Connected.
SQL> select * from sys.tb;
D
-
X
SQL> select file# from v$datafile where rownum=1;
     FILE#
----------
         1

البته از اوراکل 12c، دسترسی به بعضی از جداول Data Dictionary حتی با داشتن مجوز  SELECT ANY DICTIONARY  هم امکان پذیر نیست. لیست بعضی از این جداول را در قسمت زیر می بینید:

USER$, ENC$ , DEFAULT_PWD$, LINK$, USER_HISTORY$, CDB_LOCAL_ADMINAUTH$, XS$VERIFIERS

(بیشتر…)

اوراکل 23ai- تخمین صرفه جویی در فضا با DEDUPLICATION

DEDUPLICATION یکی از قابلیتهای جدید اوراکل در نسخه 11g است که همراه با SECUREFILE LOBها ارائه شد و می توان بعد از ایجاد جدول هم این قابلیت را برای SECUREFILE LOBها فعال کرد اما سوال مهمی که در این زمینه مطرح می شود آن است که DEDUPLICATION برای LOBهای موجود چقدر فضا آزاد می کند؟

در اوراکل نسخه 23c، تابعی در این زمینه ارائه شد که می تواند تا حدودی به این سوال پاسخ دهد. این تابع نام جدول(و یا نام پارتیشنی از جدول) را دریافت می کند و حداکثر 100 هزار رکورد از آن جدول را بررسی کرده و نهایتا تخمینی از میزان ذخیره سازی فضا را ارائه می کند.

در ادامه، سناریوی تستی را در این زمینه می بینید.

SQL> create table tbl (id number,describe clob);
Table created

در این جدول اطلاعاتی را درج می کنیم که بیشتر آن تکراری هستند:

SQL> begin
  2    for i in 1 .. 70000 loop
  3      insert into tbl
  4      values
  5        (1,
  6         lpad('www.usefzadeh.com',
  7              1000000000000000000000000000000000000000000000000000000000000000000000000000000000,
  8              'a'));
  9    end loop;
 10    insert into tbl values (2, 'Ramtollah Rabbani');
 11    insert into tbl values (3, 'Armin Bahamin');
 12    insert into tbl values (4, 'Jamshid Khan');
 13    commit;
 14  end;
 15  /

PL/SQL procedure successfully completed

(بیشتر…)

امکان تغییر رفتار پیش فرض kill session در اوراکل 23ai

زمانی که sessionای را در اوراکل kill می کنیم، به صورت پیش فرض آن session در حالت SOFTء، kill خواهد شد:

SQL> ALTER SYSTEM KILL SESSION '1025,44801';
System altered.

جزییات اجرای این دستور را می توانیم در Alert Log ببنیم:

2023-12-19T13:32:18.731476+03:30
(4):A user has terminated a session.
KILL SESSION for sid=(1025, 44801):
  Reason = alter system kill session
  Mode = KILL SOFT -/-/-/-
  Requestor = USER (orapid = 55, ospid = 3267554, inst = 1)
    User = oracle
    Program = sqlplus@OEL8 (TNS V1-V3)
  Owner = Process: USER (orapid = 75, ospid = 3268895)
    User = 462710969
    Program = plsqldev.exe
  Result = ORA-0

برای kill کردن session در حالت HARD می توانیم عبارت immediate را به انتهای دستور اضافه کنیم:

SQL> ALTER SYSTEM KILL SESSION '1025,43030' IMMEDIATE;
System altered.

مجددا با کمک Alert Log جزییات اجرای این دستور را هم خواهیم دید:

2023-12-19T13:33:07.749571+03:30
(4):A user has terminated a session.
KILL SESSION for sid=(1025, 43030):
  Reason = alter system kill session
  Mode = KILL HARD SAFE -/-/-/-
  Requestor = USER (orapid = 55, ospid = 3267554, inst = 1)
    User = oracle
    Program = sqlplus@OEL8 (TNS V1-V3)
  Owner = Process: USER (orapid = 75, ospid = 3268940)
    User = 462710969
    Program = plsqldev.exe
  Result = ORA-0

در نسخه 23c اوراکل Hidden Parameterای به نام kill_session_force_ را اضافه کرده است که می توان از طریق آن، این رفتار پیش فرض را تغییر داد:

(بیشتر…)

اوراکل 23ai– پارامتر error_message_details برای نمایش جزییات خطا

error_message_details یکی دیگر از پارامترهای جدید اوراکل در نسخه 23c هست که امکان نمایش جزییات خطاهای مربوط به Data Value را فراهم می کند با تنظیم این پارامتر به مقدار on، می توانیم برای خطاهایی نظیر ORA-00001: unique constraint violated، مقداری که سبب رخ دادن این دسته از خطاها شده است را در متن خطا ببینیم.

برای مثال، در سناریوی زیر، فعال بودن پارامتر error_message_details در پیدا کردن مقداری که باعث این خطا شده است کمک می کند:

SQL> create table tbl1(id number primary key);
Table created.
SQL> variable B number;
SQL> exec :B:=2547;
PL/SQL procedure successfully completed.
SQL> insert into tbl1 values(:B);
1 row created.
SQL> insert into tbl1 values(:B);
ERROR at line 1:
'ORA-00001: unique constraint (USEF.SYS_C008328) violated on table USEF.TBL1 columns (ID)'
'ORA-03301: (ORA-00001 details) row with column values (ID:2547) already exists'
Help: https://docs.oracle.com/error-help/db/ora-00001/

در صورتی که پارامتر error_message_details غیر فعال شود، خطای فوق به شکل زیر نمایش داده می شود:

SQL> alter system set error_message_details=DISALLOWED ;
System altered.
SQL> insert into tbl1 values(:B);
'ORA-00001: unique constraint (USEF.SYS_C008329) violated on table USEF.TBL1 columns (ID)'
Help: https://docs.oracle.com/error-help/db/ora-00001/

 

قابلیتهای جدید اوراکل 23ai برای جداول Blockchain و Immutable

در این مطلب سعی داریم تعدادی از قابلیتهای جدید اوراکل 23c در زمینه جداول Blockchain و Immutable را مرور کنیم.

امکان حذف  و اضافه کردن ستون به جداول Blockchain و Immutable

در نسخه 23c می توان به جداول Blockchain ستونی را اضافه کرد(البته در version v2 این نوع از جداول):

SQL> create blockchain table blockchaintb1 (
  id    number(10),
  desc1 varchar2(100)
)
no drop until 20 days idle
no delete until 20 days after insert
hashing using "SHA2_512" version "v2";  
Table created.
SQL> alter table blockchaintb1 add (desc2 varchar2(1000));
Table altered.

حذف ستون هم در این نسخه امکان پذیر است:

SQL>  alter table blockchaintb1 drop column desc2;
Table altered.

در صورت درج اطلاعات در این نوع از جداول، باز هم می توان عملیات فوق را تکرار کرد:

(بیشتر…)

اوراکل 23ai– بررسی وجود inconsistency در Data Dictionary

نازسازگاری در دیتادیکشنری امر متداولی نیست و به ندرت اتفاق می افتد اما در صورت رخ دادن می تواند بسیار چالش ساز باشد نمونه ای از این دست ناسازگاری که شاید شما هم با آن روبرو شده باشید، invalid reference است مثلا segmentای که اطلاعاتش در dba_objects موجود نیست.

 تا قبل از نسخه 23c، این قبیل ناسازگاری ها را می توانستیم با اسکریپت hcheck.sql شناسایی کنیم. اما در اوراکل نسخه 23c، پکیجی به نام DBMS_DICTIONARY_CHECK(البته در 23.3) ارائه شد که با کمک آن می توانیم از consistency در دیتادیکشنری اطمینان حاصل کنیم. این پکیج پروسیجرهای متعددی دارد:

SQL> desc DBMS_DICTIONARY_CHECK

PROCEDURE CRITICAL
PROCEDURE FULL
PROCEDURE DUPLICATEDATAOBJ
PROCEDURE IDNSEQOBJ
PROCEDURE IDNSEQSEQ
PROCEDURE INDEXPARTITIONSEG
PROCEDURE INDEXSEG
PROCEDURE INDINDPARMISMATCH
PROCEDURE INDPARTOBJ
PROCEDURE LOBSEG
PROCEDURE MVIEW
PROCEDURE NEXTOBJECT
PROCEDURE NOSEGMENTINDEX
PROCEDURE OBJECTNAMES
PROCEDURE OBJERROR
….

در این بین، پروسیجر FULL می تواند اطلاعات کاملی را در زمینه درستی Data Dictionary ارائه دهد که در ادامه نمونه ای از خروجی آن را مشاهده می کنید:

(بیشتر…)