[20210720]修改TRI_PREVENT_DROP_TRUNCATE觸發器.txt
[20210720]修改TRI_PREVENT_DROP_TRUNCATE觸發器.txt
--//另外的生產系統出現如下錯誤,可以參考我以前的連結::
ORA-20000: YOU CAN NOT TRUNCATE or DROP BIN$Bo/SlefRJ3fgU2ljqMCCgg==$0 TABLE!
ORA-06512: 在 line 6
ORA-06512: 在 "SYS.INSERT_DOCTOR_LOGS", line 17
ORA-06512: 在 line 1
--//為了避免以後再次出現錯誤,修改TRI_PREVENT_DROP_TRUNCATE觸發器在測試環境測試看看::
1.環境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
CREATE OR REPLACE TRIGGER SYS.TRI_PREVENT_DROP_TRUNCATE
BEFORE TRUNCATE OR DROP
ON DATABASE
BEGIN
--//dbms_output.put_line( ora_dict_obj_type);
IF ora_dict_obj_type IN ('TABLE', 'SEQUENCE')
AND ora_dict_obj_owner = 'SCOTT'
AND ( ORA_DICT_OBJ_NAME NOT LIKE 'SYS\_JOURNAL\_%' ESCAPE '\'
AND ORA_DICT_OBJ_NAME NOT LIKE
'SYS\_EXPORT\_SCHEMA_%' ESCAPE '\'
AND ORA_DICT_OBJ_NAME NOT IN ('SCHEDULER$_PROGRAM_ARG'
,'SCHEDULER$_JOB_ARG')
OR ( ORA_DICT_OBJ_NAME NOT LIKE 'BIN$%'
AND LENGTHB (ORA_DICT_OBJ_NAME) = 30))
THEN
raise_application_error
(
-20000
,'YOU CAN NOT TRUNCATE or DROP ' || ora_dict_obj_name || ' TABLE!'
);
END IF;
END;
/
--//以上寫錯了,加入長度判斷的情況後,感覺有點暈,瞬間感覺自己不會寫程式碼了。改寫如下:
CREATE OR REPLACE TRIGGER SYS.TRI_PREVENT_DROP_TRUNCATE
BEFORE TRUNCATE OR DROP
ON DATABASE
BEGIN
--//dbms_output.put_line( ora_dict_obj_type);
IF ORA_DICT_OBJ_TYPE IN ('TABLE', 'SEQUENCE')
AND ORA_DICT_OBJ_OWNER = 'SCOTT'
AND ORA_DICT_OBJ_NAME NOT LIKE 'SYS\_JOURNAL\_%' ESCAPE '\'
AND ORA_DICT_OBJ_NAME NOT LIKE 'SYS\_EXPORT\_SCHEMA_%' ESCAPE '\'
AND ORA_DICT_OBJ_NAME NOT IN ('SCHEDULER$_PROGRAM_ARG' ,'SCHEDULER$_JOB_ARG')
AND NOT ( ORA_DICT_OBJ_NAME LIKE 'BIN$%==$0' AND LENGTHB (ORA_DICT_OBJ_NAME) = 30)
THEN
raise_application_error ( -20000 ,'YOU CAN NOT TRUNCATE or DROP ' || ora_dict_obj_name || ' TABLE!');
END IF;
END;
/
--//增加排除ORA_DICT_OBJ_NAME LIKE 'BIN$%'的情況。我不知道drop後這些物件的命名規則,似乎都是BIN$開頭,結尾==$0,並且長度等
--//於30。
2.測試:
CREATE TABLESPACE SUGAR DATAFILE
'/mnt/ramdisk/book/sugar01.dbf' SIZE 10M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
2.測試:
create table tx tablespace sugar as select * from all_objects;
create table ty tablespace sugar as select * from all_objects where rownum<=10000;
drop table ty ;
alter TRIGGER SYS.TRI_PREVENT_DROP_TRUNCATE enable ;
SCOTT@book> update tx set owner=lpad('a',30,'a');
SCOTT@book> select owner c30 ,OBJECT_NAME from tx where rownum=1;
C30 OBJECT_NAME
------------------------------ --------------------
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ICOL$
SCOTT@book> rollback ;
Rollback complete.
--//OK,沒有報錯,這樣開發一般不會建立這樣的物件,問題應該暫時解決。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2782589/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20210104]禁用或者刪除觸發器2.txt觸發器
- D觸發器觸發器
- mysql觸發器MySql觸發器
- MySql-觸發器MySql觸發器
- sqlserver 列觸發器SQLServer觸發器
- 除錯觸發器除錯觸發器
- 建立MySQL觸發器MySql觸發器
- SqlServer-觸發器SQLServer觸發器
- logon觸發器for dbaGo觸發器
- MySQL使用觸發器MySql觸發器
- 語句觸發器觸發器
- React setState和修改props觸發的鉤子React
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- 行為和觸發器觸發器
- MySQL觸發器介紹MySql觸發器
- sql-server觸發器SQLServer觸發器
- 觸發器 REFERENCING OLD AS OLD觸發器
- Oracle開發基礎-觸發器Oracle觸發器
- mvvm模式 事件觸發器[wpf]MVVM模式事件觸發器
- MySQL入門-- TRIGGER(觸發器)MySql觸發器
- SQL Server:觸發器詳解SQLServer觸發器
- SQL Server 觸發器詳情HOPPSQLServer觸發器
- 禁止oracle表的觸發器triggerOracle觸發器
- MSMQ 觸發器 安裝失敗MQ觸發器
- MySQL觸發器的使用規則MySql觸發器
- SqlServer觸發器的建立與使用SQLServer觸發器
- SQL觸發器例項講解SQL觸發器
- Windows修改新建.txt檔名Windows
- [20220329]批量修改檔名.txt
- [20181204]bbed修改問題.txt
- [20180927]修改sql prompt提示.txtSQL
- 暫存器,觸發器,三極體小結觸發器
- 將input標籤的內容設定為修改觸發操作
- OGG DDL觸發器引發的故障系列(一)觸發器
- 雲開發 CloudBase 已上線觸發器能力Cloud觸發器
- 25. 使用MySQL之使用觸發器MySql觸發器
- 資料庫檢視,索引,觸發器資料庫索引觸發器
- 資料庫的觸發器的使用資料庫觸發器