MySQL的grant命令几乎完全遵循SQL92的语法,它的常规格式是:
grant <privilege> on <object> to <user> [identified by user-password] [with grant option];
可以赋予的特权值如下所示:
值 说明
alter 改变表和索引
create 创建数据库和表
delete 从数据库中删除数据
drop 删除数据库和表
index 管理索引
insert 在数据库中添加数据
lock tables 允许锁定表
select 提取数据
update 修改数据
all 以上所有
一些命令还有其他选项,例如create view授予用户创建视图的权限。
授予特权的对象被标识为:
databasename.tablename
在linux系统中,*代表通配符,因此*.*代表每个数据库中的每个对象,而foo.*代表数据库foo中的每个表。
如果指定的用户已经存在,它的特权会被编辑以反映所做的修改。如果该用户不存在,就会以指定的特权被创建。
在SQL语法中,特殊字符%代表通配符,它与shell环境中*号的作用完全一样。如果想要授予用户rick从wiley.com域中人呢和主机访问的权限,可以把rick描述为:
rick@‘%.wiley.com‘
任何时候使用%通配符都必须把它放在引号中,以与其他文本分开。
还可以使用IP/网络掩码标识(N.N.N.N/M.M.M.M)来为访问控制设置一个网络地址。
正如之前使用rick@‘192.168.0.0/255.255.255.0‘来授予rick从本地网络中任何机器连接的特权那样,也可以指定rick@‘192.168.0.1‘来将rick的访问限制到一台工作站,或者指定rick@‘192.0.0.0/255.0.0.0‘来扩大范围以包括192这个A类网络中的所有机器。
下面是另外一个例子:
mysql> GRANT ALL ON foo.* TO rick@‘%‘ IDENTIFIED BY ‘bar‘;
这将创建用户rick,它拥有对数据库foo的所有权限,并能以初始密码bar从任何机器进行连接。
如果数据库foo尚未存在,那么用户rick现在将拥有使用SQL命令create database来创建该数据库的权限。
IDENTIFIED BY子句是可选的,但在创建用户的同时最好确保它们都设置有密码。
SQL中的下划线是一种匹配任意单个字符的模式,这与%匹配一个字符串非常相似。
一般来说,with grant option只会用来创建二级管理员。但是,它也可以允许一个新创建的用户将授予它的特权赠予其他用户。
2. revoke命令
管理员不仅可以授予用户权限,同样能够剥夺用户权限,这是通过revoke命令来完成的。
revoke <a_privilege> on <an_object> from <a_user>
这与grant命令的格式很相似。例如:
mysql> REVOKE INSERT ON foo.* FROM rick@‘%‘;
但是,revoke命令不能删除用户,如果想要完全删除一个用户,不要只是修改它们的权限,而应用revoke来删除它们的权限。然后,可以切换到内部的mysql数据库,通过从user表中删除相应的行来完全删除一个用户:
mysql> use mysql;
mysql> DELETE FROM user WHERE user = "rick";
mysql> FLUSH PRIVILEGES;
因为未指定主机,所以可以确保删除了想要删除的MySQL用户(本例是rick)的每个实例。完成这个之后,一定要返回自己的数据库(使用use命令),否则仍然在MySQL自己的内部数据库中。
delete与grant和revoke并不属于同一范畴,由于MySQL处理权限方式的需要,这里的SQL语法是必需的。通过直接更新MySQL的权限表(因此首先调用命令use mysql)来有效地完成修改的。
在更新表之后,必须使用命令FLUSH PRIVILEGES来告诉MySQL服务器,它需要重新加载它的权限表。
8.2.3 密码
如果需要修改密码,就需要以root用户身份连接到MySQL服务器,然后直接更新用户信息。例如:
mysql> use mysql;
mysql> SELECT host, user, password FROM user;
如果想要给用户foo指定密码bar,可以这样做:
mysql> UPDATE user SET password = password(‘bar‘) WHERE user = ‘foo‘;
8.2.4 创建数据库
如果想要一个名为rick的数据库,之前以相同的名字创建了一个用户。首先需要授予用户rick广泛的权限以允许它创建新的数据库,这样做对一个开发系统尤其有用,因为它可以让用户有更大的灵活性。
mysql> GRANT ALL ON *.* TO rick@localhost IDENTIFIED BY ‘secretpassword‘;
现在以rick用户身份登录并创建数据库来测试权限设置:
$mysql -u rick -p
Enter password:
...
mysql> CREATE DATABASE rick;
告诉MySQL想使用新的数据库:
mysql> use rick;
现在就有可以想数据库中添加想要的表和信息。在以后的登录中,可以在命令行的结尾指定数据库,而不再需要使用use命令:
$mysql -u rick -p rick
在按照提示输入密码之后,作为连接过程的一部分,在默认情况下,将自动切换到使用数据库rick。
有5种时间数据类型可供选择使用,如下所示:
定义 说明
DATE 存储从1000年1月1日--9999年12月31日之前的日期
TIME 存储从-838:59:59--838:59:59之间的时间
DATETIME 存储从1000年1月1日--9999年12月31日最后一秒之间的日期
TIMESTAMP 存储从1970年1月1日--2037年之间的时间戳
YEAR 存储年份
8.2.6 创建表
至此,运行了数据库服务器,了解了如何分配用户权限以及如何创建数据库和一些基本的数据库类型,现在可以创建表了。
一个数据库只不过是一系列的行,而每行又由固定数目的列组成。它非常像电子表格,除了每行都必须包含相同数目和类型的列,而且每行必须以某种方式不同于表中的其他行。
创建数据库对象的完整SQL语法被称为DDL(data definition language)。
创建表的基本语法是:
CREATE TABLE <table_name> (
colum type[NULL | NOT NULL] [AUTO_INCREMENT] [PRIMARY KEY]
[, ...]
[, PRIMARY KEY (colum [, ...])]
)
可以用DROP TABLE语法来删除表:
DROP TABLE <table_name>;
关键字 说明
AUTO_INCREMENT 这个关键字告诉MySQL,任何情况,在该列中写入NULL值时,都会自动把一个分配的递增数字填入列数据中。这是一个非常有用的特征,它可以通过MySQL来自动为表中的行分配一个唯一的数字,尽管它只能用于属于主键的列。
NULL 一个特殊的数据库值,它通常用来表示"未知",也能用来表示"无关",语法NOT NULL意味着这行不能存储NULL值,这对阻止某些列持有NULL值是很有用的。
PRIMARY KEY 指出此列的数据必须是唯一的,该表每行中对应该列的值都应不同。每个表只能有一个主键。
现在创建一个名为children的表,它为每个孩子存储一个唯一的数字、名和年龄。把孩子的编号作为主键:
CREATE TABLE children(
children INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
fname VARCHAR(30),
age INTEGER
);
注意,与大多数程序设计语言不同,列名children出现在列数据类型之前。
还可以使用另外一种语法将列定义和主键定义分开:
mysql> use rick
mysql> CREATE TABLE children(
childno INTEGER AUTO_INCREMENT NOT NULL,
fname varchar(30),
age INTEGER,
PRIMARY KEY(childno)
);
MySQL用->提示符表示位于延续的行上。使用分号结束SQL命令,表示已经完成输入并准备好让数据库处理请求。
如果出现了错误,MySQL允许回退到之前的命令,编辑它并通过按下回车键重新输入它。
现在向表中添加数据,使用SQL命令INSERT来添加数据,因为定义childno列为AUTO_INCRMENT列,所以不需要为此列提供数据,只需让MySQL分配一个唯一的数字。
mysql> INSERT INTO children(fname, age) VALUES("Jenny", 21);
mysql> INSERT INTO children(fname, age) VALUES("Andrew", 17);
使用SELECT从表中提取数据来检查数据是否被正确添加:
mysql> SELECT childno, fanme, age FROM children;
与明确的列出想选择的列相比,也可以使用*号代表列,这将列出表中的所有列。这对交互式的使用很方便。但是在产品代码中,应该始终明确地指定想要选择的列。
启动一个对数据库服务器的交互式会话,并切换到rick数据库。然后,输入SQL命令创建表,使用满足需要的行来创建列。一旦使用分号结束了SQL命令,MySQL就将创建表。使用INSERT语句添加数据到新表中,允许childno列被自动分配数字。最后,使用SELECT来显示表中的数据。