在表的某些更改后,我的数据库中的一些触发器在表格上发生了无效。但似乎他们仍在工作。我拥有的唯一问题是如果我使用SQL Developer,触发器的左侧有红色十字架,表示它们无效。这是一个大问题吗?

我知道我可以重新编译触发器来解决这个问题,但我不确定这是否真的是值得关注的问题。如果是这样,我需要查看我之前的数百个更改,并找出导致问题的原因。谢谢。

有帮助吗?

解决方案

每当我们将更改部署到数据库对象时,任何代码取决于它的代码无效。这会影响触发器,视图和存储过程。但是,下次调用该代码的内容数据库将自动重新编译它。

所以我们不需要担心这个,对吗?嗯,是的,最多一点。事实是,触发器(或其他)的无效是向我们的标志,这已经提出了一个可能影响该触发器的操作,这可能具有副作用。最明显的副作用是触发器无法编译。更巧妙地,触发器编译但在操作期间失败。

因此,迫使触发器在开发环境中重新编译是一个好主意,以确保我们的变化没有从根本上破坏任何东西。但是,当我们部署生产变化时,我们可以跳过这一步,因为我们确信一切都会根据需求重新编译。取决于我们的神经:)

Oracle提供了用于自动重新编译模式中所有无效对象的机制。

  • 最简单的是使用DBMS_UTILITY.COMPILE_SCHEMA()。但由于8i以来,这一直是狡猾的(因为对Java存储过程的支持引入了循环依赖性的可能性),并且不再保证首次成功编译所有对象。

  • 在9i Oracle中给了我们一个重新编译的脚本$ORACLE_HOME/rdbms/admin/utlrp.sql。不幸的是,它需要Sysdba访问权限。

  • 在10g中,他们添加了utl_recomp包,基本上是脚本所做的一切。这是重新编译大量对象的推荐方法。不幸的是,它还需要SYSDBA访问权限。 了解更多

在11g Oracle中引入了细粒度的依赖管理。这意味着在更精细的粒度(基本上列级别而不是表级)的较大粒度(基本上列级别),而且只影响对表的对象受到影响。 找出更多

其他提示

根本不是一个大问题。

刚右键点击他们重新编译,你很高兴......我从自己的经验中写这篇文章。

如果您刚刚更改的代码有任何错误,它们将出现,以便您可以修复它。编译器将告诉您错误的问题(行号,变量名称等)在哪里。

如果触发器正在运行,那么它可能会捕获ORA-04068错误时触发触发器并在自动重新编译后重试触发器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top