1: Kế thừa chính sách rls của view từ rls của bảng cơ sở như thế nào
2: Với ĐK Supabase + PostgreSql >15
ALTER VIEW <VIEW_NAME> SET (security_invoker = on);
create view <VIEW_NAME>
with(security_invoker = true)
as select <QUERY>
1: Supabase join và lọc theo bảng đã được join và bảng gốc
2: Ví dụ bảng endpoint_nac có mac, port, trong đó port link đến bảng device_port.
await _supabase.schema('btth').from('device_port')
.select('*,endpoint:endpoint_nac!inner!port(mac)') // inner because filter mac
//.select('*,endpoint:endpoint_nac!left!port(port,mac)') // default is left join
.eq('device_sn', serial_number) // lọc theo bảng gốc
.eq('endpoint.mac', '11-22-33-44-55-66') // (*) lọc theo bảng được join
Lưu ý: khi sử dụng left join => điều kiện (*) ở trên biến thành tìm endpoint_nac hoặc null hoặc endpoint_nac có mac = '11-22-33-44-55-66'. Supbase kế thừa từ "postgrest" nên phải nắm rõ postgrest trước khi sử dụng supabase (https://docs.postgrest.org/en/v12/references/api/resource_embedding.html)
Do đó để tránh nhầm lẫn,, khi lọc giá trị theo bảng được JOIN, bạn nên sử dụng !inner
Đôi khi người ta viết các hàm để thay thế và sử dụng supabase.rpc
1: PostgreSQL - One-To-One
2:
create table technical_specs(
film_id int references films(id) unique,
runtime time,
camera text,
sound text
);
create table films(
id int primary key generated always as identity, -- is unique
title text,
year int,
rating numeric(3,1),
language text
);
1: Find all publications
2: https://maurus.ttu.ee/design_queries/query.php?query_id=732
SELECT pubname AS publication_name,
puballtables AS is_all_tables,
pubinsert AS is_insert,
pubupdate AS is_update,
pubdelete AS is_delete,
pubtruncate AS is_truncate,
string_agg(n.nspname || '.' || c.relname, ',<br>' ORDER BY n.nspname, c.relname) AS published_tables,
CASE WHEN Count(pr.oid)=0 AND puballtables=TRUE THEN
(SELECT Count(*) AS c
FROM INFORMATION_SCHEMA.tables
WHERE table_type='BASE TABLE'
AND table_schema NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL))
ELSE Count(pr.oid)
END AS number_of_published_tables
FROM pg_publication AS p LEFT JOIN pg_publication_rel AS pr
ON p.oid=pr.prpubid
LEFT JOIN pg_class AS c ON c.oid=pr.prrelid
LEFT JOIN pg_namespace AS n ON c.relnamespace=n.oid
GROUP BY pubname, puballtables, pubinsert, pubupdate, pubdelete, pubtruncate
ORDER BY pubname;
1. supabase/postgrest: Bảng dữ liệu unit, chuyển kiểu dữ liệu ltree của column "path" sang text với cột mới "path_text"
2. supabase.from('unit').select('path_text')
create function path_text(unit) returns text as $$
select $1.path::text;
$$ language sql;
Cách này có thể sử dụng để truy vấn các lệnh join khi chưa khai báo "foreign key relationship"
Nhận xét
Đăng nhận xét