繁体   English   中英

如何使用 pgAdmin4 为数据库中的所有触发器和表生成脚本

[英]How to Generate Scripts For All Triggers and tables in Database Using pgAdmin4

我想生成一个 SQL 脚本,其中包含用于创建我们数据库中存在的所有触发器和表的 SQL。 我已经尝试过右键单击表格,选择script -> create Scripts 虽然这确实为该表创建了一个 SQL 脚本,但它并没有为该表的触发器函数创建一个脚本。 我该怎么办?

我也试过:

SELECT tgrelid::regclass
     , tgname
     , pg_get_triggerdef(oid)
     , pg_get_functiondef(tgfoid)
FROM   pg_trigger
WHERE  tgrelid = 'public.tablename'::regclass;

但它没有用,因为它创建了一个 CSV 文件。

pg_dump可能是这里的最佳选择,因为它是与 Postgres 捆绑在一起的导出工具,旨在(或多或少)做到这一点。 您指定的要求的唯一问题是它特别要求某些对象类型(我在这里假设这是一个严格的要求)。

pg_dump确实有-s (--schema-only)标志,它将转储所有对象(不仅仅是表和触发器)的所有create语句。 所以我想有两种选择:

  1. 转储整个事情,然后整理出来。 我真的不喜欢这个想法,因为你必须经历围绕各种不同 SQL 语句的开始/结束编写脚本的麻烦,以便挑选出需要删除的内容。 太乱了
  2. 编写一个包装pg_dump的脚本,并且只预选触发器和表 让脚本使用psql查询 Postgres 系统表以获取所有tabletrigger对象的名称。 然后将该列表输入pg_dump以单独导出每个对象。

选项 2 听起来容易得多,但也更慢,因为我认为触发器可能需要一个一个地完成(可以使用pg_dump-t (--table=TABLE)选项批量完成-t (--table=TABLE) )。 但是由于它只是转储模式对象而没有数据,所以它可能不会产生很大的不同。

您可以像这样挑选触发器:

pg_dump -s -Fc | pg_restore --trigger='my_trigger'

这可以包含在一个脚本中:

#!/bin/bash

my_db='db_name'

triggers=($(psql --dbname="${my_db}" -A -R ', ' -t \
            -c 'select tgname from pg_trigger'))

for trigger in "${triggers[@]}"; do
  pg_dump -s -Fc | pg_restore --trigger="$trigger"
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM