在表中插入新行时,如何使用 PostgreSQL 中的触发器创建新模式?

Hen*_*nda 5 postgresql triggers

我有一个保存客户的表,每个国家/地区只有一个客户,对于该表中的每一行,我必须创建一个新架构并复制一些表。像这样:

Clients table's columns: 

client      country
----------  -----------
john doe    US
jane doe    UK
Run Code Online (Sandbox Code Playgroud)

架构:

clients_US
clients_UK
Run Code Online (Sandbox Code Playgroud)

我需要创建一个触发器,以便每次将新客户端添加到客户端表时自动创建这些架构,并使用国家/地区列数据作为架构名称的一部分。

在完美的世界中,这是可行的,但显然不行:

CREATE OR REPLACE FUNCTION gcpmanager.create_sle_schema() 
RETURNS trigger LANGUAGE plpgsql
AS
    'begin 
    CREATE SCHEMA "clients_" + new.country
    AUTHORIZATION postgres;
        return new;
    end;';
Run Code Online (Sandbox Code Playgroud)

小智 4

您将需要使用动态 SQL

CREATE OR REPLACE FUNCTION gcpmanager.create_sle_schema() 
RETURNS trigger LANGUAGE plpgsql
AS
$$
begin 
  execute 'CREATE SCHEMA clients_'||new.country||' AUTHORIZATION postgres';
  return new;
end;
$$
Run Code Online (Sandbox Code Playgroud)

顺便说一句:PostgreSQL 中的字符串连接运算符不是||+即数字)

  • 可能需要一个 quit_ident() 调用和一个安全定义器。:-) (2认同)