限制DDL操作(二)

yangtingkun發表於2009-02-27

出於安全性或避免影響效能的考慮,在產品資料庫中有時候會禁止或者在一定時間段內限制DDL語句的發生。Oracle也提高了很多方法來實現這個功能,這個簡單介紹一下。

這篇介紹DISABLE TABLE LOCK語句。

限制DDL操作(一):http://yangtingkun.itpub.net/post/468/479244

 

 

Oracle支援在表級禁止DDL語句,透過設定表的DISABLE TABLE LOCK,可以禁止DDL操作修改表:

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));

表已建立。

SQL> ALTER TABLE T DISABLE TABLE LOCK;

表已更改。

SQL> ALTER TABLE T ADD AGE NUMBER(3);
ALTER TABLE T ADD AGE NUMBER(3)
*
1 行出現錯誤:
ORA-00069:
無法獲得鎖 -- T 禁用了表鎖定


SQL> CREATE INDEX IND_T_NAME ON T(NAME);

索引已建立。

SQL> ALTER TABLE T RENAME TO T_TEST;
ALTER TABLE T RENAME TO T_TEST
*
1 行出現錯誤:
ORA-00069:
無法獲得鎖 -- T 禁用了表鎖定


SQL> DROP TABLE T PURGE;
DROP TABLE T PURGE
           *
1 行出現錯誤:
ORA-00069:
無法獲得鎖 -- T 禁用了表鎖定

可以看到,設定了DISABLE TABLE LOCK之後,無論是ALTER TABLE還是DROP TABLE都無法成功,但是這種方法並不妨礙索引在這個表上的建立,同樣,建立檢視、觸發器、同義詞等操作都是允許的:

SQL> CREATE VIEW V_T AS SELECT * FROM T;

檢視已建立。

SQL> CREATE TRIGGER T BEFORE INSERT ON T
  2  BEGIN
  3  NULL;
  4  END;
  5  /

觸發器已建立

SQL> CREATE SYNONYM S_T FOR T;

同義詞已建立。

這個操作只是禁止了在表上獲取鎖:

SQL> LOCK TABLE T IN EXCLUSIVE MODE;
LOCK TABLE T IN EXCLUSIVE MODE
*
1 行出現錯誤:
ORA-00069:
無法獲得鎖 -- T 禁用了表鎖定

因此手工鎖表的操作也是被禁止的。

SQL> ALTER TABLE T ENABLE TABLE LOCK;

表已更改。

SQL> DROP TABLE T PURGE;

表已刪除。

恢復表的TABLE LOCK設定,則可以對錶進行DDL操作。

這種方法來限制DDL的好處是可以粒度是物件級,而且設定和取消都十分方便。

缺點是隻能用來限制表的DDL,其他DDL沒有辦法限制,甚至連表上的索引相關的DDL都無法禁止。

需要注意上面的測試是在10g中進行的,在9i中,則結果會有所區別:

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));

表已建立。

SQL> ALTER TABLE T DISABLE TABLE LOCK;

表已更改。

SQL> CREATE INDEX IND_T_NAME ON T(NAME);
CREATE INDEX IND_T_NAME ON T(NAME)
                           *
1 行出現錯誤:
ORA-00069:
無法獲得鎖定 -- T禁用了表鎖定


SQL> DROP TABLE T;
DROP TABLE T
           *
1 行出現錯誤:
ORA-00069:
無法獲得鎖定 -- T禁用了表鎖定


SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

9i中,禁止了表的鎖,則在表上是無法建立索引的。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-558132/,如需轉載,請註明出處,否則將追究法律責任。

相關文章