diff options
author | Stephen Frost <sfrost@snowman.net> | 2015-10-04 21:05:18 -0400 |
---|---|---|
committer | Stephen Frost <sfrost@snowman.net> | 2015-10-04 21:05:18 -0400 |
commit | 90f334d2ca1a8bae2d0cd8a0898fb8ef90257565 (patch) | |
tree | 2619e5544fbeb3ae65c462a3a9dd3f1a97d8ca11 /src/backend/utils/adt/ri_triggers.c | |
parent | e78dc6b829219cacaccc59957b5375585e919099 (diff) | |
download | postgresql-90f334d2ca1a8bae2d0cd8a0898fb8ef90257565.tar.gz postgresql-90f334d2ca1a8bae2d0cd8a0898fb8ef90257565.zip |
ALTER TABLE .. FORCE ROW LEVEL SECURITY
To allow users to force RLS to always be applied, even for table owners,
add ALTER TABLE .. FORCE ROW LEVEL SECURITY.
row_security=off overrides FORCE ROW LEVEL SECURITY, to ensure pg_dump
output is complete (by default).
Also add SECURITY_NOFORCE_RLS context to avoid data corruption when
ALTER TABLE .. FORCE ROW SECURITY is being used. The
SECURITY_NOFORCE_RLS security context is used only during referential
integrity checks and is only considered in check_enable_rls() after we
have already checked that the current user is the owner of the relation
(which should always be the case during referential integrity checks).
Back-patch to 9.5 where RLS was added.
Diffstat (limited to 'src/backend/utils/adt/ri_triggers.c')
-rw-r--r-- | src/backend/utils/adt/ri_triggers.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 018cb99e8cd..6569fdba164 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -3014,7 +3014,8 @@ ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes, /* Switch to proper UID to perform check as */ GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner, - save_sec_context | SECURITY_LOCAL_USERID_CHANGE); + save_sec_context | SECURITY_LOCAL_USERID_CHANGE | + SECURITY_NOFORCE_RLS); /* Create the plan */ qplan = SPI_prepare(querystr, nargs, argtypes); @@ -3134,7 +3135,8 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, /* Switch to proper UID to perform check as */ GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner, - save_sec_context | SECURITY_LOCAL_USERID_CHANGE); + save_sec_context | SECURITY_LOCAL_USERID_CHANGE | + SECURITY_NOFORCE_RLS); /* Finally we can run the query. */ spi_result = SPI_execute_snapshot(qplan, |