如何从C#代码中访问Oracle数据库触发器?
我想创建一个检查表的程序,并将它们与Oracle中该表的触发器进行比较。 我想看看表中的每一列是否在触发器代码中都有对应的“部分”。 我需要通过C#代码对触发器进行读/写访问。
这可能吗? 如何从C#代码访问数据库触发器?
实施例: TableA有2列,Type和Value。 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不完整,因为它只监视Type,而不是Value。 需要从其原始状态编辑触发器,以包含监视“值”列的代码 //结束示例
答案 0 :(得分:1)
您可以使用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;