我有一個任務,涉及更新許多觸發器,這是完全相同的查詢,但應用於幾個不同的表。有沒有辦法使用FOR或類似的語句更新所有這些觸發器?實際上我需要做的是修改所有這些觸發器的WHEN子句。修改多個oracle觸發器
2
A
回答
3
您可以使用dbms_metadat此。
例如:
declare
type arr_tab is table of varchar2(30);
v_arr arr_tab;
v_trig clob;
begin
dbms_metadata.set_transform_param(DBMS_METADATA.SESSION_TRANSFORM,
'SQLTERMINATOR', FALSE);
v_arr := arr_tab('TEST_TRIG', 'TEST2_TRIG'); -- change these triggers.
for idx in 1..v_arr.count
loop
v_trig := dbms_metadata.get_ddl('TRIGGER',v_arr(idx), user);
execute immediate regexp_replace(regexp_replace(v_trig, 'ALTER TRIGGER.*', ''), 'WHEN ([^\)]*\))', 'WHEN (1=1)', 1, 1, 'mi');
end loop;
end;
/
的'WHEN ([^\)]*\))', 'WHEN (1=1)'
部分取代WHEN
子句(對我來說)WHEN (1=1)
。
0
您可以使用dba_triggers將觸發器的文本提取到CREATE或替換語句中。但由於某些列是LONG數據類型,您將無法將它們解壓縮爲VARCHAR2。這可以通過使用在Oracle站點上丟失的Tom Kytes包來解決。我包括我自己的版本,您可能需要修改它以滿足您的需求。
運行select,插入你的when子句,然後運行create或replace語句。
這將無法正常工作,由於trigger_body是一個long類型
select 'CREATE OR REPLACE TRIGGER '|| description
||trigger_body
from dba_triggers
where owner = 'Your schema'
但如果你的觸發器不超過4000個字符
這應該工作select 'CREATE OR REPLACE TRIGGER '|| description
|| ADMIN.LONG_HELP.SUBSTR_OF('select trigger_body from dba_triggers where trigger_name = :0',
1,4000,'0',dt.trigger_name)
from dba_triggers dt
where owner = 'YourSchema';
CREATE OR REPLACE PACKAGE ADMIN.LONG_HELP
/******************************************************************************
NAME: LONG_HELP
PURPOSE: Read fields of type long. (commonly found in data dictionary)
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 10/27/2011 1. Created this package. based on Tom Kyte's column here
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:839298816582
note that it only retrieves the first 4000 characters of any LONG column
USAGE in a WHERE
INSTR(
ADMIN.LONG_HELP.SUBSTR_OF('SELECT text from all_views where view_name =:o ',
1,4000,'o',m2.obj_name),m1.FK_ID) > 0
******************************************************************************/
--AUTHID CURRENT_USER
--removed to get around ORA-29470: Effective userid or roles are not the same as when cursor was parsed
--restrict usage to admin schema for Oracle 11g
AS
FUNCTION substr_of (p_query IN VARCHAR2,
p_from IN NUMBER,
p_for IN NUMBER,
p_name1 IN VARCHAR2 DEFAULT NULL ,
p_bind1 IN VARCHAR2 DEFAULT NULL ,
p_name2 IN VARCHAR2 DEFAULT NULL ,
p_bind2 IN VARCHAR2 DEFAULT NULL ,
p_name3 IN VARCHAR2 DEFAULT NULL ,
p_bind3 IN VARCHAR2 DEFAULT NULL ,
p_name4 IN VARCHAR2 DEFAULT NULL ,
p_bind4 IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2;
END LONG_HELP;
/
CREATE OR REPLACE PACKAGE BODY ADMIN.LONG_HELP
AS
g_cursor NUMBER := DBMS_SQL.open_cursor;
g_query VARCHAR2 (32765);
PROCEDURE bind_variable (p_name IN VARCHAR2, p_value IN VARCHAR2)
IS
BEGIN
IF (p_name IS NOT NULL)
THEN
DBMS_SQL.bind_variable (g_cursor, p_name, p_value);
END IF;
END BIND_VARIABLE;
FUNCTION substr_of (p_query IN VARCHAR2,
p_from IN NUMBER,
p_for IN NUMBER,
p_name1 IN VARCHAR2 DEFAULT NULL ,
p_bind1 IN VARCHAR2 DEFAULT NULL ,
p_name2 IN VARCHAR2 DEFAULT NULL ,
p_bind2 IN VARCHAR2 DEFAULT NULL ,
p_name3 IN VARCHAR2 DEFAULT NULL ,
p_bind3 IN VARCHAR2 DEFAULT NULL ,
p_name4 IN VARCHAR2 DEFAULT NULL ,
p_bind4 IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
/******************************************************************************
NAME: LONG_HELP.SUBSTR_OF
PURPOSE: CONVERT long data fields into VARCHAR2
WHOSE DATA IS CHANGED: none
WHAT USES THIS:
WHERE ARE THE RESOURCES NEEDED:
******************************************************************************/
l_buffer VARCHAR2 (4000);
l_buffer_len NUMBER;
BEGIN
IF (NVL (p_from, 0) <= 0)
THEN
raise_application_error (-20002,
'From must be >= 1 (positive numbers)');
END IF;
IF (NVL (p_for, 0) NOT BETWEEN 1 AND 4000)
THEN
raise_application_error (-20003, 'For must be between 1 and 4000');
END IF;
IF (p_query <> g_query OR g_query IS NULL)
THEN
IF (UPPER (TRIM (NVL (p_query, 'x'))) NOT LIKE 'SELECT%')
THEN
raise_application_error (-20001, 'This must be a select only');
END IF;
DBMS_SQL.parse (g_cursor, p_query, DBMS_SQL.native);
g_query := p_query;
END IF;
bind_variable (p_name1, p_bind1);
bind_variable (p_name2, p_bind2);
bind_variable (p_name3, p_bind3);
bind_variable (p_name4, p_bind4);
DBMS_SQL.define_column_long (g_cursor, 1);
IF (DBMS_SQL.execute_and_fetch (g_cursor) > 0)
THEN
DBMS_SQL.column_value_long (g_cursor,
1,
p_for,
p_from - 1,
l_buffer,
l_buffer_len);
END IF;
RETURN l_buffer;
END substr_of;
END LONG_HELP;
/
相關問題
- 1. 會話修改觸發器?
- 2. 多個表上的Oracle觸發器
- 3. 如何更改oracle中多個表的觸發器?
- 4. Oracle觸發器
- 5. 修改Oracle數據庫中的觸發器
- 6. mysql觸發器到oracle觸發器
- 7. 如何更改Oracle中的觸發器?
- 8. SQL Oracle觸發器更改日期
- 9. oracle年度更改觸發器
- 10. Oracle觸發器:raise_application_error
- 11. Oracle 10g觸發器
- 12. 觸發器在Oracle
- 13. SQL Oracle觸發器
- 14. 從Oracle觸發器
- 15. Oracle SQL(觸發器)
- 16. Oracle SQL觸發器
- 17. ORACLE 11g觸發器
- 18. 一個簡單Oracle觸發器修正案
- 19. SQL - 修改或刪除觸發器
- 20. WPF熱鍵無需修改器觸發
- 21. 在Postgresql中修改觸發器
- 22. 調用另一個觸發器的Oracle觸發器
- 23. 獲取觸發Oracle觸發器的值
- 24. Oracle AFTER INSERT觸發器未觸發
- 25. 修復我的多表觸發器?
- 26. Oracle觸發器創建 - 表正在變異;觸發器可能無法讀取或修改它
- 27. SQL觸發器列表Oracle
- 28. Oracle觸發器語法
- 29. Oracle中創建觸發器
- 30. Oracle觸發器權限