security_invoker
以调用者权限访问视图
访问视图的基础关系时使用调用者的权限与行安全策略。
当前查看 PostgreSQL 18.6。
说明
该选项会根据视图使用者而非视图所有者的权限来检查底层基关系。完整细节见下文注解。
- 适用对象
- 视图选项
- 取值类型
- 布尔值
用法
WITH (security_invoker = value)视图选项
普通视图不存储查询结果。此选项控制视图的安全或更新语义,使用 CREATE VIEW 的 WITH 子句或 ALTER VIEW 设置,不是表或索引的物理存储参数。
安全语义
如果视图的 security_invoker 属性设置为 true,则访问底层基关系时依据的是执行查询的用户的权限,而非视图所有者的权限。因此,安全调用者视图的使用者必须对该视图及其底层基关系拥有相应权限。
如果任何底层基关系本身是安全调用者视图,则它会被视为是由原始查询直接访问的。因此,安全调用者视图总会使用当前用户的权限来检查其底层基关系,即使它是从不带 security_invoker 属性的视图中被访问的。
如果任何底层基关系启用了 行级安全,那么默认会应用视图所有者的行级安全策略,而这些策略所引用的任何额外关系,其访问权限也由视图所有者的权限决定。然而,如果视图的 security_invoker 设置为 true,则改为使用调用用户的策略和权限,就如同这些基关系是通过使用该视图的查询被直接引用的一样。
视图中调用的函数,其处理方式与在使用该视图的查询中直接调用这些函数相同。因此,视图的使用者必须拥有调用视图所用全部函数的权限。视图中的函数会以执行查询的用户或函数所有者的权限执行,这取决于这些函数被定义为 SECURITY INVOKER 还是 SECURITY DEFINER。因此,例如,在视图中直接调用 CURRENT_USER 将始终返回调用用户,而不是视图所有者。这一点不受视图的 security_invoker 设置影响,因此, security_invoker 设置为 false 的视图 并不 等同于 SECURITY DEFINER 函数,不应混淆这两个概念。
注意,在视图上执行插入、更新或删除的用户,必须拥有该视图上相应的插入、更新或删除权限。另外,默认情况下,视图所有者必须在底层基关系上拥有相关权限,而执行更新的用户则不需要在底层基关系上拥有任何权限(参见 第 39.5 节)。但是,如果视图的 security_invoker 设置为 true,则必须由执行更新的用户而非视图所有者,在底层基关系上拥有相关权限。
相关条目
文档与源码
查看来源构建
- 版本
- 18.6
- 构建
- 本地中文手册 18.6
- 来源指纹
2892290581c230fa73001957e37b5061767c1449e17d120024cc081bfc36a941
同类条目
check_option视图检查选项security_barrier视图安全屏障
返回存储参数 · 此条目的收录范围为 PostgreSQL 15 至 20;起点不一定是实际引入版本。