MYSQL数据库的用户帐号管理基础知识 (1)
2007-11-11 15:48:22 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備浇顕栭崹搴ㄥ礃閿濆棗鐦遍梻鍌欒兌椤㈠﹤鈻嶉弴銏犵闁搞儺鍓欓悘鎶芥煛閸愩劎澧曠紒鈧崘鈹夸簻闊洤娴烽ˇ锕€霉濠婂牏鐣洪柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝搴e垝椤栫偛桅闁告洦鍨扮粻鎶芥倵閿濆簼绨藉ù鐘荤畺濮婃椽妫冨☉娆愭倷闁诲孩鐭崡鎶芥偘椤曗偓瀹曞爼顢楁径瀣珫婵犳鍣徊鍓р偓绗涘洤绠查柛銉墮閽冪喖鏌i弬鎸庢喐闁荤喎缍婇弻娑⑩€﹂幋婵囩亪濡炪値鍓欓悧鍡涒€旈崘顔嘉ч幖绮光偓鑼嚬缂傚倷绶¢崰妤呭箰閹间焦鍋╅柣鎴f绾偓闂佺粯鍔曠粔闈浳涢崘顔兼槬闁逞屽墯閵囧嫰骞掗幋婵愪紑閻庤鎸风粈渚€鍩為幋锔藉亹闁圭粯甯╂导鈧紓浣瑰劤瑜扮偟鍒掑▎鎾宠摕婵炴垶鐭▽顏堟煙鐟欏嫬濮囨い銉︾箞濮婃椽鏌呴悙鑼跺濠⒀傚嵆閺岀喖鎼归锝呯3闂佹寧绻勯崑娑㈠煘閹寸姭鍋撻敐搴樺亾椤撴稒娅婇柡灞界У濞碱亪骞忕仦钘夊腐闂備焦鐪归崐鏇㈠箠閹邦喗顫曢柟鎯х摠婵挳鏌涢幘鏉戠祷闁告挸宕—鍐Χ閸℃浠搁梺鑽ゅ暱閺呮盯鎮鹃悜钘壩ㄧ憸澶愬磻閹剧粯鏅查幖绮瑰墲閻忓秹姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栨氨鐤€闂傚倸鐗婄粙鎰姳閼测晝纾藉ù锝堟閻撴劖鎱ㄥΟ绋垮婵″弶鍔欓獮妯兼嫚閼碱剦妲伴梻浣稿暱閹碱偊宕愭繝姣稿洭寮舵惔鎾存杸濡炪倖姊婚妴瀣啅閵夛负浜滄い鎾跺仜濡插鏌i敐鍥у幋妤犵偞甯¢獮瀣籍閳ь剟鎮楁繝姘拺閻熸瑥瀚崕妤呮煕濡 鍋撻悢鎻掑緧婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔煎礈瑜忕敮娑㈡煃闁垮鐏﹂柕鍥у楠炴帡宕卞鎯ь棜缂傚倸鍊风粈渚€藝闁秴鏋佸┑鐘虫皑瀹撲線鏌涢埄鍐姇闁稿﹦鍏橀弻娑樷攽閸℃浼€濡炪倖姊归崝鏇㈠煘閹达附鍊婚柛銉㈡櫇鏍¢梻浣告啞閹稿鎮烽敂鐣屸攳濠电姴娲﹂崵鍐煃閸濆嫬鏆熼柨娑欑矒濮婇缚銇愰幒鎴滃枈闂佸憡鐟ユ鎼佸煝閹炬枼鍫柛顐ゅ枔閸樻悂鏌h箛鏇炰户缁绢厼鐖煎畷鎴﹀箻鐠囪尙鐤€婵炶揪绲介幉锟犲磹椤栫偞鈷戠痪顓炴噹娴滃綊鎮跺☉鏍у姦闁糕斁鍋撳銈嗗笒閸燁偊鎯冨ú顏呯厸濞达絽婀辨晶顏堟煃鐟欏嫬鐏撮柟顔界懇瀵爼骞嬮悩杈敇闂傚倷绀佸﹢杈ㄧ仚闂佺濮ょ划搴ㄥ礆閹烘绫嶉柛顐ゅ枎娴犺櫣绱撴担鍓插創妞ゆ洘濞婇弫鍐磼濞戞艾骞堥梻浣告惈濞层垽宕濆畝鍕€堕柣妯肩帛閻撴洟鏌熼懜顒€濡煎ù婊勫劤閳规垿鏁嶉崟顐℃澀闂佺ǹ锕ラ悧鐘茬暦濠靛鏅濋柍褜鍓熼垾锕傚锤濡も偓閻掑灚銇勯幒宥堝厡缂佺姴澧介埀顒€鍘滈崑鎾斥攽閻樿京绐旈柛瀣殔閳规垿顢欑涵鐑界反濠电偛鎷戠徊鍨i幇鏉跨闁瑰啿纾崰鎾诲箯閻樼粯鍤戦柤绋跨仛濮f劙姊婚崒姘偓鐑芥嚄閼哥數浠氭繝鐢靛仜椤曨參宕楀Ο渚殨妞ゆ劑鍊栫€氭氨鈧懓澹婇崰鏍р枔閵婏妇绡€闁汇垽娼ф牎缂佺偓婢樼粔鐟邦嚕閺屻儱绠甸柟鐑樼箘閸炵敻鏌i悩鐑橆仩閻忓繈鍔岄蹇涘Ψ瑜夐崑鎾舵喆閸曨剙纰嶅┑鈽嗗亝缁诲倿锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛顓奸崶鈺冿紳婵炶揪缍侀ˉ鎾诲礉瀹ュ鐓欑紒瀣仢閺嗛亶鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷鎴濆暟妤犲洭鎮楃憴鍕碍缂佸鎸抽垾鏃堝礃椤斿槈褔鏌涢埄鍏狀亪妫勫鍥╃=濞达絽澹婇崕鎰版煕閵娿儱顣崇紒顔碱儏椤撳吋寰勭€n亖鍋撻柨瀣ㄤ簻闁瑰搫绉堕ˇ锔锯偓娈垮枛閻忔繈鍩為幋锕€鐓¢柛鈩冾殘娴狀垶姊洪崨濠庣劶闁告洦鍙庡ú鍛婁繆閵堝繒鍒伴柛鐕佸灦瀹曟劙宕归锝呭伎濠碘槅鍨抽崢褎绂嶆ィ鍐╁€垫慨妯煎亾鐎氾拷

