如何从C#代码中访问Oracle数据库触发器?
我想要创建一个程序来检查表,并将它们与Oracle中的表的触发器进行比较。然后,我想看看表中的每一列是否在触发器代码中都有相应的“节”。我需要通过C#代码对触发器进行读写访问。
这个是可能的吗?如何从C#代码访问DB触发器?
示例: TableA有两个列,类型和值。Trigger_TableA只有以下代码:
....
IF (:OLD.TYPE IS NULL AND :NEW.TYPE IS NOT NULL) OR
(:OLD.TYPE<> :NEW.TYPE) THEN
vWhat_Changed := vWhat_Changed || ',TYPE='||:OLD.TYPE;
END IF;
.....Trigger_TableA是不完整的,因为它只是监视类型,而不是值。触发器需要从其原始状态中编辑,以包含监视值列//结束示例的代码
发布于 2013-08-20 17:40:02
可以使用User_Triggers视图找到触发表的触发器的名称:
SELECT Trigger_Name
FROM User_Triggers
WHERE Table_Name = 'my-table-name';要获取触发器代码,请查询User_Source
SELECT Text
FROM User_Source
WHERE Name = 'my-trigger-name' AND Type = 'TRIGGER'
ORDER BY Line增编
由于每一列都将得到相同的处理,这样的内容可能会更好(注意,它很粗糙且未经测试;可能需要调整):
DECLARE
sqlString VARCHAR2(4000);
CURSOR colNames IS
SELECT Column_Name
FROM User_Tab_Columns
WHERE Table_Name = 'this-table-name';
BEGIN
FOR rCols IN colNames LOOP
sqlString :=
'BEGIN ' ||
' IF (:OLD.' || rCols.Column_Name || ' IS NULL AND :NEW.' || rCols.Column_Name || ' IS NOT NULL) OR ' ||
' (:OLD.' || rCols.Column_Name || '<> :NEW.' || rCols.Column_Name || ') THEN' ||
' vWhat_Changed := vWhat_Changed || ',' || rCols.Column_Name || '=' || :OLD.' || rCols.Column_Name || ';' ||
' END IF; ' ||
'END;';
EXECUTE IMMEDIATE sqlString;
END LOOP;
END;https://stackoverflow.com/questions/18341212
复制相似问题