'TRIGGER' 和老闆,我相信你能OBJECT_NAME 在all_triggers中找到源代碼。不幸的是,這些數據是LONG變量(Oracle的例子,就像我說的那樣,而不是我)。所以,最簡單的事情是創建一個臨時表來使用,以轉換爲CLOB數據填充它,然後搜索:
CREATE TABLE tr (trigger_name VARCHAR2(32), trigger_body CLOB);
INSERT INTO tr
(SELECT trigger_name, TO_LOB(trigger_body)
FROM all_triggers
WHERE owner = 'xxx');
SELECT trigger_name
FROM tr
WHERE trigger_body LIKE '%something%';
我不知道爲什麼dba_source視圖只人煙稀少的觸發器。我的10.2.0.4數據庫也是這樣。
編輯:
這裏是一個簡短的腳本,你可以用它來重建所有觸發器,他們都應該是dba_source在這一點:
CREATE TABLE temp_sql (sql1 CLOB, sql2 CLOB);
INSERT INTO temp_sql (sql1, sql2) (
SELECT 'CREATE OR REPLACE TRIGGER '||
DESCRIPTION||' '||CASE WHEN when_clause IS NULL THEN NULL ELSE 'WHEN('||when_clause||')' END sql1,
to_lob(trigger_body) sql2
FROM all_triggers
WHERE table_owner = 'theowner');
DECLARE
v_sql VARCHAR2(32760);
BEGIN
FOR R IN (SELECT sql1||' '||sql2 S FROM temp_sql) LOOP
v_sql := R.s;
EXECUTE IMMEDIATE v_sql;
END LOOP;
END;
/
也許我應該補充說這是在我們的開發環境中,所以不管我做什麼都不會搞亂生產。 – AndyDan
源代碼管理中的觸發器,還是僅僅在數據庫中?如果在源代碼控制中(它們應該在那裏),那麼你應該能夠對存儲觸發器的文件進行文本搜索。我承認搜索數據庫通常更容易,但關鍵是數據庫不應該成爲代碼的「主副本」,即使是開發者 - 我也從多年前的錯誤教訓中學到了錯誤的開發數據庫時的難題! –
不幸的是,它們不在任何源代碼控制中,只是在數據庫中。希望我能說服團隊其他人,否則就是這樣(我在這裏已經有7年了,我仍然是這裏的新手)。也許我可以用它來推動這一點! – AndyDan