首页 > 解决方案 > Postgres 连接模式

问题描述

我的一个 PostgreSQL 数据库包含共享相同结构的不同模式。

-- schema region_a
CREATE TABLE region_a.auth_user (
username NOT NULL,
password not null,
last_name NOT NULL,
Company varchar(255)
);

CREATE TABLE region_a.user_email (
useer_id NOT NULL,
email varchar(255)

);

-- schema region_b
CREATE TABLE region_b.auth_user (
username NOT NULL,
password not null,
last_name NOT NULL,
Company varchar(255)
);

CREATE TABLE region_b.user_email (
useer_id NOT NULL,
email varchar(255)

);

-- schema region_c
-- ...

在这种情况下,我有一个超级用户表,其中包含来自所有租户的所有用户

CREATE TABLE public.superusers (
username NOT NULL,
password not null,
last_name NOT NULL,
schema_nane NOT NULL,
Company varchar(255)
);

现在我想知道当我从插入相应模式的超级用户表中删除用户时如何创建触发器

标签: postgresqlschemaconcat

解决方案


您可以从每个区域中删除(删除)表,然后将其重新创建为视图(或物化视图)。

create table public.all_users (
       id          integer generated always as identity
     , user_name   text not null
     , last_name   text not null
     , region      text not null
     , email       varchar(255)     
     , company     varchar(255)
     , constraint  all_users_pk
                   primary key (id) 
    );

create table public.all_users_password( 
       id          integer  
     , password    text      -- should be encrypted 
     , constraint  all_users_pw_pk
                   primary key (id) 
     , constraint  all_users_pw_fk 
                   foreign key (id)
                   references public.all_users(id)
     ) ;

create or replace view region_a.users as 
   select id          
        , user_name   
        , last_name        
        , email          
        , company
     from public.all_users
    where region = 'region_a' ; 

create or replace view region_b.users as 
   select id          
        , user_name   
        , last_name        
        , email          
        , company
     from public.all_users
    where region = 'region_b' ; 

--- same then for region_c, region_d, ...  

注意:我将拆分密码删除到他们的个人表中,并且故意不将它们包含在区域用户表中;这样做始终是安全漏洞。但是,如果您愿意,请包括在内。还将列 Schema_name 重命名为区域,即它的 ID 不是它的存储位置。再次只是一个强烈的建议。


推荐阅读