تغییرات دستور OERR در اوراکل 23c

در نسخه 23c دستور OERR اطلاعات بیشتری را برای بسیاری از خطاها(نسبت به نسخه های قبلی) ارائه می کند که این مسئله می تواند در شناسایی علت رخ دادن خطا و همچنین رفع سریع تر آن کمک کند.

بعنوان مثال، برای خطای ORA-00001: unique constraint (constraint_name) violated این دستور را در دو نسخه 21c و 23c اجرا می کنیم:

'Oracle 21c':
[oracle@OEL7 ~]$ oerr ora 00001
00001, 00000, "unique constraint (%s.%s) violated"
// *Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
//         For Trusted Oracle configured in DBMS MAC mode, you may see
//         this message if a duplicate entry exists at a different level.
// *Action: Either remove the unique restriction or do not insert the key.
'oracle 23c'
[oracle@IranHost ~]$ oerr ora 00001
00001, 00000, "unique constraint (%s.%s) violated on table %s.%s columns (%s)"
// *Cause:  An UPDATE, INSERT or MERGE statement attempted to update or
//          create a record that duplicated values limited by a unique
//          constraint. A unique constraint can be implemented as an
//          explicit unique constraint, a unique index, or a primary key.
//
//          Consider the case where a table has a unique constraint on columns
//          FIRSTNAME and LASTNAME. Because of this constraint, it is not
//          possible to insert a row containing values of FIRSTNAME and
//          LASTNAME that are identical to the values of these columns in an
//          existing table row.
// *Action: Determine what type of unique constraint was violated (explicit
//          unique constraint, unique index, or primary key), and which table
//          columns are affected by this unique constraint.
//
//          Then choose whether to change the constraint to allow duplicate
//          values; modify the SQL statement to no longer create a duplicate
//          value; or drop the constraint, unique index, or primary key.
// *Params: 1) constraint_schema: The schema name where the constraint
//             resides.
//          2) constraint_name: The name of the constraint.
//          3) table_schema: The schema name for the table affected by this
//             constraint.
//          4) table_name: The name of the table affected by this
//             constraint.
//          5) column_names: The column names affected by this
//             constraint.

قابلیت دیگر اوراکل 23c در این زمینه، اضافه شدن دستور OERR به محیط sqlplus است:

[oracle@IranHost ~]$ sqlplus "/as sysdba"
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09

SQL> OERR
Usage: OERR <facility name> <error number>
SQL> OERR ora 01452
Message: "cannot CREATE UNIQUE INDEX; duplicate keys found"
Help: https://docs.oracle.com/error-help/db/ora-01452/
Cause:     A CREATE UNIQUE INDEX statement specified one or more
           columns that currently contained duplicate values. All values in
           the indexed columns must be unique by row to create a UNIQUE
           INDEX.
Action:    If the entries need not be unique, remove the keyword
           UNIQUE from the CREATE INDEX statement, then re-execute the
           statement. If the entries must be unique, as in a primary key,
           then remove duplicate values before creating the UNIQUE index.

قابلیت Read Only Session در اوراکل 23c

یکی دیگر از پارامترهای جدید اوراکل در نسخه 23c، پارامتر read_only است:

SQL> show parameter READ_ONLY
NAME  TYPE        VALUE    
----- ----------- -------- 
read_only                            boolean     FALSE

این پارامتر صرفا در سطح session قابل تنظیم است و با تنظیم این پارامتر به مقدار true، امکان اجرای دستورات DML و DDL در سطح session از بین خواهد رفت:

SQL> alter system set read_only=true scope=spfile;
ORA-32017: failure in updating SPFILE
ORA-02065: illegal option for ALTER SYSTEM
 SQL> alter session set read_only=true;
Session altered.

SQL> delete tbl1;
ORA-28193: Can perform read operations only

SQL> drop table tbl1;
ORA-28193: Can perform read operations only

اگر تراکنشی در session در حال اجرا باشد، امکان فعال کردن این پارامتر وجود ندارد:

SQL> delete tbl1;
1 row deleted.

SQL> alter session set read_only=true;
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-65023: active transaction exists in container

این پارامتر برای هر دو نوع از userها یعنی local user و common user قابل استفاده است.

اوراکل 23c – دستور ping در sqlplus

در اوراکل 23c می توانیم از دستور ping در محیط sqlplus استفاده کنیم. این دستور مشابه ابزار tnsping رفتار می کند و از طریق آن می توانیم در دسترس بودن IP و port را بررسی کنیم البته دستور ping درستی service_name و یا SID را چک نمی کند(همانند tnsping).

این دستور با کمک فایل tnsnames.ora اجرا می شود و net service name و یا IP را به عنوان ورودی می پذیرد البته امکان اجرای آن به روش easy connect هم وجود دارد.

(بیشتر…)

اوراکل 23c – امکان استفاده از قابلیت Memoptimized Rowstore بدون تنظیم Hint

