Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DROP TRIGGER IF EXISTS trg_serviceusers_block_org_delete ON organizations;
DROP FUNCTION IF EXISTS serviceusers_block_org_delete();
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
-- Block deleting an organization that still has service users.

-- A plain foreign key to organizations(id) cannot be used here. The bootstrap
-- superuser lives under the virtual platform org (00000000-0000-0000-0000-000000000000),
-- which has no row in organizations by design. A BEFORE DELETE trigger only
-- fires when a real org is deleted, so the virtual platform org and its
-- bootstrap service account are never in scope.
--
-- Existing orphaned rows (if any) are left untouched; they are cleaned up out
-- of band, not by this migration.
CREATE OR REPLACE FUNCTION serviceusers_block_org_delete()
RETURNS trigger AS $$
BEGIN
IF EXISTS (SELECT 1 FROM serviceusers WHERE org_id = OLD.id) THEN
RAISE EXCEPTION 'cannot delete organization %: service users still reference it', OLD.id
USING ERRCODE = 'foreign_key_violation';
END IF;
Comment thread
coderabbitai[bot] marked this conversation as resolved.
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS trg_serviceusers_block_org_delete ON organizations;
CREATE TRIGGER trg_serviceusers_block_org_delete
BEFORE DELETE ON organizations
FOR EACH ROW
EXECUTE FUNCTION serviceusers_block_org_delete();
Loading