51 lines
1.5 KiB
SQL
51 lines
1.5 KiB
SQL
-- R-P9a · Auftrag sub-areas — RLS ROLLOUT ARTIFACT (deferred)
|
|
--
|
|
-- Code-side access runs through withTenantRLS(); this block is applied during
|
|
-- the coordinated restricted-role cutover, not as an automatic schema diff.
|
|
--
|
|
-- Inverse per table:
|
|
-- REVOKE SELECT, INSERT, UPDATE, DELETE ON "<tbl>" FROM hivegrid_app;
|
|
-- DROP POLICY IF EXISTS "<tbl>_tenant_isolation" ON "<tbl>";
|
|
-- ALTER TABLE "<tbl>" NO FORCE ROW LEVEL SECURITY;
|
|
-- ALTER TABLE "<tbl>" DISABLE ROW LEVEL SECURITY;
|
|
|
|
DO $$
|
|
DECLARE
|
|
tbl text;
|
|
BEGIN
|
|
FOREACH tbl IN ARRAY ARRAY[
|
|
'ProjektMitglied',
|
|
'ProjektTermin',
|
|
'Rechnung',
|
|
'ProjektChecklist',
|
|
'ProjektChecklistItem',
|
|
'AuftragPipelineStageConfig',
|
|
'AcceptanceFormTemplate',
|
|
'ProjectTemplate',
|
|
'ScheduleEntry',
|
|
'ScheduleConflict',
|
|
'AbnahmeProtokoll',
|
|
'AbnahmeSignatur',
|
|
'OfflineSyncMutation'
|
|
]
|
|
LOOP
|
|
EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY;', tbl);
|
|
EXECUTE format('ALTER TABLE %I FORCE ROW LEVEL SECURITY;', tbl);
|
|
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_policies
|
|
WHERE schemaname = current_schema()
|
|
AND tablename = tbl
|
|
AND policyname = tbl || '_tenant_isolation'
|
|
) THEN
|
|
EXECUTE format(
|
|
'CREATE POLICY %I ON %I USING ("tenantId" = current_setting(''app.tenant_id'', true)) WITH CHECK ("tenantId" = current_setting(''app.tenant_id'', true));',
|
|
tbl || '_tenant_isolation', tbl
|
|
);
|
|
END IF;
|
|
|
|
EXECUTE format('GRANT SELECT, INSERT, UPDATE, DELETE ON %I TO hivegrid_app;', tbl);
|
|
END LOOP;
|
|
END
|
|
$$;
|