【问题标题】:How to get the primary key value of a row in a function?如何获取函数中一行的主键值?
【发布时间】:2020-12-21 11:53:42
【问题描述】:

我在 postgres 中有一个函数,可以在我的表中发送有关 CRUD 操作的事件。但是问题是它只适用于具有id 列的表,该列是主键。如何更改它以便我可以使用任何列作为主键?

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SET search_path = PUBLIC,
pg_catalog;
CREATE OR REPLACE FUNCTION psycopg2_pgevents_create_event() RETURNS TRIGGER AS $function$
  BEGIN
    IF (TG_OP = 'DELETE') THEN
        PERFORM pg_notify('psycopg2_pgevents_channel',
        json_build_object(
            'event_id', uuid_generate_v4(),
            'event_type', TG_OP,
            'schema_name', TG_TABLE_SCHEMA,
            'table_name', TG_TABLE_NAME,
            'row_id', OLD.id            -------- this is not always "id"
        )::text
     );
         RETURN NULL;
    ELSE
        raise notice 'Value: %', NEW;
        PERFORM pg_notify('psycopg2_pgevents_channel',
            json_build_object(
                'event_id', uuid_generate_v4(),
                'event_type', TG_OP,
                'schema_name', TG_TABLE_SCHEMA,
                'table_name', TG_TABLE_NAME,
                'row_id', NEW.id,         -------- this is not always "id"
                'data', NEW
        )::text
    );
    RETURN NULL;
    END IF;
  END;
$function$ LANGUAGE PLPGSQL;
SET search_path = "$user",
    PUBLIC;

【问题讨论】:

    标签: sql postgresql sql-function


    【解决方案1】:

    如果您只有一个主键列,并且只想要它的值,则可以使用以下方法提取它:

    to_jsonb(NEW)->>(
      SELECT attname
      FROM pg_attribute
      JOIN pg_index ON indexrelid = attrelid
      WHERE indrelid = TG_RELID
        AND indisprimary
    )
    

    如果您有多个主键列,并且/或者您想以{"key":"value"} 格式检索 PK,您可以使用:

    SELECT jsonb_object_agg(attname, to_jsonb(NEW)->attname)
    FROM pg_attribute
    JOIN pg_index ON indexrelid = attrelid
    WHERE indrelid = TG_RELID
      AND indisprimary
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2016-05-17
      • 2014-09-21
      • 1970-01-01
      • 2015-04-08
      • 2012-10-03
      相关资源
      最近更新 更多