触发器使用的函数的依赖关系?

时间:2011-02-14 20:24:36

标签: database-design postgresql dependencies

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

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

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

2 个答案:

答案 0 :(得分:1)

因此,您想知道触发器调用的函数中使用了哪些表。那是不可能的。请参阅暂停问题。在当前版本中,PostgreSQL不会尝试跟踪这一点,即使在某些情况下可能会出现这种情况(语言SQL函数会浮现在脑海中,但无论如何都无法编写触发器)。事实上,半官方建议使用函数作为绕过依赖系统的一种方法。

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

答案 1 :(得分:0)

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

SELECT tgfoid FROM pg_trigger WHERE oid = %u

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

等等。取决于您有哪些信息。

pg_depend还有关于此的记录。