sql - 如何在 Postgres 中自动创建对 CREATE 的评论?
问题描述
我想创建一个触发器,一旦在模式中创建表,就会触发该触发器。此触发器应向新创建的表添加注释,例如:
CREATE TRIGGER my_trigger
AFTER CREATE ON my_schema
EXECUTE PROCEDURE add_comment;
像这样做somthibg add_comment
:
...
BEGIN
EXECUTE '
COMMENT ON TABLE ' || new_table || ' IS ''Created by ' || CURRENT_USER || ' on ' || CURRENT_TIME ''';
';
但是,似乎我只能在表级别添加触发器。我怎样才能在纯 Postgres 中为新创建的表添加评论?
解决方案
你需要一个EVENT TRIGGER
.
首先创建一个函数:
CREATE OR REPLACE FUNCTION trg_create_table_comment() RETURNS event_trigger
LANGUAGE plpgsql AS $$
DECLARE obj record;
BEGIN
SELECT * FROM pg_event_trigger_ddl_commands() INTO obj;
EXECUTE 'COMMENT ON TABLE ' || obj.object_identity || ' IS ''Created by ' || SESSION_USER || ' on ' || NOW() || '''';
END;
$$;
然后将其附加到EVENT TRIGGER
:
CREATE EVENT TRIGGER trg_create_table ON ddl_command_end
WHEN TAG IN ('CREATE TABLE','CREATE TABLE AS')
EXECUTE PROCEDURE trg_create_table_comment();
创建表后,它将被触发:
CREATE TABLE foo (id int);
SELECT schemaname,tablename,tableowner,description
FROM pg_tables t
LEFT JOIN pg_description d ON d.objoid = t.tablename::regclass::oid
WHERE tablename = 'foo';
schemaname | tablename | tableowner | description
------------+-----------+------------+---------------------------------------------------
public | foo | jones | Created by jones on 2021-04-10 20:22:22.174874+02
推荐阅读
- vba - 如何使用 VBA 更新表中的现有字段
- azure - 为什么我的服务主体无权访问我的密钥保管库?
- paypal - 在 Amps 中触发更新时出现 MarkLogic“找不到触发模块”错误
- laravel - 为什么 Laravel 5.8 在使用会话时对数据库进行重复查询
- sql - 如何在 Postgresql 中索引此查询?
- solr - SOLR 在尝试检索文档时抛出异常
- elixir - 将相同的键数据合并到一个具有唯一键的映射中
- python - 如何通过bs4 python中的类似字符串在页面中查找特定链接
- c++ - 当两个整数的第一个元素都是负数时,如何正确使用 < 和 > 运算符来处理 2 个整数向量?
- python - 使用 freedesktop 门户使用 Python 截屏