首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从C#代码中访问Oracle数据库触发器代码

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

Stack Overflow用户
提问于 2013-08-20 17:19:49
回答 1查看 1.1K关注 0票数 0

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

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

这个是可能的吗?如何从C#代码访问DB触发器?

示例: TableA有两个列,类型和值。Trigger_TableA只有以下代码:

代码语言:javascript
复制
....
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是不完整的,因为它只是监视类型,而不是值。触发器需要从其原始状态中编辑,以包含监视值列//结束示例的代码

EN

回答 1

Stack Overflow用户

发布于 2013-08-20 17:40:02

可以使用User_Triggers视图找到触发表的触发器的名称:

代码语言:javascript
复制
SELECT Trigger_Name
FROM User_Triggers
WHERE Table_Name = 'my-table-name';

要获取触发器代码,请查询User_Source

代码语言:javascript
复制
SELECT Text
FROM User_Source
WHERE Name = 'my-trigger-name' AND Type = 'TRIGGER'
ORDER BY Line

增编

由于每一列都将得到相同的处理,这样的内容可能会更好(注意,它很粗糙且未经测试;可能需要调整):

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18341212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档