برای استفاده از قابلیت Memoptimized Rowstore در نسخه های 19c و 21c، ابتدا می بایست این قابلیت را در سطح جدول فعال می کردیم و بعد از آن، در زمان درج دیتا، Hintای را به دستور insert اضافه می کردیم با توجه به آنکه ممکن است application از قبل نوشته شده باشد، اضافه کردن Hint به دستور insert می تواند مانعی برای استفاده از قابلیت Memoptimized Rowstore شود.

SQL> ALTER TABLE tbl1 MEMOPTIMIZE FOR WRITE;
Table altered

SQL> INSERT /*+ MEMOPTIMIZE_WRITE */ INTO tbl1 VALUES (1,'usefzadeh.com');

بنابرین در نسخه های یاد شده، بدون استفاده از هینت MEMOPTIMIZE_WRITE امکان استفاده از این قابلیت وجود نداشت.

در نسخه 21c اوراکل پارامتری به نام MEMOPTIMIZE_WRITES را اضافه کرده است که از طریق آن می توان بدون تنظیم این Hint، از این قابلیت بهرمند شد:

SQL> show parameter memoptimize_writes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memoptimize_writes                   string      HINT

(بیشتر…)

اوراکل 23c – قابلیت JSON Relational Duality View

اوراکل در نسخه 23c قابلیتی به نام JSON Relational Duality View را ارائه کرده است که می توان از طریق آن به طور همزمان از(بسیاری از) مزیتهای Relational data model و JSON data model بهرمند شد.

می دانیم که انتخاب هر کدام از این دیتامدلها می تواند بر حسب شرایط، مزایا و معایبی را به همراه داشته باشد. به طور مثال در مدل Relational می توان از مزیتهایی نظیر «جلوگیری از Data duplication، نرمالسازی، consistency» و … بهره گرفت و از طرف دیگر «خوانایی، سادگی، خود توصیفی، hierarchical document» نمونه هایی از مزیتهای JSON هستند.

بر اساس قابلیت JSON Relational Duality View، دیتا در جداول به صورت relational ذخیره می شوند و با ایجاد یک Duality View بر روی جداول رابطه ای، امکان دسترسی و دستکاری(Delete، Insert، Update) دیتا به صورت JSON هم به وجود خواهد آمد و Duality Viewها بر خلاف Viewهای معمولی، امکان write را بر روی جداول رابطه ای فراهم می کنند(حتی در حالت Complex View).

در زمان استفاده از این قابلیت، با توجه به ذخیره شدن اطلاعات در جداول رابطه ای، دستورات SQLای متعارف برای اجرای عملیات DML کاملا معتبر هستند و در کنار آن Developer این انتخاب را دارد تا با استفاده از Duality Viewها عملیات DML را با فرمت JSON انجام دهد که این مسئله mapping راحت تر بین Application Object و Relational Table را به همراه دارد و در بعضی از موارد می تواند نیاز به convert دیتا به فرمت JSON و یا برعکس را از بین ببرد.

(بیشتر…)

اوراکل 23c – ابزار ConnStr

یکی دیگر از قابلیتهای جدید دیتابیس اوراکل در نسخه 23c، ابزار ConnStr است این ابزار خروجی لاگ listener را خوانده و بر اساس آن، برای هر کدام از سرویسها، connection string را به فرمتهای Easy Connect، JDBC و Python نمایش می دهد. علاوه بر آن، این ابزار می تواند برای هر کدام از سرویسها، net service nameای را در فایل tnsnames.ora ایجاد کند.

در حالت پیش فرض اگر سرویس listener پایین باشد، اجرای دستور ConnStr به خطا خواهد خورد:

 [oracle@OEL8 ~]$ lsnrctl  stop
LSNRCTL for Linux: Version 23.0.0.0.0 - Developer-Release on 05-SEP-2023 13:30:35
Copyright (c) 1991, 2023, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= OEL8)(PORT=1521)))
The command completed successfully
[oracle@OEL8 ~]$ connstr
Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree
No listener endpoints found

بعد از استارت listener، اگر سرویسی رجیستر نشده باشد، ConnStr پیغام The listener supports no services را نمایش می دهد:

[oracle@OEL8 ~]$ lsnrctl  start
The listener supports no services
The command completed successfully
[oracle@OEL8 ~]$ connstr
Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree
The listener supports no services

(بیشتر…)

اوراکل 23c – امکان استفاده از ماژولهای JavaScript در دیتابیس اوراکل

در نسخه 21c، اوراکل امکان اجرای کد JavaScript در داخل دیتابیس را فراهم کرده است. این کار با کمک بسته DBMS_MLE امکان پذیر است:

DECLARE
   ctx varchar2(50) ;
BEGIN
   ctx := DBMS_MLE.create_context();
   DBMS_MLE.eval(ctx, 'JAVASCRIPT', q'~console.log("www.usefzadeh.com");~');
   DBMS_MLE.drop_context(ctx);
