Tengo una base de datos que usa esquemas postgresql para propósitos de múltiples inquilinos. Tiene una tabla en el esquema public llamada customers con una columna de id y tenant . El valor para el inquilino es una cadena, y hay un esquema postgresql correspondiente con tablas que coinciden.
Se parece a esto:
# public.customers # first.users # second.users | id | tenant | | id | name | | id | name | |----|--------| |----|--------| |----|--------| | 1 | first | | 1 | bob | | 1 | jen | | 2 | second | | 2 | jess | | 2 | mike |Me pregunto cómo podría hacer una sola consulta para obtener valores de una tabla en el esquema, solo con una identificación de cliente.
Entonces, si tengo un ID de cliente de 1 , ¿cómo puedo select * from first.users en una sola consulta?
Supongo que esto podría tener que ser una función escrita en pgpsql, pero no tengo mucha experiencia con eso. Algo como:
select * from tenant_table(1, 'users');?
create or replace function f(_id int) returns table (id int, name text) as $f$ declare _tenant text; begin; select tenant into _tenant from public.customers where id = _id; return query execute format($e$ select * from %I.users $e$, _tenant); end; $f$ language plpgsql;No puedes hacer eso con una sola consulta.
Tendrá que usar una consulta que seleccione el nombre del esquema, luego construir una segunda consulta y ejecutarla.
Por supuesto, puede definir una función PL/pgSQL que haga ambas cosas por usted y ejecute la consulta dinámica con EXECUTE .