【问题标题】:Dependencies of functions used by triggers?触发器使用的函数的依赖关系?
【发布时间】:2011-02-14 20:24:35
【问题描述】:

我有一个 Postgres 数据库,它存储我们系统收集的所有信息,然后是一个称为回放的模式,其中包含公共模式中包含的一小部分表。这个回放模式是使用自动化脚本创建的,该脚本在模式中提供了少数需要的视图/表,然后它找到所有依赖的表并在模式中创建它们。 (This answer 显示了我如何检索依​​赖项)

其中一些表当前是使用规则自动填充的,这意味着 pg_depends 表中有一个可以查询的条目。我们目前正在将其中一些规则转换为调用函数的触发器,因为当将大块数据复制到回放模式中时,currval('some_sequence') 无法正常工作。 (This answer 也建议这是正确的做法)

不幸的是,这意味着 pg_depends 中不再有条目,并且创建模式的自动化脚本遗漏了一些表。有没有办法让我从函数/触发器中检索类似的依赖信息?还是有更好的方法来做到这一点?

【问题讨论】:

    标签: database-design postgresql dependencies


    【解决方案1】:

    所以你想知道触发器调用的函数中使用了哪些表。那是不可能的。有关原因,请参见停止问题。在当前版本中,PostgreSQL 不会尝试跟踪这一点,即使在某些情况下它可能是可能的(想到语言 SQL 函数,但无论如何你不能编写触发器)。事实上,半官方推荐使用函数来规避依赖系统。

    在您的应用程序中,您可能应该自己寻找一种方法来跟踪这些依赖项。

    【讨论】:

    • 我在 PL\pgSQL 中编写函数,不幸的是没有从生成的函数中提取信息的机制,但我想我会想出另一个解决方案来跟踪这些信息数据库外部。
    【解决方案2】:

    所以您正在寻找一种方法来获取触发器使用的函数?

    SELECT tgfoid FROM pg_trigger WHERE oid = %u
    

    SELECT tgfoid FROM pg_trigger WHERE tgrelid = '%s'::regclass AND tgname = '%s'
    

    等等。取决于你有什么可用的信息。

    pg_depend也有这方面的记录。

    【讨论】:

    • 我实际上是在寻找触发器调用的函数中使用的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多