如何从C#代码访问Oracle数据库触发器代码

时间:2013-08-20 17:19:50

标签: c# oracle triggers

如何从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。 需要从其原始状态编辑触发器,以包含监视“值”列的代码 //结束示例

1 个答案:

答案 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;