与mysql 有关的博文还有
一, 创建用户:
命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';
说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.
例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '';
CREATE USER 'pig'@'%';
二,授权:
命令:GRANT privileges ON databasename.tablename TO 'username'@'host'
说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*.
例子: GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
GRANT ALL ON *.* TO 'pig'@'%';
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
三.设置与更改用户密码
命令:SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');如果是当前登陆用户用SET PASSWORD = PASSWORD("newpassword");
例子: SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");
四.撤销用户权限
命令: REVOKE privilege ON databasename.tablename FROM 'username'@'host';
说明: privilege, databasename, tablename - 同授权部分.
例子: REVOKE SELECT ON *.* FROM 'pig'@'%';
注意: 假如你在给用户'pig'@'%'授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO 'pig'@'%', 则在使用REVOKE SELECT ON *.* FROM 'pig'@'%';命令并不能撤销该用户对test数据库中user表的SELECT 操作.相反,如果授权使用的是GRANT SELECT ON *.* TO 'pig'@'%';则REVOKE SELECT ON test.user FROM 'pig'@'%';命令也不能撤销该用户对test数据库中user表的Select 权限.
具体信息可以用命令SHOW GRANTS FOR 'pig'@'%'; 查看.
五.删除用户
命令: DROP USER 'username'@'host';
附表:在MySQL中的操作权限
http://www.jb51.net/article/31850.htm
来源:http://yingxiong.javaeye.com/blog/451208
本文实例,运行于 MySQL 5.0 及以上版本。
MySQL 赋予用户权限命令的简单格式可概括为:
一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
grant insert on testdb. * to common_user@ ' % '
grant update on testdb. * to common_user@ ' % '
grant delete on testdb. * to common_user@ ' % '
或者,用一条 MySQL 命令来替代:
二、grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
grant 创建、修改、删除 MySQL 数据表结构权限。
grant alter on testdb. * to developer@ ' 192.168.0.% ' ;
grant drop on testdb. * to developer@ ' 192.168.0.% ' ;
grant 操作 MySQL 外键权限。
grant 操作 MySQL 临时表权限。
grant 操作 MySQL 索引权限。
grant 操作 MySQL 视图、查看视图源代码 权限。
grant show view on testdb. * to developer@ ' 192.168.0.% ' ;
grant 操作 MySQL 存储过程、函数 权限。
grant alter routine on testdb. * to developer@ ' 192.168.0.% ' ; -- now, you can drop a procedure
grant execute on testdb. * to developer@ ' 192.168.0.% ' ;
三、grant 普通 DBA 管理某个 MySQL 数据库的权限。
其中,关键字 “privileges” 可以省略。
四、grant 高级 DBA 管理 MySQL 中所有数据库的权限。
五、MySQL grant 权限,分别可以作用在多个层次上。
1. grant 作用在整个 MySQL 服务器上:
grant all on * . * to dba @localhost ; -- dba 可以管理 MySQL 中的所有数据库
2. grant 作用在单个数据库上:
3. grant 作用在单个数据表上:
这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
grant select on smp.mo_sms to mo_user@ ' % ' identified by ' 123345 ' ;
4. grant 作用在表中的列上:
5. grant 作用在存储过程、函数上:
grant execute on function testdb.fn_add to ' dba ' @ ' localhost '
六、查看 MySQL 用户权限
查看当前用户(自己)权限:
查看其他 MySQL 用户权限:
七、撤销已经赋予给 MySQL 用户权限的权限。
revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:
revoke all on * . * from dba @localhost ;
八、MySQL grant、revoke 用户权限注意事项
1. grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。
2. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“
这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。
*************************************************************************************************
遇到 SELECT command denied to user '用户名'@'主机名' for table '表名' 这种错误,解决方法是需要把吧后面的表名授权,即是要你授权核心数据库也要。
我遇到的是SELECT command denied to user 'my'@'%' for table 'proc',是调用存储过程的时候出现,原以为只要把指定的数据库授权就行了,什么存储过程、函数等都不用再管了,谁知道也要把数据库mysql的proc表授权
*************************************************************************************************
参考:http://zhidao.baidu.com/question/19633785.html
mysql授权表共有5个表:user、db、host、tables_priv和columns_priv。
授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。
db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。
host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。
tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。
columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。
http://blog.itpub.net/7607759/viewspace-675079/
2.2 授予权限
前面提到了grant命令,grant的语法看起来可是相当复杂的呐:
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
加粗的几个子项说明如下:
l object_type:
TABLE
| FUNCTION
| PROCEDURE
l priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
l ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
l with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
-
|
priv_type最简单,但可选项最多,官方文档中专门列了个表很清晰:
权限类型 |
简要说明 |
ALL [PRIVILEGES] |
Grant all privileges at specified access level except GRANT OPTION |
ALTER |
Enable use of ALTER TABLE |
ALTER ROUTINE |
Enable stored routines to be altered or dropped |
CREATE |
Enable database and table creation |
CREATE ROUTINE |
Enable stored routine creation |
CREATE TEMPORARY TABLES |
Enable use of CREATE TEMPORARY TABLE |
CREATE USER |
Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES |
CREATE VIEW |
Enable views to be created or altered |
DELETE |
Enable use of DELETE |
DROP |
Enable databases, tables, and views to be dropped |
EVENT |
Enable use of events for the Event Scheduler |
EXECUTE |
Enable the user to execute stored routines |
FILE |
Enable the user to cause the server to read or write files |
GRANT OPTION |
Enable privileges to be granted to or removed from other accounts |
INDEX |
Enable indexes to be created or dropped |
INSERT |
Enable use of INSERT |
LOCK TABLES |
Enable use of LOCK TABLES on tables for which you have the SELECT privilege |
PROCESS |
Enable the user to see all processes with SHOW PROCESSLIST |
REFERENCES |
Not implemented |
RELOAD |
Enable use of FLUSH operations |
REPLICATION CLIENT |
Enable the user to ask where master or slave servers are |
REPLICATION SLAVE |
Enable replication slaves to read binary log events from the master |
SELECT |
Enable use of SELECT |
SHOW DATABASES |
Enable SHOW DATABASES to show all databases |
SHOW VIEW |
Enable use of SHOW CREATE VIEW |
SHUTDOWN |
Enable use of mysqladmin shutdown |
SUPER |
Enable use of other adminstrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin debug command |
TRIGGER |
Enable triggers to be created or dropped |
UPDATE |
Enable use of UPDATE |
USAGE |
Synonym for “no privileges |
括弧,权限说明的英文语法很简单,俺偷个懒,就不译成中文的。
以上几段加一块基本上就是grant语句的语法,看起来呢是复杂了一点点,不过看不懂没关系,再说就算看懂了也不一定记的住,就像现在人人都知道要先感谢国家,但是人人也都明白不过说说而已(不过百万裸官在海外的亲戚们说这话时应该是真心的),关键还是得动真格的,得会用才行,三思争取后面多弄几个例子,让大家伙都搞明白这个事儿。
提示:
-
不使用grant语句,而通过insert,update方式修改字典表也是靠谱的!
重点说一下with_option的几个选项:
- GRANT OPTION:允许用户再将该权限授予其它用户;
- MAX_QUERIES_PER_HOUR:允许用户每小时执行的查询语句数量;
- MAX_UPDATES_PER_HOUR:允许用户每小时执行的更新语句数量;
- MAX_CONNECTIONS_PER_HOUR:允许用户每小时连接的次数;
- MAX_USER_CONNECTIONS:允许用户同时连接服务器的数量;
这块的内容一看就是给用户设限制使的,我个人认为意义不大,不过简单了解一下也是有必要的,万一哪天对某用户看着不爽,DBA心里应该明白,还是有法子限制该用户能够使用的资源的。
其它部分就先不多说了,何况这个事儿也不能说的太细,主要是太细的东西三思也不懂,不懂装懂这个事儿俺脸皮虽然已经很厚,但做这类事儿的时候表情总是不够自然,不过请童鞋们放心,俺一定会继续努力,争取早日成功复制那谁的成功,用俺的真诚蒙到别人,蒙到所有的人~~~
2.3 收回权限
要收回用户权限,与之对应的命令是revoke,它的语法从定义上分为两种:
- REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...
- REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
前者用来处理指定的权限,后者去掉所有权限。Revoke语法的子句定义与grant中同名子句定义一模一样,这里不再复述。
如果想确定用户当前都拥有什么权限,可以使用show grants语句,例如,查看用户jss_grant@10.0.0.99都拥有哪些权限,执行语句如下:
mysql> show grants for jss_grant@10.0.0.99;
+------------------------------------------------------------------------------------------------------------------+
| Grants for jss_grant@10.0.0.99 |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jss_grant'@'10.0.0.99' IDENTIFIED BY PASSWORD '*284578888014774CC4EF4C5C292F694CEDBB5457' |
| GRANT SELECT ON `mysql`.`user` TO 'jss_grant'@'10.0.0.99' |
+------------------------------------------------------------------------------------------------------------------+
-
2 rows in set (0.00 sec)
从上述返回的结果可以看到,用户jss_grant@10.0.0.99拥有两个权限,查询mysql.user表的查询,以及登录MySQL数据库的权限。一般用户只要创建,就会拥有usage on *.*的权限,该权限无法通过revoke语句收回,切记切记。
尝试,收回jss_grant用户对mysql.user的select权限,操作如下:
mysql> revoke select on mysql.user from jss_grant@10.0.0.99;
-
Query OK, 0 rows affected (0.00 sec)
2.4 删除用户
删除用户的语法非常简单:
-
DROP USER user [, user] ...
从语法上看与ORACLE有一点点不同,这个我感觉还是有必要提一下,比如ORACLE中的删除用户(或其它对象比如表空间),如果该用户下有别的对象,那么默认删除操作会失败,ORACLE提示需要先清理一下该用户下的对象,如果强制删除的话呢,它提供了一个CASCADE子句,附加该子句后就不再提示,即使存在关联对象也将自动将其删除。
MySQL的删除用户语法中就不存在CASCADE的子句,为什么不存在呢,并不是MySQL对数据的保护不如ORACLE那么上心,而是由于最重要的一条与ORACLE不同的机制决定,MySQL数据库中的对象保存并不是依赖于用户,而是依赖于库(db),用户被删除没有任何关系,对象仍在,好好的保存在其所存储的数据库中,因此,MySQL数据库中的用户删了就删了,如果外部应用不使用该用户的话,那么我们可以认为该用户被删除无影响。即使发现真的删错了,该用户其实早就立志将一生奉献给镰刀斧头帮,并且作风过硬,对party和国家无限忠诚,party让咬谁就咬谁。想给它恢复身份的话也很简单,这不就是组织上一句话的事儿嘛,只要重新向mysql.user表重新插入记录(注册建档),并授予所需权限即可(授予官阶),至于底层数据的意见那是完全可以忽视的。
提示:
-
DROP USER不会自动中止已连接的用户会话,也就是说被删的用户如果在删前已经连接上了服务器,并且没有尚未中断,那它此时还能继续执行一定的操作,只是,它的身份已经变成了黑户。
=======================================