Files
HiveGrid-Wireframes/03 Quellen und Referenzen/hivegrid-cloud/prisma/rls/gdpr-isolation.sql
T
2026-07-08 16:15:37 +02:00

48 lines
1.7 KiB
SQL

-- AK-P21 · Privacy/GDPR — RLS ROLLOUT ARTIFACT (deferred, NOT in the auto-migration)
-- =============================================================================
-- The AK-P21 GDPR tables ship in the phase merge migration per AD-21. This file
-- carries the coordinated RLS cutover block only. It is intentionally outside the
-- auto-migration path because FORCE RLS before every code path sets app.tenant_id
-- would make reads fail closed.
--
-- SCOPE:
-- Tenant-scoped: GdprExportJob, TenantDeletionRequest, AvvAcceptance.
-- Global catalog: Subprocessor (no tenantId), so no RLS policy here.
--
-- Forward-only. Inverse SQL:
-- 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[
'GdprExportJob',
'TenantDeletionRequest',
'AvvAcceptance'
]
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
$$;