RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1576174
Accepted
alex_t
alex_t
Asked:2024-04-15 00:16:53 +0000 UTC2024-04-15 00:16:53 +0000 UTC 2024-04-15 00:16:53 +0000 UTC

PostgreSQL DBMS 中的 information_schema.triggers 和 pg_trigger 有什么区别

  • 772

我正在使用PostgreSQL 13。我目前正在研究触发器。问题是:我怎样才能看到到目前为止我创建了哪些触发器?我在网上找到了2种方法:

方法一:

-- Посмотреть, какие есть триггеры:
select *
from information_schema.triggers;

结果(并非屏幕截图中的所有列): 在此输入图像描述

方法二:

-- Посмотреть триггеры:
select *
from pg_trigger;

结果(并非所有列): 在此输入图像描述

第一种方法看起来信息更丰富一些。一般来说,information_schema.triggers和pg_trigger表之间还有其他区别吗?

postgresql
  • 1 1 个回答
  • 19 Views

1 个回答

  • Voted
  1. Best Answer
    Мелкий
    2024-04-15T16:43:01Z2024-04-15T16:43:01Z

    一切information_schema都是 SQL 规范所描述的数据库结构信息的表示。也就是说,它是可移植到其他 DBMS 的,作为一个标准,结构只根据标准的要求而改变(也就是说,我们可以说它没有改变),但是,正如预期的那样,它不会显示 DBMS 的特性,而这些特性是不在 SQL 规范中。

    information_schema.triggers- 这就是view上面的内容pg_trigger(+一些东西),在 psql 中,该命令\d+ information_schema.triggers甚至会显示该视图是如何声明的:

     SELECT current_database()::information_schema.sql_identifier AS trigger_catalog,
        n.nspname::information_schema.sql_identifier AS trigger_schema,
        t.tgname::information_schema.sql_identifier AS trigger_name,
        em.text::information_schema.character_data AS event_manipulation,
        current_database()::information_schema.sql_identifier AS event_object_catalog,
        n.nspname::information_schema.sql_identifier AS event_object_schema,
        c.relname::information_schema.sql_identifier AS event_object_table,
        rank() OVER (PARTITION BY (n.nspname::information_schema.sql_identifier), (c.relname::information_schema.sql_identifier), em.num, (t.tgtype::integer & 1), (t.tgtype::integer & 66) ORDER BY t.tgname)::information_schema.cardinal_number AS action_order,
            CASE
                WHEN pg_has_role(c.relowner, 'USAGE'::text) THEN (regexp_match(pg_get_triggerdef(t.oid), '.{35,} WHEN \((.+)\) EXECUTE FUNCTION'::text))[1]
                ELSE NULL::text
            END::information_schema.character_data AS action_condition,
        SUBSTRING(pg_get_triggerdef(t.oid) FROM POSITION(('EXECUTE FUNCTION'::text) IN (SUBSTRING(pg_get_triggerdef(t.oid) FROM 48))) + 47)::information_schema.character_data AS action_statement,
            CASE t.tgtype::integer & 1
                WHEN 1 THEN 'ROW'::text
                ELSE 'STATEMENT'::text
            END::information_schema.character_data AS action_orientation,
            CASE t.tgtype::integer & 66
                WHEN 2 THEN 'BEFORE'::text
                WHEN 64 THEN 'INSTEAD OF'::text
                ELSE 'AFTER'::text
            END::information_schema.character_data AS action_timing,
        t.tgoldtable::information_schema.sql_identifier AS action_reference_old_table,
        t.tgnewtable::information_schema.sql_identifier AS action_reference_new_table,
        NULL::name::information_schema.sql_identifier AS action_reference_old_row,
        NULL::name::information_schema.sql_identifier AS action_reference_new_row,
        NULL::timestamp with time zone::information_schema.time_stamp AS created
       FROM pg_namespace n,
        pg_class c,
        pg_trigger t,
        ( VALUES (4,'INSERT'::text), (8,'DELETE'::text), (16,'UPDATE'::text)) em(num, text)
      WHERE n.oid = c.relnamespace AND c.oid = t.tgrelid AND (t.tgtype::integer & em.num) <> 0 AND NOT t.tgisinternal AND NOT pg_is_other_temp_schema(n.oid) AND (pg_has_role(c.relowner, 'USAGE'::text) OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text) OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES'::text));
    

    pg_trigger这是系统目录 ( ) 的一部分pg_catalog,实际上存储有关所有触发器的数据,包括使所有 postgresql 功能正常工作所需的属性。与 不同的是information_schema,对象pg_catalog不仅不承诺持久性,相反,它们承诺在每个新的主要版本中(例如,从 postgresql 13 升级到 14 时),pg_catalog如果 postgresql 开发人员有必要,任何内容都可以以任何方式更改。一些原因。当然,这里的关键是“如果需要的话”,所以它通常pg_catalog不会改变太多。


    也就是说,两种方法本质上是相同的,信息来源相同。但这些方法之间存在真正的区别:根据标准的要求,请注意我引用的定义中的 WHERE view:它检查访问权限。查询 cpg_trigger不考虑表结构的秘密,并且会向您显示触发器,包括那些 information_schema 由于缺乏用户权限而隐藏的触发器。

    • 2

相关问题

  • 表不可见

  • 如何修复 postgresql 堆栈深度限制超出错误?

  • 如何为 PostgreSQL 添加 ENUM

  • PostgreSQL:如何在冲突中执行插入操作?

  • 在哪里可以看到所有 postgre 宏?

  • SQL。将SELECT结果合并为一行,需要将得到的结果替换为可读的结果

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5