3. 存取控制:请求证实 一旦你建立了一个连接,服务器进入阶段2。对在此连接上进来的每个请求,服务器检查你是否有足够的权限来执行它,授权表用GRANT和REVOKE命令操作。 GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...] GRANT在MySQL 3.22.11或以后版本中实现。对于更早MySQL版本,GRANT语句不做任何事情。 GRANT和REVOKE命令允许系统主管在4个权限级别上授权和撤回赋予MySQL用户的权利: 全局级别 全局权限作用于一个给定服务器上的所有数据库。这些权限存储在mysql.user表中。 数据库级别 数据库权限作用于一个给定数据库的所有表。这些权限存储在mysql.db和mysql.host表中。 表级别 表权限作用于一个给定表的所有列。这些权限存储在mysql.tables_priv表中。 列级别 列权限作用于在一个给定表的单个列。这些权限存储在mysql.columns_priv表中。 user表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在user表中的权限设成'N'并且仅在一个特定数据库的基础上授权, 使用db和host表。 4. 权限更改何时生效 当mysqld启动时,所有的授权表内容被读进存储器并且从那点生效。 用GRANT、REVOKE或SET PASSWORD对授权表施行的修改会立即被服务器注意到。 如果你手工地修改授权表(使用INSERT、UPDATE等等),你应该执行一个FLUSH PRIVILEGES语句或运行mysqladmin flush-privileges告诉服务器再装载授权表,否则你的改变将不生效,除非你重启服务器。 5. 建立初始的MySQL权限 在安装MySQL后,你通过运行scripts/mysql_install_db安装初始的存取权限。包含下列权限集合: * MySQL root用户作为可做任何事情的一个超级用户。连接必须由本地主机发出。注意:出世的root口令是空的,因此任何人能以root而没有一个口令进行连接并且被授予所有权限。 * 一个匿名用户,他可对有一个'test'或以'test_'开始的名字的数据库做任何时期事情,连接必须由本地主机发出。这意味着任何本地用户能连接并且视为匿名用户。 * 其他权限被拒绝。例如,一般用户不能使用mysqladmin shutdown或mysqladmin processlist。 为MySQL root用户指定一个口令(注意,你使用PASSWORD()函数指定口令): shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES; 在MySQL 3.22和以上版本中,你可以使用SET PASSWORD语句: shell> mysql -u root mysql mysql> SET PASSWORD FOR root=PASSWORD('new_password'); 设置口令的另一种方法是使用mysqladmin命令: shell> mysqladmin -u root password new_password 看看scripts/mysql_install_db脚本,看它如何安装缺省的权限。你可用它作为一个研究如何增加其他用户的基础 为了完全重建权限表,删除在包含mysql数据库的目录下所有“*.frm”,“*.MYI”和“*.MYD”文件。(这是在数据库目录下面命名为“mysql”的目录,当你运行mysqld --help时,它被列出。)然后运行mysql_install_db脚本,可能在首先编辑它拥有你想要的权限之后。 1. 向MySQL增加新用户权限 增加用户2个不同的方法: 通过使用GRANT语句或通过直接操作MySQL授权表。 比较好的方法是使用GRANT语句,因为他们是更简明并且好像错误少些。 shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'something' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost; monty 可以从任何地方连接服务器的一个完全的超级用户,但是必须使用一个口令('something'做这个。注意,我们必须对monty@localhost和monty@"%"发出GRANT语句。如果我们增加localhost条目,对localhost的匿名用户条目在我们从本地主机连接接时由mysql_install_db创建的条目将优先考虑,因为它有更特定的Host字段值,所以以user表排列顺序看更早到来。 admin 可以从localhost没有一个口令进行连接并且被授予reload和process管理权限的用户。这允许用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,还有mysqladmin processlist。没有授予数据库有关的权限。他们能在以后通过发出另一个GRANT语句授权。 dummy 可以不用一个口令连接的一个用户,但是只能从本地主机。全局权限被设置为'N'--USAGE权限类型允许你无需权限就可设置一个用户。它假定你将在以后授予数据库相关的权限。 也可以直接通过发出INSERT语句增加同样的用户存取信息,然后告诉服务器再次装入授权表: shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'), 'Y','Y','Y (责任编辑:admin) |