טבלאות לקריאה בלבד

בגרסאות קודמות אם היינו רוצים לסמן טבלאות מסויימות לקריאה בלבד (read only) היינו מסירים את ההרשאות הכתיבה עליהן מכל המשתמשים ומקווים לטוב. למה מקווים לטוב? כי למרות הרצון הטוב, לא ניתן לבטל את ההרשאות של הבעלים (owner) של הטבלה ולכן הוא היה יכול להמשיך לשנות אותה (אפילו בטעות) למרות ההגדרה האפליקטיבית שביצענו.

החל מגרסה 11gR1 ניתן לנעול טבלה ולהגדיר אותה כ-read only ובכך למנוע גישת כתיבה אליה (כמובן שניתן להמשיך לקרוא ממנה).


הכוונה בגישת כתיבה כוללת:

  • פקודות insert,update, delete, merge.
  • פקודת truncate.
  • פקודות alter על הטבלה (לדוגמה, הוספת עמודה).

הגדרת טבלה כ-read only לא כוללת:

  • פקודת drop.
  • פקודת move.

ניתן לראות סטטוס של טבלה (אם היא במצב קריאה בלבד) ב-USER/ALL/DBA_TABLES (עמודה: READ_ONLY).

SQL> drop table zohar1;

Table dropped.

SQL> CREATE TABLE zohar1 (a NUMBER, b VARCHAR2 (20), my_date DATE);

Table created.

SQL> alter table zohar1 read only;

Table altered.

SQL> INSERT INTO zohar1 (a, b, my_date) VALUES (10, 'aaa', SYSDATE);
INSERT INTO zohar1 (a, b, my_date) VALUES (10, 'aaa', SYSDATE)
            *
ERROR at line 1:
ORA-12081: update operation not allowed on table "ZELKAYAM2"."ZOHAR1"


SQL> delete zohar1
  2  /
delete zohar1
       *
ERROR at line 1:
ORA-12081: update operation not allowed on table "ZELKAYAM2"."ZOHAR1"

SQL> select table_name, READ_ONLY from user_tables
where table_name = 'ZOHAR1'
/
  2    3
TABLE_NAME                     REA
------------------------------ ---
ZOHAR1                         YES

SQL> alter table zohar1 read write;

Table altered.

SQL>  INSERT INTO zohar1 (a, b, my_date) VALUES (10, 'aaa', SYSDATE);

1 row created.

SQL> commit;

Commit complete.
2 תגובות
  1. גיא
    גיא says:

    אם אני רוצה כל מקרה לתת אפשרות לstored procedure לשנות/להוסיף נתונים על טבלה בread only, האם אני חייב לשנות את הטבלה לread write, לעשות מה שאני צריך ולשנות חזרה או שיש דרך לעקוף את ההגנה בתוך הפקודה?

    הגב
  2. Zohar Elkayam
    Zohar Elkayam says:

    טבלה ב-read only היא טבלה שלא ניתן לשנות אותה – לא על ידי פקודות ישירות ולא על ידי Stored procedures. אם רוצים שרק stored procedure ישנה אותה אז צריך לשחק עם ההרשאות ולא לעשות אותה read only.

    הגב

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

This site uses Akismet to reduce spam. Learn how your comment data is processed.