新数据库的建立并为各用户赋予相应的数据库级别的权限 使用有权登录到UNIX主机的用户创建一个新的数据库(create database databasename命令)。如上所述,现在该用户将对新创建的databasename数据库拥有DBA的权限。连接到这个库后,采用GRANT命令可以对其它用户赋予相应的数据库级别的权限。(事实上这是一个真正意义上的超级用户,换言之也是最危险的用户,在我们下面赋予了mydba以该表的DBA权限以后,我们将不再使用这个用户)。 赋予用户相应的数据库级别的权限的格式是: GRANT 权限 TO 用户名[,用户名] 于是,我们可以使用下面的三个命令给我们新创建的用户赋予相应的数据库级别的权限。 GRANT DBA TO mydba;/*赋予mydba以DBA的权限*/ GRANT CONNECT TO myuser1,myuser2;/*赋予myuser1,myuser2以CONNECT的权限*/ 在这里,我们有必要介绍一个特殊的用户public,如果使用GRANT ... TO PUBLIC,这将意味着赋予所有用户某种权限,当然,这种做法也许并不可取。
用户数据库级别权限的解除 解除用户相应的数据库级别的权限的格式是: REVOKE 权限 FROM 用户名[,用户名] 对于拥有DBA、RESOURCE权限的用户,解除其相应的DBA、RESOURCE权限将自动将其降格为CONNECT权限。 而对于只拥有CONNECT权限的用户,解除其CONNECT权限实际上也就意味着删除该数据库用户。 示例: REVOKE DBA FROM mydba;/*将mydba降格为CONNECT权限*/ REVOKE CONNECT FROM myuser1;/*解除myuser1对该数据库的访问权限*/
表级别和字段级别的权限 当一个用户访问数据库时,DBA可以限制其对指定表和表中指定字段的访问。任何resource级别或DBA级别的用户都可以创建表。表的拥有者或任何DBA级别的用户都可以对其它用户赋予或解除针对该数据表的表级别和字段级别的权限。这样的权限共有八种:insert、delete、select、update、references、index、alter和all。 Insert 该权限表示用户可以向表中增添新的数据。 Delete 该权限表示用户可以删除表中的数据。 Select 该权限可以扩展到指定字段,表示用户可以查询表中的记录或指定字段。 Update 该权限可以扩展到指定字段,表示用户可以修改表中的记录或指定字段。 References 该权限可以扩展到指定字段,表示用户可以针对表中的记录或指定字段制定参考性约束条件。参考性约束条件用来执行诸如多级删除和字段之间关联的工作。赋予该权限的用户应该首先至少是resource级别的用户。 Index 该权限表示用户可以建立或删除与表有关的索引。赋予该权限的用户应该首先至少是resource级别的用户。一个connect级别的用户即使被赋予该权限也不能建立索引。该权限不能扩展到指定字段,这是因为索引是建立在表的所有行的基础上的。 Alter 该权限表示用户可以改变表的结构。所谓改变表的结构是指增加、删除和改变字段或改变字段的数据类型。该权限只能针对数据表。一般来说,只有对于具备数据库系统知识并知道如何保护数据库系统的人,我们才会赋予此项权限。 All 该权限包含上面的所有七种权限。
创建新表 使用mydba登录到数据库,并使用如下语句创建一个新的数据表: CREATE TABLE customer_table ( customer_id char(2) not null, balance decimal(16, 2) not null, primary key(customer_id)); 在创建新表后,系统将对public赋予该表All的权限。也就是说所有可以访问该数据库的用户都可以对该表执行select、insert、update和delete语句,这显然不是我们想要看到的。
用户表级别和字段级别权限的解除 解除用户相应的数据库级别的权限的格式是: REVOKE 权限[,权限] [(字段名[,字段名])] ON 表名 FROM 用户名[,用户名] 我们首先需要解除public在该表上的All权限: REVOKE ALL ON customer_table FROM PUBLIC; 其它示例: REVOKE INSERT ON customer_table FROM PUBLIC;/*解除所有用户对该表的INSERT权限*/ REVOKE SELECT ON customer_table FROM myuser1;/*解除myuser1对该表的SELECT权限*/ REVOKE UPDATE (customer_id, balance) ON customer_table FROM myuser1;/*解除myuser1对该表中customer_id, balance字段的UPDATE权限*/
用户表级别和字段级别权限的赋予 赋予用户相应的数据库级别的权限的格式是: GRANT 权限[,权限] [(字段名[,字段名])] ON 表名 TO 用户名[,用户名] 我们赋予myuser1以更改该表中balance字段的权限: GRANT UPDATE (balance) ON customer_table TO myuser1; 赋予myuser2以浏览该表的权限: GRANT SELECT ON customer_table TO myuser2;
多种权限的同时赋予和解除 从上面的REVOKE和GRANT的格式,我们可看到,其实我们可以使用一条命令同时针对某一用户赋予或解除多种表级别或字段级别的权限。例如: GRANT INSERT, DELETE, UPDATE ON customer_table TO PUBLIC;/*同时赋予所有用户对该表的INSERT、DELETE和UPDATE权限*/ GRANT SELECT, UPDATE (balance) ON customer_table TO myuser2;/*同时赋予myuser2对该表中balance字段的SELECT和UPDATE权限*/ REVOKE INDEX, ALTER ON customer_table FROM myuser1;/*同时解除myuser1对该表的INDEX和ALTER权限*/ 你也可以在一条语句中同时针对某一用户赋予或解除表级别和字段级别的权限,这时字段级别的权限使用指定的字段,而表级别的权限使用指定的数据表。例如: GRANT INSERT, DELETE, SELECT, UPDATE (balance) ON customer_table TO myuser2; /*同时赋予myuser2对该表的INSERT、DELETE权限以及对字段balance的SELECT和UPDATE权限*/ REVOKE INDEX, SELECT, ALTER (balance) ON customer_table FROM myuser1; /*同时赋予myuser1对该表的INDEX、ALTER权限以及对字段balance的SELECT权限*/
其它关键词 在GRANT命令中,还可以使用其它两个关键词,首先是WITH GRANT OPTION关键词。在GRANT语句中使用这个关键词表示相关用户可以将同样的权限赋予其它用户。 在下面的示例中,myuser1不仅对customer_table具有insert、delete、select和update的权限,而且他可以将这些权限中的几个或全部赋予其它用户。 GRANT INSERT, DELETE, SELECT, UPDATE ON customer_table TO myuser1 WITH GRANT OPTION; 如果myuser1的权限中的一个或全部被解除,所有经myuser1授权的用户的相关权限也自动被解除。 另一个关键词是AS关键词。AS关键词允许你在执行一个授权时就象是在使用其它用户进行授权。而当这个用户的权限中的一个或全部被解除时,此次授权的用户的的相关权限也自动被解除。 回到我们上面的例子,myuser1已经被赋予了customer_table的insert、delete、select和update权限,并且可以对这些权限进行授权。一个DBA,数据表的拥有者或是给myuser1授权的用户可以扮演myuser1给其它用户授权: GRANT INSERT, DELETE, SELECT, UPDATE ON customer_table TO myuser2 AS myuser1; 现在myuser2和myuser1具有了同样的权限。要同时解除两者的权限,只要解除myuser1的权限就行了: REVOKE ALL ON customer_table FROM myuser1;