'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