-- Move members quota accounting back to grants. DROP TRIGGER ents_members_incr; DROP TRIGGER ents_members_decr; DROP TRIGGER quota_check_members; -- Restore owner/member membership as grants (member triggers on grants not yet -- recreated, so this is not counted). INSERT INTO grants (tenant, type, principal, role, path, system) SELECT tenant, 'user', user, CASE WHEN owner THEN 'owner' ELSE 'member' END, '', 0 FROM tenant_members; DROP INDEX IF EXISTS idx_tenant_members_user; DROP TABLE tenant_members; CREATE TRIGGER ents_members_incr AFTER INSERT ON grants WHEN NEW.type = 'user' AND NEW.system = 0 BEGIN UPDATE entitlements SET members_used = members_used + 1 WHERE tenant = NEW.tenant; END; CREATE TRIGGER ents_members_decr AFTER DELETE ON grants WHEN OLD.type = 'user' AND OLD.system = 0 BEGIN UPDATE entitlements SET members_used = members_used - 1 WHERE tenant = OLD.tenant; END; CREATE TRIGGER quota_check_members BEFORE INSERT ON grants WHEN NEW.type = 'user' AND NEW.system = 0 AND NOT EXISTS ( SELECT 1 FROM grants WHERE tenant = NEW.tenant AND type = NEW.type AND principal = NEW.principal AND role = NEW.role AND path = NEW.path ) BEGIN SELECT RAISE(ABORT, 'quota exceeded: members') WHERE NOT EXISTS ( SELECT 1 FROM entitlements WHERE tenant = NEW.tenant AND members_used < members_max ); END; -- Recompute members_used from grants (non-system user grants). UPDATE entitlements SET members_used = ( SELECT COUNT(*) FROM grants g WHERE g.tenant = entitlements.tenant AND g.type = 'user' AND g.system = 0 );