اوراکل 23ai – اجرای sysdate بر اساس time zone هر PDB

همانطور که می دانید توابع SYSDATE و SYSTIMESTAMP ساعت جاری سیستم را برمی گردانند این توابع date را بر اساس time zone سیستم عامل نمایش می دهند و اگر time zone متفاوتی برای دیتابیس تنظیم شود، تغییری در رفتار این توابع ایجاد نمی شود:

[oracle@OEL8 ~]$ timedatectl
               Local time: Thu 2024-02-15 13:14:48 +0330
           Universal time: Thu 2024-02-15 09:44:48 UTC
                 RTC time: Thu 2024-02-15 07:37:09
                Time zone: Asia/Tehran (+0330, +0330)
SQL> select sysdate , SYSTIMESTAMP ;
SYSDATE   SYSTIMESTAMP
--------- ----------------------------------------
15-FEB-24 15-FEB-24 01.25.54.270895 PM +03:30

SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tokyo';
Database altered.

SQL> select sysdate , SYSTIMESTAMP ;
SYSDATE   SYSTIMESTAMP
--------- ----------------------------------------
15-FEB-24 15-FEB-24 01.26.37.200429 PM +03:30

در نسخه 23ai می توان با تنظیم پارامتر time_at_dbtimezone به مقدار USER_SQL این توابع را مجاب کرد تا date را بر اساس time zone دیتابیس برگردانند صرف نظر از time zone سیستم عامل!

(بیشتر…)

اوراکل 23ai– امکان ایجاد Refreshable PDB از طریق DBCA

قابلیت Refreshable PDB از نسخه 12cR2 ارائه شد که قبلا در مورد آن مطلبی نوشتیم. برای ایجاد این نوع از PDBها، تا قبل از نسخه 23ai صرفا می توانستیم از دستور CREATE PLUGGABLE DATABASE استفاده کنیم اما در نسخه 23ai این کار از طریق ابزار DBCA هم قابل انجام است.

برای ایجاد Refreshable PDB سه گزینه جدید به DBCA اضافه شده است:

createAsRefreshablePDB: برای ایجاد Refreshable PDB باید این گزینه به TRUE تنظیم شود.

refreshMode: نحوه بروزرسانی PDB می تواند AUTO و یا MANUAL باشد.

refreshInterval : بازه زمانی بروزرسانی هم با این گزینه قابل تنظیم است.

(بیشتر…)

اوراکل 23ai- بهبودی در ویوهای دیکشنری در زمینه پارتیشن بندی

در ویوهای دیتا دیکشنری مرتبط با مبحث Partitioning، ستون HIGH_VALUE از ستونهای پرکاربرد است دیتاتایپ این ستون از نوع Long می باشد و با توجه به محدودیتهای نوع داده Long، اوراکل در نسخه 23ai، دو ستون دیگر از نوع داده JSON و CLOB برای نمایش HIGH VALUE اضافه کرده است.

SQL> create table tb(
  2    id  number,
  3    date_ date
  4  )
  5  partition by range ( date_ )
  6  interval ( numtoyminterval(1,'YEAR'))
  7  (
  8   PARTITION p2022 VALUES LESS THAN (TO_DATE('2023/01/01', 'YYYY/MM/DD')),
  9   PARTITION p2023 VALUES LESS THAN (TO_DATE('2024/01/01', 'YYYY/MM/DD')),
 10   PARTITION p2024 VALUES LESS THAN (TO_DATE('2025/01/01', 'YYYY/MM/DD'))
 11  );
Table created

برای نمایش High Value به فرمت clob می توان از ستون high_value_clob استفاده کرد:

SQL> select partition_name, high_value_clob from user_tab_partitions where  table_name = 'TB' order by 1;
PARTITION_NAME       HIGH_VALUE_CLOB                                          
-------------------- -------------------------------------------------------- 
P2022                TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
P2023                TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
P2024                TO_DATE(' 2025-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'

همچنین ستون HIGH_VALUE_JSON این اطلاعات را به صورت JSON نمایش خواهد داد:

SQL> select partition_name,HIGH_VALUE_JSON  from user_tab_partitions where  table_name = 'TB' order by 1;
PARTITION_NAME       HIGH_VALUE_JSON
-------------------- ---------------------------------------------------------
P2022                {"high_value":"2023-01-01T00:00:00"}
P2023                {"high_value":"2024-01-01T00:00:00"}
P2024                {"high_value":"2025-01-01T00:00:00"}

Roleهای OGG_CAPTURE، OGG_APPLY برای گلدن گیت – اوراکل 23ai

همانطور که می دانید برای انجام Replicate و Extract در گلدن گیت، باید کاربری با دسترسی های لازم در دیتابیس ایجاد شود تا قبل از نسخه 23c، می توانستیم از بسته DBMS_GOLDENGATE_AUTH برای دادن دسترسی های مورد نیاز در این زمینه استفاده کنیم:

SQL> EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('c##oggadmin');

اما در نسخه 23c، این پکیج قابل استفاده نیست:

SQL> EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('c##oggadmin');
ORA-26988: Cannot grant Oracle GoldenGate privileges. The procedure GRANT_ADMIN_PRIVILEGE is disabled.

و اوراکل به جای آن Roleهای OGG_CAPTURE، OGG_APPLY و OGG_APPLY_PROCREP را ارائه کرده است.

SQL> grant OGG_CAPTURE to  c##oggadmin;
Grant succeeded.

اوراکل 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

(بیشتر…)