限制DDL操作(一)
出於安全性或避免影響效能的考慮,在產品資料庫中有時候會禁止或者在一定時間段內限制DDL語句的發生。Oracle也提高了很多方法來實現這個功能,這個簡單介紹一下。
這篇介紹利用觸發器來限制DDL語句。
利用觸發器來限制DDL,可能是最容易想到的功能。利用Oracle的DDL觸發器,在DDL語句執行之前RAISE_APPLICATION_ERROR,可以有效的限制DDL語句。
下面這個例子就可以禁止資料庫中的CREATE語句:
SQL> create or replace trigger tri_restrict_create
2 before create on database
3 begin
4 raise_application_error(-20001, 'Restrict CREATE statement!');
5 end;
6 /
觸發器已建立
SQL> create synonym my_dual for dual;
create synonym my_dual for dual
*
第 1 行出現錯誤:
ORA-00604: 遞迴 SQL 級別 1 出現錯誤
ORA-20001: Restrict CREATE statement!
ORA-06512: 在 line 2
SQL> create table test (id number);
create table test (id number)
*
第 1 行出現錯誤:
ORA-00604: 遞迴 SQL 級別 1 出現錯誤
ORA-20001: Restrict CREATE statement!
ORA-06512: 在 line 2
SQL> drop trigger tri_restrict_create;
觸發器已刪除。
而下面的例子,則禁止了TEST使用者的任何DDL操作:
SQL> conn test/test
已連線。
SQL> create or replace trigger tri_restrict_test_ddl
2 before ddl on schema
3 begin
4 raise_application_error(-20001, 'Restric DDL!');
5 end;
6 /
觸發器已建立
SQL> create table test (id number);
create table test (id number)
*
第 1 行出現錯誤:
ORA-00604: 遞迴 SQL 級別 1 出現錯誤
ORA-20001: Restric DDL!
ORA-06512: 在 line 2
SQL> alter table t add fid number;
alter table t add fid number
*
第 1 行出現錯誤:
ORA-00604: 遞迴 SQL 級別 1 出現錯誤
ORA-20001: Restric DDL!
ORA-06512: 在 line 2
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
會話已更改。
SQL> drop trigger tri_restrict_test_ddl;
觸發器已刪除。
使用BEFORE DDL會對所有的DDL語句都生效,像上面的這個觸發器,就禁止了TEST使用者的一切DDL語句。
注意alter session和alter system不屬於DDL語句,因此不會受這個觸發器影響。
需要注意,雖然這個觸發器可以禁止任何DDL語句,但是並不禁止刪除當前的觸發器,這是Oracle為了避免使用者建立了這個觸發器後,無法自己刪除觸發器,從而導致使用者不可用。
使用DDL觸發器來限制DDL語句的好處是思路簡單,編寫PL/SQL程式碼也不算很複雜,而且相對比較靈活,可以在觸發器內對時間、登陸IP、使用者等一系列安全條件進行判斷,而後確定使用者是否可以執行。
不過觸發器也有一定的缺點,比如需要使用者自己編寫、維護以及驗證觸發器的程式碼,而且對於DDL的粒度控制也存在問題,比如資料庫中只希望禁止ALTER TABLE,而其他物件的ALTER並不禁止,使用觸發器就很難實現。而且如果希望禁止具體某個物件的DDL,使用觸發器的方式也比較困難。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-557966/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 限制DDL操作(四)
- 限制DDL操作(三)
- 限制DDL操作(二)
- Oracle 觸發器 限制DDL操作Oracle觸發器
- MySQL DDL操作表MySql
- clob欄位對於parallel ddl的限制Parallel
- 配置GoldenGate啟動DDL支援同步DDL操作Go
- 記錄一次 Online DDL 操作
- DDL操作的自動提交
- oracle追蹤誤操作DDLOracle
- DML操作 DDL觸發器觸發器
- 11.2.0.3.0 comment 操作不再是ddl操作???
- DDL、DML、DCL、DQL相關操作
- Mysql 基礎操作 DDL DML DCLMySql
- 資料庫DDL操作審計資料庫
- 禁止使用者的DDL操作
- 資料庫操作語言DDL資料庫
- MySQL5.7 InnoDB線上DDL操作MySql
- 04 MySQL 表的基本操作-DDLMySql
- 控制DDL許可權及紀錄DDL操作的Trigger
- OGG單向DDL複製操作
- 記錄資料庫所有ddl操作資料庫
- 如果comment不是ddl操作多好
- Oracle高可用環境之DDL操作Oracle
- MySQL的DDL和DML操作語法MySql
- logmnr挖掘中間有DDL的操作示例-對於執行DDL前的操作無法挖掘
- Oracle DBLINK 抽數以及DDL、DML操作Oracle
- 使用Logminer工具分析DML和DDL操作
- 資料庫觸發器,禁止DDL操作資料庫觸發器
- DML, DDL操作的自動提交問題
- 限制訪問表的FOR UPDATE操作
- 配置支援DML和DDL操作同步的GoldenGateGo
- Mysql系列第四講 DDL常見操作彙總MySql
- 透過觸發器禁止模式物件的DDL操作觸發器模式物件
- DDL,DML操作對結果快取的影響快取
- Oracle12c 新特性 - log記錄DDL操作Oracle
- DB2 DDL操作引起的GoldenGate錯誤DB2Go
- DDL觸發器設定導致DDL無法執行(一)觸發器