NOT NULL PRIMARY KEY, title text NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, ); ςφϯτຖʹεΩʔϚΛ༻ҙͯ͠ ςʔϒϧΛ࡞
KEY, tenant_id bigint NOT NULL, title text NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, ); CREATE SCHEMA tenant1; CREATE VIEW tenant1.blogs AS SELECT * FROM public.blogs WHERE tenant_id::text = current_setting('application_name');
KEY, tenant_id bigint NOT NULL, title text NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, ); CREATE SCHEMA tenant1; CREATE VIEW tenant1.blogs AS SELECT * FROM public.blogs WHERE tenant_id::text = current_setting('application_name'); ςφϯτຖʹεΩʔϚΛ༻ҙ͢ΔͷมΘΒͳ ͍͕ɺ7JFXΛͬͯՄࢹੑͷ੍ݶΛߦ͏ɻ ςφϯτͷૢ࡞7JFXͷΈΛ௨ͯ͡$36%͢Δ͜ ͱͰ҆શʹσʔλΛѻ͑Δ
KEY, tenant_id bigint NOT NULL, title text NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, ); CREATE VIEW public.tenant1_blogs AS SELECT * FROM public.blogs WHERE tenant_id::text = current_setting('application_name');
KEY, tenant_id bigint NOT NULL, title text NOT NULL ); CREATE POLICY blogs_policy ON public.blogs FOR ALL TO app_user USING (tenant_id::text = current_setting(‘application_name', FALSE)); ALTER TABLE public.blogs ENABLE ROW LEVEL SECURITY; INSERT INTO public.blogs (tenant_id, title) VALUES (1, ‘TEST1’); INSERT INTO public.blogs (tenant_id, title) VALUES (1, ‘TEST2’); INSERT INTO public.blogs (tenant_id, title) VALUES (2, ‘TEST3’); INSERT INTO public.blogs (tenant_id, title) VALUES (2, ‘TEST4’); INSERT INTO public.blogs (tenant_id, title) VALUES (3, ‘TEST5’);
1; select * from blogs where id = 1; id | tenant_id | title ----+-----------+-------- 1 | 1 | UPDATE -- normal userͷ߹ UPDATE blogs SET title='UPDATE' WHERE id = 1; UPDATE 0 <- Ξοϓσʔτ͞Ε͍ͯͳ͍ -- normal userͷ߹(application_name: 1) SET application_name = '1'; UPDATE blogs SET title=‘UPDATE' WHERE id = 1; UPDATE 1 <- Ξοϓσʔτ͞Ε͍ͯΔ
WHERE id = 1; DELETE 0 <- DELETE͞Ε͍ͯͳ͍ -- normal userͷ߹(application_name: 1) SET application_name = ‘1’; DELETE FROM blogs WHERE id = 1; DELETE 1 <- DELETE͞Ε͍ͯΔ
KEY, tenant_id bigint NOT NULL, title text NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, ); CREATE TABLE public.posts ( id bigserial NOT NULL PRIMARY KEY, tenant_id bigint NOT NULL, title text NOT NULL, content text NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, ); -- ֎෦Ωʔͷఆٛলུ -- tenant has many groups͕͋ΔલఏͰάϧʔϓͷॴଐϝϯόʔΛཧ͢Δςʔϒϧ CREATE TABLE public.group_users ( id bigserial NOT NULL PRIMARY KEY, tenant_id bigint NOT NULL, group_id bigint NOT NULL, user_id bigint NOT NULL, created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, );
TO app_user USING (tenant_id::text = current_setting(‘application_name', FALSE)); CREATE POLICY posts_policy ON public.posts FOR ALL TO app_user USING (tenant_id::text = current_setting('application_name', FALSE)); CREATE POLICY group_users_policy ON public.group_users FOR ALL TO app_user USING (tenant_id::text = current_setting('application_name', FALSE)); WITH CEHCK ( group_id = (SELECT id FROM groups WHERE id = group_id) AND user_id = (SELECT id FROM users WHERE id = user_id) ); —- ϙϦγʔͷ༗ޮԽ ALTER TABLE public.blogs ENABLE ROW LEVEL SECURITY; ALTER TABLE public.posts ENABLE ROW LEVEL SECURITY; ALTER TABLE public.group_users ENABLE ROW LEVEL SECURITY;