出于安全性或避免影响性能的考虑,在产品数据库中有时候会禁止或者在一定时间段内限制DDL语句的发生。Oracle也提高了很多方法来实现这个功能,这个简单介绍一下。
这篇介绍DML_LOCKS初始化参数。
限制DDL操作(一):http://yangtingkun.itpub.net/post/468/479244
限制DDL操作(二):http://yangtingkun.itpub.net/post/468/479277
前面介绍了触发器和ALTER TABLE DISABLE TABLE LOCK的方式,这里在介绍一种对整个数据库系统有效的方法,设置DML_LOCKS初始化参数。
SQL> SHOW PARAMETER DML_LOCKS
NAME TYPE VALUE
------------------------------------ ----------- --------------------------
dml_locks integer 748
SQL> ALTER SYSTEM SET DML_LOCKS = 0 SCOPE = SPFILE;
系统已更改。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 177282664 bytes
Fixed Size 454248 bytes
Variable Size 109051904 bytes
Database Buffers 67108864 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> ALTER TABLE T ADD NAME VARCHAR2(30);
ALTER TABLE T ADD NAME VARCHAR2(30)
*
ERROR 位于第 1 行:
ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0
SQL> CREATE INDEX IND_T_ID ON T(ID);
CREATE INDEX IND_T_ID ON T(ID)
*
ERROR 位于第 1 行:
ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0
SQL> RENAME T TO T_TEST;
RENAME T TO T_TEST
*
ERROR 位于第 1 行:
ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0
SQL> DROP TABLE T;
DROP TABLE T
*
ERROR 位于第 1 行:
ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0
SQL> CREATE VIEW V_T AS SELECT * FROM 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
可以看到,设置DML_LOCKS参数为0后,在对DDL语句的禁止效果上相当于对系统中所有的表都执行了ALTER TABLE DISABLE TABLE LOCK语句。
这个操作仍然是禁止了表的修改的DDL语句,而不会禁止其他DDL语句的发生。
这个方法的优点是可以方便的禁止整个系统中所有表的修改。
缺点就是粒度太过粗糙,而且和ALTER TABLE DISABLE TABLE LOCK方法一样,只能针对表的修改,而无法处理其他类型的DDL操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-558174/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-558174/