权限
对象在创建时会被分配一个所有者,所有者通常是执行创建语句的角色。对于大部分类型的对象,初始状态下只有所有者(或者超级用户)能够对该对象做任何事情。为了允许其他角色使用它,必须分配权限。
数据库存在多种不同的权限:
SELECT
、
INSERT
、
UPDATE
、
DELETE
、
TRUNCATE
、
REFERENCES
、
TRIGGER
、
CREATE
、
CONNECT
、
TEMPORARY
、
EXECUTE
以及
USAGE
。可以应用于一个特定对象的权限随着对象的类
型(表、函数等)不同而不同。下面将简单介绍如何使用这些权限。
通常只有对象的所有者才可以修改或销毁一个对象的权限。
一个对象可以通过该对象类型相应的
ALTER
命令来重新分配所有者,例如:
ALTER TABLE table_name
OWNER TO new_owner;
超级用户总是可以做到这点,普通角色只有同时是对象的当前所有者(或者是拥有角色的一个成员)以及新
拥有角色的一个成员时才能做同样的事。
要分配权限,可以使用
GRANT
命令。例如,如果
joe
是一个已有角色,而
accounts
是一个已有表,更
新该表的权限可以按如下方式授权:
GRANT UPDATE ON accounts TO joe;
用
ALL
取代特定权限会把与对象类型相关的所有权限全部授权。
一个特殊的名为
PUBLIC
的
”
角色
”
可以用来向系统中的每一个角色授予一个权限。同时,在数据库中有很
多用户时可以设置
”
组
”
角色来帮助管理权限。详见 数据库角色。
撤销一个权限,使用
REVOKE
命令:
REVOKE ALL ON accounts FROM PUBLIC;
对象拥有者的特殊权限(即执行
DROP
、
GRANT
、
REVOKE
等的权力)总是隐式地属于拥有者,并且不能被
授予或撤销。但是对象拥有者可以选择撤销他们自己的普通权限,例如把一个表变得对他们自己和其他人只
读。
一般情况下,只有对象拥有者(或者超级用户)可以授予或撤销一个对象上的权限。但是可以在授予权限时
使用
”with grant option”
来允许接收人将权限转授给其他人。如果授予被撤销,则所有从接收人那里获得的权
限(直接或者通过授权链获得)都将被撤销。更多详情请见
GRANT
和
REVOKE
参考页。
可用的特权是
:
SELECT
允许从表、视图、物化视图或其他类似表的对象的任何列或特定列中进行
SELECT
。也允许使
用
COPY
。在
UPDATE
或
DELETE
中引用现有列值时也需要此特权。对于序列,这个特权还允许使用
currval
函数。对于大型对象,此特权允许读取对象。
INSERT
允许
INSERT ALL|FIRST
将新行插入到表、视图等中。可以在特定的列上授予,在这种情况下,只有
那些列可以在
INSERT
命令中分配
(
因此其他列将接收默认值
)
。也允许使用
COPY
。
UPDATE
允许
UPDATE
表、视图等的任何列或特定列
(
实际上,任何重要的
UPDATE
命令也需要
SELECT
特权,因为它必须引用表列来确定要更新哪些行,以及
/
或计算列的新值
)
。除了
SELECT
特权之外,
SELECT ... FOR UPDATE
和
SELECT ... FOR SHARE
需要至少一个列上的这个特权。对于序
列,这个特权允许使用
nextval
和
setval
函数。对于大型对象,此特权允许写入或截断对象。
DELETE
允许从表、视图等中
DELETE
一行
(
实际上,任何重要的
DELETE
命令都需要
SELECT
特权,因为
它必须引用表列来确定要删除哪些行
)
。
TRUNCATE
允许对表、视图等进行
TRUNCATE
。
REFERENCES
允许创建引用表或表的特定列的外键约束。
TRIGGER
允许在表、视图等上创建触发器
CREATE
对于数据库,允许在数据库中创建新的模式和发布。
对于模式,允许在模式中创建新对象。要重命名一个现有对象,您必须拥有对象和对包含的模式有这
个特权。
对于表空间,允许在表空间中创建表、索引和临时文件,并允许创建将表空间作为默认表空间的数据
库。
(
注意,撤销此特权不会改变现有对象的位置。
)
CONNECT
允许受让人连接到数据库。此特权在连接启动时进行检查
(
除了检查强加的任何
sys_hba.conf
限制
)
。
TEMPORARY
允许在使用数据库时创建临时表。
EXECUTE
允许调用函数或过程,包括使用在函数上实现的任何操作符。这是唯一适用于函数和过程的特权
类型。
USAGE
对于过程语言,允许使用该语言创建该语言中的函数。这是惟一适用于过程性语言的特权类型。
对于模式,允许访问模式中包含的对象
(
假设也满足对象自己的特权要求
)
。本质上,这允许被授予者
在模式中“查找”对象。没有这个权限,仍然可以看到对象名,例如通过查询系统目录。此外,在撤销
此权限之后,现有会话可能具有先前执行此查找的语句,因此这不是防止对象访问的完全安全的方法。
对于序列,允许使用
currval
和
nextval
函数。
对于类型和域,允许在创建表、函数和其他模式对象时使用类型或域。
(
请注意,此特权并不控制该类
型的所有“使用”,例如查询中出现的类型值。它只会阻止创建依赖于类型的对象。此特权的主要目的
是控制哪些用户可以创建对类型的依赖项,这可以防止所有者稍后更改类型。
)
对于外部数据包装器,允许使用外部数据包装器创建新服务器。
对于外部服务器,允许使用该服务器创建外部表。受资助者还可以创建、更改或删除与该服务器关联
的自己的用户映射。
其他命令所需的特权列在相应命令的参考页面上。
在创建对象时,
KingbaseES
默认将某些类型的对象的权限授予
PUBLIC
。对于表、表列、序列、外部数据包
装器、外部服务器、大型对象、模式或表空间,
PUBLIC
缺省情况下不授予任何特权。对于其他类型的对
象,授予
PUBLIC
的默认权限如下
:
数据库的
CONNECT
和
TEMPORARY
(
创建临时表
)
权限;函数和程序的
EXECUTE
权限;语言和数据类型
(
包括域
)
的
USAGE
权限。当然,对象所有者可以撤销的默认权限和明确
授予的权限。
(
为了获得最大的安全性,在创建对象的同一事务中发出撤销
;
那么就没有其他用户可以在其中
使用该对象的窗口。
)
此外,可以使用
ALTER DEFAULT PRIVILEGES
命令重写这些默认的特权设置。
下表
ACL
(
访问控制列表
)
值中显示用于这些特权类型的单字母缩写。
表
4.7.1: ACL
特权的缩写
特权
缩写
适用的对象类型
SELECT
r
(
“
read
”
)
LARGE OBJECT
,
SEQUENCE
,
TABLE
(
和类似于表的对象
),
table column
INSERT
a
(
“
append
”
)
TABLE
, table column
UPDATE
w
(
“
write
”
)
LARGE OBJECT
,
SEQUENCE
,
TABLE
, table column
DELETE
d
TABLE
TRUNCATE
D
TABLE
REFERENCES
x
TABLE
, table column
TRIGGER
t
TABLE
CREATE
C
DATABASE
,
SCHEMA
,
TABLESPACE
CONNECT
c
DATABASE
TEMPORARY
T
DATABASE
EXECUTE
X
FUNCTION
,
PROCEDURE
USAGE
U
DOMAIN
,
FOREIGN DATA WRAPPER
,
FOREIGN SERVER
,
LANGUAGE
,
SCHEMA
,
SEQUENCE
,
TYPE
下表使用上面所示的缩写,总结每种类型的
SQL
对象可用的特权。还显示了可以用来检查每个对象类型的
权限设置的
ksql
命令。
表
4.7.3:
访问权限摘要
对象类型
所有权限
默认的
PUBLIC
权限
ksql
命令
DATABASE
CTc
Tc
\l
DOMAIN
U
U
\dD+
FUNCTION
or
PROCEDURE
X
X
\df+
FORE IGN DATA WRAPPER
U
none
\dew+
FOREIGN SERVER
U
none
\des+
LANGUAGE
U
U
\dL+
LARGE OBJECT
rw
none
SCHEMA
UC
none
\dn+
SEQUENCE
rwU
none
\dp
TABLE
(and table-like objects)
arwdDxt
none
\dp
Table column
arwx
none
\dp
TABLESPACE
C
none
\db+
TYPE
U
U
\dT+
为特定对象授予的权限显示为
aclitem
条目列表,其中每个
aclitem
描述了特定授予人授予的一个被授
予人的权限。例如,
calvin=r*w/hobbes
指定角色
calvin
具有授予选项
(
*
)
的特权
SELECT
(
r
)
,以及
不可授予的特权
UPDATE
(
w
)
,两个都是由角色
hobbes
授予的。如果
calvin
也对不同授予人授予的同
一对象具有某些特权,则这些特权将作为单独的
aclitem
条目。
aclitem
中的一个空的受让人字段表示
PUBLIC
。
例如,假设用户
miriam
创建表
mytable
:
GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
ksql
的
\dp
命令将显示
:
=>
\dp mytable
Access privileges
Schema
|
Name
|
Type
|
Access privileges
|
Column privileges
|
Policies
--------+---------+-------+-----------------------+-------------------+---------
public
|
mytable
|
table
|
miriam
=
arwdDxt
/
miriam
+|
col1:
+|
|
|
| =
r
/
miriam
+|
miriam_rw
=
rw
/
miriam
|
|
|
|
admin
=
arw
/
miriam
|
|
(
1
row)
如果给定对象的
”
访问权限
”
列为空,则表示该对象具有默认权限
(
即其在相关系统目录中的权限项为空
)
。缺
省特权始终包括所有者的所有特权,并且根据对象类型,可以包括
PUBLIC
的一些特权,如上所述。第一个
在对象上的
GRANT
或
REVOKE
将实例化默认的特权
(
例如
“miriam=arwdDxt/miriam“)
,然后根据指定的请
求修改它们。类似地,只有具有非默认特权的列的条目才显示在“列特权”中。
(
注意
:
对于这个目的,“默认
特权”总是意味着对象类型的内置默认特权。如果一个对象的权限受到了
ALTER DEFAULT PRIVILEGES
命令的影响,那么该对象将始终显示一个显式的权限条目,其中包括
ALTER
后的效果
)
。
注意,所有者的隐式授予选项在访问权限显示中没有标记。一个
*
只会在授权选项被明确授权给别人的时
候才会出现。