|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
mysql的prepare其实是本地PHP客户端模拟的,并没有根据你mysql的设置做字符集的调整。应该交与mysqlserver端做prepare,同时得调用mysql_set_character_set去操作,server才会按照字符集去做转义。上面就会商一些例子。
1.1谁能毗连,从那儿毗连?
你能够同意一个用户从特定的或一系列主机毗连。有一个极度,假如你晓得晋升从一个主机毗连,你能够将权限范围于单个主机
:GRANTALLONsamp_db.*TOboris@localhostIDENTIFIEDBY"ruby"GRANTALLONsamp_db.*TOfred@res.mars.comIDENTIFIEDBY"quartz"
(samp_db.*意义是“samp_db数据库的一切表)
另外一个极度是,你大概有一个常常游览并必要能从天下各地的主机毗连的用户max。在这类情形下,你能够同意他不管从那里毗连:
GRANTALLONsamp_db.*TOmax@%IDENTIFIEDBY"diamond"
“%”字符起通配符感化,与LIKE形式婚配的寄义不异。在上述语句中,它意味着“任何主机”。以是max和max@%等价。这是创建用户最复杂的办法,但也是最不平安的。
取个中,你能够同意一个用户从一个受限的主机汇合会见。比方,要同意mary从snake.net域的任何主机毗连,用一个%.snake.net主机指定符:
GRANTALLONsamp_db.*TOmary@.snake.netIDENTIFIEDBY"quartz";
假如你喜好,用户标识符的主机部分能够用IP地点而不是一个主机名来给定。你能够指定一个IP地点或一个包括形式字符的地点,并且,从MySQL3.23,你还能够指定具有指出用于收集号的位数的收集掩码的IP号:
GRANTALLONsamp_db.*TOboris@192.168.128.3IDENTIFIEDBY"ruby"GRANTALLONsamp_db.*TOfred@192.168.128.%IDENTIFIEDBY"quartz"GRANTALLONsamp_db.*TOrex@192.168.128.0/17IDENTIFIEDBY"ruby"
第一个例子指出用户能从其毗连的特定主机,第二个指定关于C类子网192.168.128的IP形式,而第三条语句中,192.168.128.0/17指定一个17位收集号并婚配具有192.168.128头17位的IP地点。
假如MySQL埋怨你指定的用户值,你大概必要利用引号(只将用户名和主机名部分分隔加引号)。
GRANTALLONsamp_db.presidentTO"myfriend"@"boa.snake.net"
1.2用户应当有甚么级其余权限和它们应当合用于甚么?
你能够受权分歧级其余权限,全局权限是最壮大的,由于它们合用于任何数据库。要使ethel成为可做任何事变的超等用户,包含能受权给别的用户,收回以下语句:
GRANTALLON*.*TOethel@localhostIDENTIFIEDBY"coffee"WITHGRANTOPTION
ON子句中的*.*意味着“一切数据库、一切表”。从平安思索,我们指定ethel只能从当地毗连。限定一个超等用户能够毗连的主机一般是明智的,由于它限定了试图破解口令的主机。
有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是办理权限而且只能用"ON*.*"全局权限指定符受权。假如你乐意,你能够受权这些权限,而不受权数据库权限。比方,以下语句设置一个flush用户,他只能收回flush语句。这大概在你必要实行诸如清空日记等的办理剧本中会有效:
GRANTRELOADON*.*TOflushl@localhostIDENTIFIEDBY"flushpass"
一样平常地,你想受权办理权限,小气点,由于具有它们的用户能够影响你的服务器的操纵。
数据库级权限合用于一个特定命据库中的一切表,它们可经由过程利用ONdb_name.*子句授与:
GRANTALLONsamp_dbTObill@racer.snake.netINDETIFIEDBY"rock"GRANTSELECTONsamp_dbTOro_user@%INDETIFIEDBY"rock"
第一条语句向bill受权samp_db数据库中一切表的权限,第二条创立一个严厉限定会见的用户ro_user(只读用户),只能会见samp_db数据库中的一切表,但只要读取,即用户只能收回SELECT语句。
你能够列出一系列同时授与的各个权限。比方,假如你想让用户能读取并能修正现无数据库的内容,但不克不及创立新表或删除表,以下授与这些权限:
GRANTSELECT,INSERT,DELETE,UPDATEONsamp_dbTObill@snake.netINDETIFIEDBY"rock"
关于更精巧的会见把持,你能够在各个表上受权,或乃至在表的每一个列上。当你想向用户埋没一个表的部分时,或你想让一个用户只能修正特定的列时,列特定权限十分有效。如:
GRANTSELECTONsamp_db.memberTObill@localhostINDETIFIEDBY"rock"GRANTUPDATE(expiration)ONsamp_db.memberTObill@localhost
第一条语句授与对全部member表的读权限并设置了一个口令,第二条语句增添了UPDATE权限,当只对expiration列。没需要再指定口令,由于第一条语句已指定了。
假如你想对多个列授与权限,指定一个用逗号分隔的列表。比方,对assistant用户增添member表的地点字段的UPDATE权限,利用以下语句,新权限将加到用户已有的权限中:
GRANTUPDATE(street,city,state,zip)ONsamp_dbTOassistant@localhost
一般,你不想授与任何比用户的确必要的权限宽的权限。但是,当你想让用户能创立一个一时表以保留两头了局,但你又不想让他们在一个包括他们不该修正内容的数据库中如许做时,产生了要授与在一个数据库上的绝对宽松的权限。你能够经由过程创建一个分隔的数据库(如tmp)并授与开数据库上的一切权限来举行。比方,假如你想让来自mars.net域中主机的任何用户利用tmp数据库,你能够收回如许的GRANT语句:
GRANTALLONtmp.*TO""@mars.net
在你做完以后,用户能够创立并用tmp.tbl_name情势援用tmp中的表(在用户指定符中的""创立一个匿名用户,任何用户均婚配空缺用户名)。
1.3用户应当被同意办理权限吗?
你能够同意一个数据库的具有者经由过程授与数据库上的一切具有者权限来把持数据库的会见,在受权时,指定WITHGRANTOPTION。比方:假如你想让alicia能从big.corp.com域的任何主机毗连并具有sales数据库中一切表的办理员权限,你能够用以下GRANT语句:
GRANTALLONsales.*TOalicia@%.big.corp.comINDETIFIEDBY"applejuice"WITHGRANTOPTION
在效果上WITHGRANTOPTION子句同意你把会见受权的权力授与另外一个用户。要注重,具有GRANT权限的两个用户能够相互受权。假如你只赐与了第一个用户SELECT权限,而另外一个用户有GRANT加上SELECT权限,那末第二个用户能够是第一个用户更“壮大”。
2撤权并删除用户
要作废一个用户的权限,利用REVOKE语句。REVOKE的语法十分相似于GRANT语句,除TO用FROM代替而且没有INDETIFEDBY和WITHGRANTOPTION子句:
REVOKEprivileges(columns)ONwhatFROMuser
user部分必需婚配本来GRANT语句的你想撤权的用户的user部分。privileges部分不需婚配,你能够用GRANT语句受权,然后用REVOKE语句只打消部分权限。
REVOKE语句只删除权限,而不删除用户。即便你打消了一切权限,在user表中的用户纪录仍然保存,这意味着用户仍旧能够毗连服务器。要完整删除一个用户,你必需用一条DELETE语句明白从user表中删除用户纪录:
%mysql-urootmysqlmysql>DELETEFROMuser->WHEREUser="user_name"andHost="host_name";mysql>FLUSHPRIVILEGES;
DELETE语句删除用户纪录,而FLUSH语句告知服务重视载受权表。(当你利用GRANT和REVOKE语句时,表主动重载,而你间接修正受权表时不是。)
这里我们讨论用binlog来实现闪回的方案。 |
|