怎样在授权表项中指定本地主机名
如果您使用服务器的主机名而非localhost,通常存在从该服务器主机连接的问题。这可能是由于在授权表中指定名字的方法和名字分解器例程( name reslover routine)向程序报告名字的方法之间的错误匹配。如果分解器报告了一个非限定的名字(如p i t - v i per),但授权表包含了具有全限定的名字的项(如p i t - v i per. s n a k e . n e t,反之亦然),则发生错误匹配。
为了确定这种情况是否正在系统中发生,可试着用-h 选项连接到本地服务器,该选项指定了主机的名字。然后查看服务器的常规日志文件。它是怎样报告主机名的?是以非限定形式还是限定形式?不论它是哪种形式,都将告诉您在发布GRANT 语句时需要怎样指定用户说明符的主机名部分。
可以同时列出许多被授予的单个权限。例如,如果想让用户能读取和修改已有表的内容,但又不允许创建新表或删除表,可按如下授权:
GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db.* TO jennie@%
IDENTIFIEDBY "boron"
对于更小粒度( f i n e - g r a i n e d)的访问控制,可以在单个表上授权,甚至在表的单个列上授权。当存在要对用户隐藏的表时,或者,当只允许用户修改特定列时,列专有的权限是有用的。假定历史同盟会中有一些志愿者利用您作为同盟会秘书应履行的职责来帮助您工作。这是一个好消息,但您决定首先给新的助手授予对member 表只读的权限(该表中包含了会员资格的信息),然后再对他们增加授予该表的expiration 列的列专有UPDATE权限。也就是说,您的助手可以在人们更新其会员资格时进行更改截止日期的工作。设置此MySQL(和PHP搭配之最佳组合)用户的语句如下:

