在postgreSQL中安装扩展模块后提取表名?

在postgreSQL中安装扩展模块后提取表名?,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,因此,我正在开发一个contrib模块,并希望捕获该contrib模块中的表名 select extract_tablename(); table-name datatype-name new_table name new new_table1 name1 new1 问题: select extract_tablename(); table-name datatype-name new_table name new ne

因此,我正在开发一个contrib模块,并希望捕获该contrib模块中的表名

select extract_tablename();

table-name      datatype-name
new_table       name    new
new_table1      name1   new1
问题:

select extract_tablename();

table-name      datatype-name
new_table       name    new
new_table1      name1   new1
  • 在创建表或插入表的过程中,是否有方法捕获表名? 我已经看到了一些触发器,但没有成功(我认为没有任何createtable触发器)。如果可能的话,请告诉我实现它的方法

  • select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
  • 我想使用pg_类提取元数据,但似乎没有帮助,因为我必须在where子句中显式地给出一个rel名称(表名) 你认为还有其他方法可以实现吗?请详细说明,如果有的话,请让我知道

  • select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    这里有一些例子,可以让你了解一些我想要实现的目标

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    创建表:

    create table new_table(name varchar , new integer);  
    insert into new_table values('abcdefghijkl' , 5004);
    create table new_table1(name1 varchar , new1 integer) ;
     insert into new_table1 values('mnopqrst' , 5005);
    
    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    创建扩展名:

    create extension table_name-extract;
    select extract_tablename();
    
    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    所以我的扩展应该提取一个表名,这意味着我应该知道表名和我声明的内置数据类型

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    以下是我期望的输出:

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    

    您实际上不需要扩展来跟踪DDL语句的执行

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    为此,您可以使用

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    本手册还介绍了如何使用PL/pgSQL编写事件触发器

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    CREATE OR REPLACE FUNCTION snitch() 
      RETURNS event_trigger 
    AS $$
    BEGIN
        RAISE NOTICE 'snitch: % %', tg_event, tg_tag;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE EVENT TRIGGER snitch ON ddl_command_start 
       EXECUTE PROCEDURE snitch();
    
    在触发器函数中,您需要将表名存储在一些配置表中,以便信息不会丢失

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    
    当然,如果您愿意,您可以将触发器和“日志表”(作为)打包到扩展中

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    

    另一个选项是启用使用

    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1
    

    postgresql.conf
    中,Postgres日志文件中包含所有DDL语句

    什么是“连续肋骨模块”?获取新创建表的名称需要什么?@Nico contrib modules是任何开发人员都可以显式安装或开发的模块,以实现额外的功能,我想根据自己的需要使用这些信息来捕获
    CREATE table
    语句。您可以使用一个要实现:是否要跟踪扩展创建的表(这是不必要的,因为
    createextension
    已经这样做了)?或者您想跟踪数据库中的任何表创建吗?@a_horse_和_no_name是的,我的意思是,每当用户创建某个特定表时,我都需要有关表名的信息,我想跟踪扩展中的此类表。
    select extract_tablename();
    
    table-name      datatype-name
    new_table       name    new
    new_table1      name1   new1