END;
/
www.usefzadeh.com

در نسخه 23c قابلیتهای دیگری هم در این زمینه ارائه شد که یکی از آنها، امکان بارگذاری و استفاده از ماژولهای JavaScript در دیتابیس اوراکل است این قابلیت می تواند در زمینه های مختلفی راهگشا باشد و حجم کدنویسی را کاهش دهد.

به عنوان مثال، در مطلب “قابلیت SQL domain در اوراکل 23c” در مورد محدود کردن فرمت ورودی ها از طریق check constraint، trigger و sql domain نکاتی را ارائه کردیم و توضیح دادیم که چگونه می توانیم ورودی های ستونی مثل email را کنترل کنیم تا در قالبی مشخص درج شوند.

در این قبیل چالشها، ماژولهای JavaScript هم می توانند به کمک ما بیایند و با استفاده از آنها هم می توانیم بسیاری از این دست نیازمندیها را در دیتابیس مرتفع کنیم. برای مثال، ماژول validator در مورد کنترل ساختار ورودی ها می تواند مورد استفاده قرار بگیرد.

(بیشتر…)

اوراکل 23c -قابلیت Automatic Transaction Rollback(تنظیم اولویت برای تراکنشها)

در صورتی که دو کاربر قصد ویرایش یک رکورد را داشته باشند، کاربری که دیرتر دستور update را اجرا کرده Block خواهد شد و تا زمانی که کاربر اول(کاربری که زودتر رکورد را در اختیار گرفته) به تراکنش خاتمه ندهد، کاربر دوم در حالت Block باقی خواهد ماند.

--session 1:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      2190
SQL> update USEF.TBL1 set  id=1;
1 row updated
--session 2:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
       944

SQL> update USEF.TBL1 set id=1;
Executing…

بلاک شدن session دوم را می توانیم از طریق دستور زیر ببینیم:

SQL>  select SID,ID1,ID2,LMODE,block,request from v$lock where type='TX';
       SID        ID1        ID2      LMODE      BLOCK    REQUEST
---------- ---------- ---------- ---------- ---------- ----------
       944     458766       2511          0          0          6
      2190     458766       2511          6          1          0

ممکن است کاربر دوم که تراکنشش در حالت انتظار قرار دارد، برای ما اولویت بیشتری داشته باشد. در این حالت چه راهکاری وجود دارد؟

(بیشتر…)

اوراکل 23c – خواناتر شدن متن خطاها

در نسخه 23c، اوراکل متن بعضی از خطاها را به شکل خواناتری تغییر داده تا در شناسایی علت آن و همچنین رفع سریع تر این خطاها به Developer و یا DBA کمک کرده باشد.

برای مثال متن خطای معروف ORA-00979 تا قبل از نسخه 23c به صورت زیر بوده است:

SQL> select owner,object_type,count(*) from dba_objects group by  owner;

ORA-00979: not a GROUP BY expression

اما این متن در نسخه 23c به صورت زیر تغییر کرده است:

SQL> select owner,object_type,count(*) from dba_objects group by  owner;

ORA-00979: “OBJECT_TYPE”: must appear in the GROUP BY clause or be used in an aggregate function

در ادامه نمونه های دیگری از خطاهای معروفی که متن آنها تغییر کرده است را مشاهده می کنید.

(بیشتر…)

فعالسازی مجدد Traditional Audit در اوراکل 23c

قبلا در مطلبی توضیح دادیم که Traditional Audit در نسخه 23c پشتیبانی نمی شود به این معنی که auditهای قدیمی امکان اعمال شدن دارند ولی نمی توان audit جدیدی را ایجاد کرد.

برای مثال می توانیم auditای که از قبل تنظیم شده را noaudit کنیم:

SQL>  noaudit all on DVSYS."REALM_AUTH$";
Noaudit succeeded.

ولی امکان تنظیم مجدد این audit و یا auditهای دیگر وجود ندارد و در صورت تلاش برای این کار با خطای ORA-46401 مواجه خواهیم شد:

SQL> audit all on DVSYS."REALM_AUTH$";
ORA-46401: No new traditional AUDIT configuration is allowed. Traditional
auditing is desupported, and you should use unified auditing in its place.

آقای Pete Finnigan که در موضوع oracle security مطالب خوبی دارند، پارامتر مخفی ای(Hidden Parameter)  را معرفی کردند که امکان فعالسازی مجدد Traditional Audit را در این نسخه فراهم می کند:

SQL> alter system set "_allow_traditional_audit_configuration"=true;
System altered.

پس از تنظیم این پارامتر به مقدار TRUE، مجددا دستور audit فوق را اجرا می کنیم:

SQL> audit all on DVSYS."REALM_AUTH$";
Audit succeeded.

این نوع از  audit بدون هیچ محدودیتی، در سطوح دیگر هم قابل انجام است:

SQL> audit drop any table;
Audit succeeded.
SQL> audit all statements;
Audit succeeded.