第一条语句授予对整个member 表的读访问权并设置口令。第二条语句增加UPDATE权限,但只是对expiration 列。此时不必要再指定口令,因为在第一条语句中已经完成了。
如果想要为多个列授予列专有的权限,可指定一个列清单,并用逗号将这些列分隔。例如,为了给assistant 用户增加对member 表地址列的UPDATE权限,可以使用下列语句。新的权限将被增加到对该用户来说已经存在的所有列上:
GRANT UPDATE (street,city,state,zip) ON samp_db.member
TO assistant@localhost
通常,不要给用户授予比实际需要更大的权限。但是,当您想要使用户能够创建存储中间结果的临时表,而又不允许用户在包含有他们不能修改的数据的数据库中这样做时,就有了要在数据库上授予相当多的许可权限的理由。您可以建立一个单独的数据库(笔者称它为t m p)并授予用户该数据库的所有权限。例如,如果想要mars.net 域的主机中的任何用户都能够使用tmp 数据库,可发布下列GRANT语句:
GRANT ALL ON tmp.* TO ""@%.mars.net
在完成这些之后,用户可使用tmp.tbl_name 格式的名字创建和引用tmp 数据库中的表(用户说明符中的“” 创建一个匿名用户项,任何用户都与空白用户名相匹配)。
3. 允许用户管理权限吗
通过授予数据库所有者数据库的所有权限并在操作时指定WITH GRANT OPTION,可以允许数据库所有者控制对该数据库的访问。例如,如果要让alicia 能在big.corp.com 域的所有主机中进行连接并管理sales 数据库中所有表的权限,应使用下列GRANT语句:

实际上,WITH GRANT OPTION 子句允许将访问的权利授予给另一个用户。要知道,具有GRANT 权限的两个用户可以相互授予自己的权限。如果只给一个用户授予SELECT 权限而给另一个用户除SELECT 外还授予了GRANT 和其他的权限,则第二个用户可以使第一个用户“强大”起来。
取消权限和删除用户
为了收回某个用户的权限,可使用REVOKE 语句。除了要用FROM 替换TO 并且没有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的语法与GRANT 语句非常相似:
REVOKE privileges (columns) ON what FROM user
user 部分必须与您想要取消其权限的用户的原始GRANT 语句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 语句授权,然后用REVOKE 语句取消其中的一部分。REVOKE 语句只删除权限,不删除用户。用户的项仍然保留在user 表中,即使您取消了该用户的所有权限也是如此。这意味着该用户仍然可连接到服务器上。要想删除整个用户,必须用DELETE 语句将该用户的记录从user 表中直接删除:

DELETE 语句删除该用户的项, FLUSH 语句告诉服务器重新加载授权表(当使用GRANT 或REVOKE 语句,而不是直接修改授权表时,这些表将自动重新加载)。
一个权限难题,第一部分
下面是一个在MySQL(和PHP搭配之最佳组合)邮件清单中反复出现的情况:一位新的MySQL(和PHP搭配之最佳组合)管理员给某用户增加一个项,使用了主机名部分,该部分是用一个模式来指定的。例如:
GRANT ALL ON samp_db.* TO fred@%.snake.net IDENTIFIEDBY "cocoa"
这里的意图是允许用户fred 从snake.net 域的所有主机中进行连接,并且具有对samp_db 数据库的所有权限。事实上, fred 能够从那些主机中连接(除了服务器主机本身外)。当fred 试着从服务器主机中进行连接时,该企图以“访问被拒绝”的消息而告失败。
即使用户指定了正确的口令也是如此。
如果授权表中包含了由MySQL(和PHP搭配之最佳组合)_install_db 安装脚本安装的缺省项,这种情况也会发生。其原因是,当服务器验证fred 连接的企图时,一个匿名用户项( anonymous-user entry)比fred 项优先。匿名用户项要求该用户不用口令来连接,并且一个口令错误匹配发生。
该问题的另一个背景将在第12章“权限难题,第二部分”中给出。目前,只要说修正此问题的方法是从user 表中删除匿名用户项就足够了,我们不能用R E V O K E,因为该命令只删除权限。要想完全摆脱这些匿名项,执行如下操作:
% MySQL(和PHP搭配之最佳组合)-uroot MySQL(和PHP搭配之最佳组合) MySQL(和PHP搭配之最佳组合)> DELETE FROM user where User="";
MySQL(和PHP搭配之最佳组合)>FLUSH PRIVILEGES;
现在,当fred 试图从本地主机连接时成功了。
更多精彩
赞助商链接