اوراکل 23ai- تغییر نام LOB segment

همانطور که می دانید اوراکل برای هر LOB segment یک نام خودکار با پیشوند SYS_LOB ایجاد می کند:

SQL> create table asnad( id number, doc clob);
Table created

SQL> select segment_name from dba_lobs where table_name='ASNAD';
SEGMENT_NAME
------------------------------
SYS_LOB0000136126C00002$$

در نسخه 21c برای تغییر نام SYS_LOBها می بایست LOB segment را move داد که این کار بسیار پرهزینه بود و چالشهایی نظیر بازسازی ایندکسهای جدول را به همراه داشت:

SQL> insert into ASNAD values(1,'my name is vahid');
1 row inserted
SQL> commit;
Commit complete
SQL> create index ind on asnad(id);
Index created
SQL> alter table asnad move lob(doc) store as asnad_doc;
Table altered
SQL> select segment_name from dba_lobs where table_name='ASNAD';
SEGMENT_NAME
----------------
ASNAD_DOC

SQL> select index_name from user_indexes where status='UNUSABLE';
INDEX_NAME
---------------
IND

(بیشتر…)

قابلیت SQL domain در اوراکل 23ai

دیتابیس اوراکل در نسخه 23c سعی کرده تا بسیاری از قابلیتهای موجود در دیتابیسهای رابطه ای دیگر را در این version ارائه کند قابلیتهای ساده ای نظیر «Schema level privilege» – «Boolean data type» – «Direct Joins for UPDATE and DELETE» -«SELECT without FROM» و …

یکی دیگر از این قابلیتها که موضوع بحث این مستند هم هست، SQL domain می باشد که می تواند شامل مجموعه ای از محدودیتها و خصوصیتها باشد و با تخصیص آن به یک ستون، می توان محدودیتهایی را برای آن ستون اعمال کرد به عبارت دیگر، SQL domain امکان توسعه Data type را متناسب با Business فراهم می کند.

یکی از کاربردهای مهم این قابلیت به زمانی برمی گردد که بخواهیم برای مقادیر ورودی یک ستون، شرطهای به خصوصی را اعمال کنیم. مثلا برای ستون Age با نوع داده number، با شرط Age>=18، از ثبت مقادیر کمتر از 18 جلوگیری کنیم و یا به عنوان مثالی کاربردی تر، برای ستونی که قرار است آدرس Email در آن ذخیره شود، شرطی را اعمال کنیم تا این ستون، صرفا اطلاعات ورودی با فرمت text@text.text را بپذیرد.

(بیشتر…)

معرفی Role جدید برای Developerها در اوراکل 23ai

زمانی که ادمین دیتابیس، User جدیدی را برای Developerها ایجاد می کند شاید در تردید باشد که چه مجوزهایی را به این User اهدا کند تا Developer حداقل دسترسی لازم برای تولید Application را در نقطه شروع داشته باشد.

شاید بسیاری از ادمینها، Roleهای Connect و Resource را به این User اهدا می کنند تا Developer بتواند از طریق این User به دیتابیس وصل شده و در صورت لزوم اقداماتی را نظیر ساخت Table، View، Trigger و … انجام دهد.

این دو Role شامل system privilegeهای زیر هستند:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> create user usef identified by a;
User created.
SQL> grant connect,resource to usef;
Grant succeeded.
SQL> conn usef/a@target:1521/PDBTARGET
Connected.
SQL> select * from session_privs;
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SET CONTAINER
10 rows selected.  

(بیشتر…)

اوراکل 23ai- قابلیت Read Only User

Read Only User یکی از قابلیتهای جدید اوراکل در نسخه 23c است که اوراکل در مستندات مربوط به نسخه 23c حرفی در مورد آن نزده و ظاهرا اولین مستند آن مربوط به آقای Pete Finnigan است.

از طریق این قابلیت می توانیم امکان هرگونه تغییر داده را از یک کاربر بگیریم به طوری که کاربر با داشتن مجوز لازم برای insert، delete و update نتواند این دستورات را اجرا کند و یا با داشتن مجوز ساخت جدول، ویو، پروسیجر و … قابلیت ایجاد این اشیا را نداشته باشد چرا که ایجاد یک شی نیازمند تغییر داده در جداول Data Dictionary است.

بنابرین در صورتی که کاربر در حالت read only قرار بگیرد صرفا می تواند به دیتابیس وصل شده و اطلاعات جداول را ببیند و یا پروسیجر، فانکشن و پکیجی که تغییری را ایجاد نمی کنند اجرا کند.

