mysql学习笔记(2)
mysql访问权限系统
当mysqld服务器启动时,将授权表的内容读入到内存中
你可以通过以下三种方式刷新内存中的权限:
1. FLUSH PRIVILEGES语句
2. 执行mysqladmin flush-privileges
3. mysqladmin reload命令让它重新读取表
要检查给定账户的权限,使用SHOW GRANTS语句
mysql> SHOW GRANTS FOR '用户名'@'主机';
通过CREATE和DROP权限,你可以创建新数据库和表,或删除(移掉)已有数据库和表
SELECT、INSERT、UPDATE和DELETE权限允许你在一个数据库现有的表上实施操作
INDEX权限允许你创建或删除索引
通过ALTER权限,你可以使用ALTER TABLE来更改表的结构和重新命名表
GRANT权限允许你把你自己拥有的那些权限授给其他的用户
FILE权限给予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读和写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器能读或写的任何文件
需要CREATE ROUTINE权限来创建保存的程序(函数和程序),ALTER ROUTINE权限来更改和删除保存的程序,EXECUTE来执行保存的程序
拥有REPLICATION CLIENT权限便可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS
REPLICATION SLAVE权限应授予从服务器所使用的将当前服务器连接为主服务器的账户
拥有SHOW DATABASES权限便允许账户使用SHOW DATABASE语句来查看数据库名
拥有CREATE TEMPORARY TABLES权限便可以使用CREATE TABLE语句中的关键字TEMPORARY
拥有LOCK TABLES权限便可以直接使用LOCK TABLES语句来锁定你拥有SELECT权限的表。包括使用写锁定,可以防止他人读锁定的表
一般赋给用户SELECT、INSERT、UPDATE和DELETE权限
服务器只有在user表记录的Host和User列匹配客户端主机名和用户名并且提供了正确的密码时才接受连接 MySQL不允许匹配以数字和一个点起始的主机名
通配符字符在User列中不允许,但是你能指定空的值,它匹配任何名字 Password列可以是空的
到来的连接中的客户端名和用户名可能与user表中的多行匹配,如果有多个匹配,服务器必须选择使用哪个条目。按照下述方法解决问题:
服务器在启动时读入user表后进行排序
然后当用户试图连接时,以排序的顺序浏览条目
服务器使用与客户端和用户名匹配的第一行
当服务器读取表时,它首先以最具体的Host值排序 当客户端试图连接时,服务器浏览排序的条目并使用找到的第一匹配
可以使用SELECT CURRENT_USER();确认当前连接的方式
db和host表在服务器启动时被读取并排序(同时它读user表)
db表在Host、Db和User范围列上排序,并且host表在Host和Db范围列上排序
对于user表,首先根据最具体的值最后根据最不具体的值排序,并且当服务器寻找匹配条目时,它使用它找到的第一匹配
前面关于用户权限如何计算的描述可以这样总结:
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
如果你手动地修改授权表(使用INSERT、UPDATE或DELETE等等),你应该执行mysqladmin flush-privileges或mysqladmin reload告诉服务器再装载授权表, 否则你的更改将不会生效,除非你重启服务器。
如果你使用SET PASSWORD、INSERT或UPDATE更改密码,你必须使用 PASSWORD()函数加密密码
SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');
当你使用GRANT或CREATE USER语句或mysqladmin password命令指定密码时,不需要PASSWORD()函数,它们会自动使用PASSWORD()来加密密码