Files
pgmorbac/src/activity_view_bindings.sql
T
marc ce11d1b593 docs: complete function reference, drop unicode punctuation
Documents refresh_hierarchy_cache, is_rule_valid and org_in_scope, and
corrects the get_org_scope scope list which still omitted unattributed
and all.

Replaces em dashes and other typographic unicode with ASCII throughout
the schema comments, the test suite and the documentation. Comments and
prose are ASCII only.
2026-07-25 07:26:54 +02:00

41 lines
1.7 KiB
PL/PgSQL

-- Optional whitelist of valid (activity, view) pairs.
-- If any binding exists for an activity, rules may only use listed views.
-- Activities with no bindings are unconstrained.
CREATE TABLE morbac.activity_view_bindings (
activity TEXT NOT NULL REFERENCES morbac.activities(name) ON DELETE CASCADE,
view TEXT NOT NULL REFERENCES morbac.views(name) ON DELETE CASCADE,
PRIMARY KEY (activity, view)
);
COMMENT ON TABLE morbac.activity_view_bindings IS
'Optional whitelist of valid (activity, view) pairs. Constrains rule creation on a per-activity basis.';
CREATE OR REPLACE FUNCTION morbac.trg_check_activity_view_binding()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF EXISTS (SELECT 1 FROM morbac.activity_view_bindings WHERE activity = NEW.activity)
AND NOT EXISTS (SELECT 1 FROM morbac.activity_view_bindings WHERE activity = NEW.activity AND view = NEW.view)
THEN
RAISE EXCEPTION 'Activity "%" is not allowed on view "%" - add a binding to morbac.activity_view_bindings to permit it',
NEW.activity, NEW.view;
END IF;
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION morbac.trg_check_activity_view_binding() IS
'Blocks rule creation when an activity has bindings but the target view is not among them.';
DROP TRIGGER IF EXISTS trg_activity_view_binding_check ON morbac.rules;
CREATE TRIGGER trg_activity_view_binding_check
BEFORE INSERT OR UPDATE ON morbac.rules
FOR EACH ROW EXECUTE FUNCTION morbac.trg_check_activity_view_binding();
DROP TRIGGER IF EXISTS trg_activity_view_binding_check ON morbac.cross_org_rules;
CREATE TRIGGER trg_activity_view_binding_check
BEFORE INSERT OR UPDATE ON morbac.cross_org_rules
FOR EACH ROW EXECUTE FUNCTION morbac.trg_check_activity_view_binding();