در زمان ساخت یک user می توان آن را در حالت read only قرار داد:

SQL> create user USEF identified by abc read only;
User created.

(بیشتر…)

اوراکل 23ai- قابلیت Automatic SQL Transpiler

همانطور که می دانید استفاده از تابع در یک دستور sqlای، context switch بین SQL engine و PL/SQL engine را در پی خواهد داشت و رخ دادن متعدد context switch می تواند اثرات منفی بر روی performance دیتابیس داشته باشد.

اوراکل در نسخه 21c برای افزایش سرعت اجرای این دسته از پرس و جوها، SQL Macros را معرفی کرده است که با استفاده از این قابلیت، متن پرس و جوی حاوی function به فرم ساده و بدون استفاده از function بازنویسی می شود.

در نسخه 23c هم اوراکل قابلیت Automatic SQL Transpiler را در این زمینه معرفی کرده است که در صورت تنظیم پارامتر sql_transpiler به مقدار ON، به صورت خودکار و بدون مداخله کاربر، تابع استفاده شده در متن دستور SQL «در صورت امکان» به SQL expression تبدیل خواهد شد تا از سربار ناشی از اجرای function در SQL کاسته شود.

(بیشتر…)

اوراکل 23ai – استفاده از Direct Join در دستورات Delete و Update

برای حذف و یا بروزرسانی رکوردهای یک جدول «در بسیاری از مواقع» نیاز به join آن جدول با جداول دیگر داریم تا تعیین کنیم کدام یک از رکوردها باید delete و یا update شوند تا قبل از اوراکل 23c در این شرایط به ناچار می بایست از دستور select هم همزمان استفاده می کردیم و امکان استفاده از Direct Join را نداشتیم اما در نسخه 23c، اوراکل این قابلیت را اضافه کرده است.

برای مثال دستور زیر با join بین دو جدول employees و departments مشخص می کند کدام رکوردهای جدول employees باید بروزرسانی شوند:

SQL> update employees e
  2     set e.salary = e.salary * 2
  3     from departments d
  4   where d.department_id = e.department_id
  5     and d.department_name = 'IT';
5 rows updated

از این قابلیت برای حذف رکوردها هم می توانیم استفاده کنیم:

SQL> delete employees e
  2     from departments d
  3   where d.department_id = e.department_id
  4     and d.department_name = 'IT'
  5     and e.employee_id!=d.manager_id;
4 rows deleted

 

اوراکل 23ai- قابلیت Traditional Auditing دیگر پشتیبانی نمی شود!

از اوراکل 23c قابلیت Traditional Auditing(یا همان Standard Auditing) دیگر پشتیبانی نمی شود! و قابلیت Unified Auditing در این نسخه از اوراکل به صورت پیش فرض فعال است:

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Wed Jun 14 18:26:42 2023
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
VALUE
-------------
TRUE

البته پارامترها و جداول مربوط به Traditional Auditing کماکان وجود دارند:

SQL> select count(*) from dba_audit_trail;
  COUNT(*)
----------
         0
SQL> show parameter audit_trail
NAME         TYPE        VALUE
------------ ----------- --------
audit_trail  string      DB

همچنین امکان تغییر مقدار پارامتر audit_trail هم وجود دارد هر چند که در حالت عادی تغییر آن اثری ندارد:

SQL> alter system set audit_trail='db,extended' scope=spfile;
System altered.

(بیشتر…)

استفاده از Column Alias در قسمت Group by  و Having در اوراکل 23ai

در نسخه 23c می توان از Column Alias در قسمت GROUP BY و HAVING استفاده کرد. این امکان تا قبل از نسخه 23c وجود نداشت:

Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
SQL> select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB
  2    from dba_segments
  3   group by Malek
  4  having SIZE_MB>100;
ERROR at line 4:
ORA-00904: "SIZE_MB": invalid identifier

در نسخه 21c برای جلوگیری از خطای invalid identifier فوق، می بایست Alias ستون را حذف و کوئری را به صورت زیر بازنویسی کرد:

select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB
  from dba_segments
 group by owner
having sum(bytes / 1024 / 1024) > 10;

(بیشتر…)

نوع داده Boolean در اوراکل 23ai

اوراکل در نسخه 23c دیتا تایپ Boolean را در SQL معرفی کرده است(البته این نوع داده قبلا در PLSQL وجود داشته است) و با این قابلیت، در هنگام ساخت جدول می توان نوع داده ستونها را به Boolean تنظیم کرد.

