出于安全性或避免影响性能的考虑,在产品数据库中有时候会禁止或者在一定时间段内限制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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-558132/