has_column_privilege()
是一个系统函数,用于确定用户是否对表的特定列具有权限。
has_column_privilege()
添加于PostgreSQL 8.4。
用法
has_column_privilege()
有两种形式
has_column_privilege(表名 TEXT 或 OID, 列名 TEXT 或 SMALLINT, 权限 TEXT)
has_column_privilege(用户名 TEXT 或 OID, 表名 TEXT 或 OID, 列名 TEXT 或 SMALLINT, 权限 TEXT)
列可以通过名称或其编号来指定,该编号对应于pg_attribute
中此列的attnum
列值(请注意,此编号可能与列在表中的当前明显位置不同,因此对于临时查询的实用性有限)。
可以查询以下权限:
SELECT
INSERT
UPDATE
REFERENCES
请注意,当以OID
提供表,或以SMALLINT
提供列时,如果找不到匹配的对象,则函数将返回NULL
。如果表名和列名作为字符串提供,则如果找不到匹配的对象,则会引发错误。
更改历史记录
- PostgreSQL 8.4
- 添加 (提交 7449427a)
示例
确定当前用户是否对指定表中的特定列具有SELECT
权限
postgres=# SELECT has_column_privilege('foo', 'id', 'SELECT'); has_column_privilege ---------------------- t (1 row)
相同,但指定列号
postgres=# SELECT has_column_privilege('foo', 1::SMALLINT, 'SELECT'); has_column_privilege ---------------------- t (1 row)
确定指定用户是否对指定表中的特定列具有UPDATE
权限
postgres=# SELECT has_column_privilege('someuser', 'foo', 'id', 'UPDATE'); has_column_privilege ---------------------- f (1 row)
尝试为这种对象类型确定无法识别的权限
postgres=# SELECT has_column_privilege('foo', 'id', 'DELETE'); ERROR: unrecognized privilege type: "DELETE"
尝试为不存在的表确定权限
postgres=# SELECT has_column_privilege('bar', 'id', 'SELECT'); ERROR: relation "bar" does not exist
尝试为不存在的列确定权限
postgres=# SELECT has_column_privilege('foo', 'bar', 'SELECT'); ERROR: column "bar" of relation "foo" does not exist
尝试为不存在的表OID
确定权限
postgres=# SELECT has_column_privilege(9999, 'id', 'SELECT'); has_column_privilege ---------------------- (1 row)
参考
- PostgreSQL 文档: 访问权限查询函数