SQL> CREATE TABLE jadval1 (id NUMBER, is_accept BOOLEAN);
Table created

از کلمه BOOL هم می توان به جای Boolean استفاده کرد.

SQL> CREATE TABLE jadval1 (id NUMBER, is_accept BOOL);
Table created

برای ستونهای از نوع Boolean میتوان مقدار پیش فرض تنظیم نمود:

SQL> CREATE TABLE jadval1 (id NUMBER, is_accept BOOL DEFAULT FALSE);
Table created

برای مقداردهی ستون is_accept می توانیم از سه کلمه کلیدی TRUE، FALSE و NULL استفاده کنیم:

SQL> insert into jadval1 values(1,true);
1 row inserted
SQL> insert into jadval1 values(2,null);
1 row inserted
SQL> insert into jadval1 values(3,false);
1 row inserted

SQL> select * from jadval1;
        ID    IS_ACCEPT
---------- ----------
         1          1
         2 
         3          0

(بیشتر…)

اوراکل 23ai- تنظیم اولویت برای PDB

سوال: اگر CDBای بیش از یک PDB داشته باشد، چگونه می توان در مورد ترتیب open شدن این PDBها اعمال نظر کرد؟

تا قبل از اوراکل 23c راهکاری در این زمینه وجود نداشت و با اجرای دستور startup، تضمینی در مورد ترتیب باز شدن این PDBها وجود نداشت(معمولا بر اساس شماره container این PDBها باز می شدند). اما در نسخه 23c قابلیت جدیدی ارائه شد و بر اساس آن می توان برای هر PDB یک PRIORITY تنظیم کرد تا از طریق آن، ترتیب انجام عملیاتهایی نظیر open کردن PDBء، upgrade و یا restoration را کنترل کرد.

ساختار کلی دستور را در قسمت زیر می بینید:

ALTER PLUGGABLE DATABASE <PDB name> PRIORITY <value>

در این دستور، نام PDB الزامی است و PRIORITY می تواند مقداری بین 1 تا 4096 بگیرد که هر چه این عدد کمتر باشد، PDB اولویت بیشتری دارد به طور مثال، PDB با اولویت 1 نسبت به PDB با اولویت 2 زودتر open خواهد شد.

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TEHRANPDB                      READ WRITE NO
         4 BABOLPDB                       READ WRITE NO
         5 VARAMINPDB                     READ WRITE NO
         6 ABADANPDB                      READ WRITE NO
SQL> ALTER PLUGGABLE DATABASE babolpdb PRIORITY 1;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE ABADANPDB PRIORITY 2;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE VARAMINPDB PRIORITY 3;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE TEHRANPDB PRIORITY 4;
Pluggable database altered.

با restart کردن دیتابیس خواهیم دید که دیتابیسها با ترتیب اعلام شده باز شده اند:

SQL> startup force;
SQL> select OPEN_TIME,NAME,PRIORITY from v$pdbs order by 1;
OPEN_TIME                                NAME         PRIORITY
---------------------------------------- ---------- ----------
10-MAY-23 05.52.43.190 PM +04:30         PDB$SEED            1
10-MAY-23 05.52.43.812 PM +04:30         BABOLPDB            1
10-MAY-23 05.52.44.889 PM +04:30         ABADANPDB           2
10-MAY-23 05.52.45.929 PM +04:30         VARAMINPDB          3
10-MAY-23 05.52.47.102 PM +04:30         TEHRANPDB           4

ترتیب باز شدن PDB در ALERT LOG هم ثبت شده است:

PDB$SEED(2):Opening pdb with Resource Manager plan: DEFAULT_PLAN
BABOLPDB(4):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18
2023-05-10T17:52:44.739491+04:30
ABADANPDB(6):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18
2023-05-10T17:52:45.784421+04:30
VARAMINPDB(5):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18
2023-05-10T17:52:46.828984+04:30
TEHRANPDB(3):SUPLOG: Initialize PDB SUPLOG SGA, old value 0x0, new value 0x18

*همراه با اوراکل 12cR2، اولویت PDBها در زمینه upgrade از طریق دستور زیر قابل تنظیم است:

SQL*Plus: Release 12.0.0.0.0 - Production on Wed May 10 16:56:59 2023
SQL> ALTER PLUGGABLE DATABASE babolpdb UPGRADE PRIORITY 5;
Pluggable database altered.