0

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

我想创建一个程序来检查表,并将它们与 Oracle 中该表的触发器进行比较。然后我想看看表中的每一列是否在触发器代码中都有相应的“部分”。我需要通过 C# 代码对触发器进行读/写访问。

这可能吗?如何从 C# 代码访问数据库触发器?

示例:TableA 有 2 列,类型和值。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 是不完整的,因为它只监视类型,而不是值。触发器需要从其原始状态进行编辑,以包含用于监控值列的代码 //end example

4

1 回答 1

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;
于 2013-08-20T17:40:02.133 回答