In your database, you are likely to have a hierarchy of scopes. What this means is that one scope is contained within another. For instance a project scope might be contained within the department scope of the department that owns the project. This hierarchy is used in 2 ways:
Determining which scopes may be promoted to which other scopes is
done through the superior_scopes
view. This identifies, for each scope, what directly superior
scopes exist. It does not identify global scope, and does not
require a recursive query to identify grandparent scopes etc.
These are handled elsewhere.
You will need to create a custom version of the superior_scopes
view. This is done (as described here) by creating an over-riding
custom view named my_superior_scopes
.
The provided Veil2
base version of this
view is simply a placeholder.
You will define this view as the union of a number of selects.
Each select will represent a single type of superior scope. The
following example is from the demo. See STEP 6 in the file
demo/veil2_demo--0.9.3 (beta).sql
.
create or replace view veil2.my_superior_scopes ( scope_type_id, scope_id, superior_scope_type_id, superior_scope_id ) as select 4, party_id, -- Promote org to corp scope 3, corp_id from demo.parties_tbl -- No join needed to scopes as party_id == scope_id where party_type_id = 2 union all select 4, party_id, -- Promotion of org to higher org 4, org_id from demo.parties_tbl where party_type_id = 2 and party_id != org_id -- Cannot promote to self union all select 5, s.scope_id, -- Project to corp promotions 3, p.corp_id from demo.projects p inner join veil2.scope_links s on s.project_id = p.project_id union all select 5, s.scope_id, -- Project to org promotions 4, p.org_id from demo.projects p inner join veil2.scope_links s on s.project_id = p.project_id;
Note that if you have something like an organizational hierarchy in which you want someone that is assigned a role in an organizational context, to automatically have those rights in all subordinate organizational contexts, you will need to define scope promotions within that hierarchy. This is done by the second query in the above union.
Any time you redefine this view you should call
veil2.init()
to
update the base definition and refresh the materialized views
that depend on it.
If your scope hierarchy changes in a way that could affect the
privileges that might be assigned to accessors, you should
refresh all materialized views and
caches. Since determining what sort of updates might
require this is somewhat complicated, we recommend that
any change that would result in the veil2.superior_scopes
view returning different data should result in a full refresh of
all materialized views. For this you should call the trigger
function veil2.refresh_scopes_matviews()
.
It is assumed that such changes will be rare but if this is not
the case, and you encounter a performance penalty from having
the veil2.accessor_privileges_cache
cache table repeatedly cleared, you may be able to, instead of
truncating that table, selectively delete records based on the
session contexts that are affected by your changes. Our
recommendation is not to tackle this until you know that you
have a problem. By then you should have enough local
Veil2
expertise that you can easily figure
out what to do.