若天明 发表于 2015-1-16 22:34:05

MYSQL网页编程之MYSQL用户帐号办理

解决方案提供商开始推动DBaaS浪潮之前,他们应该深入了解究竟什么是DBaaS。mysql|帐号办理MySQL办理员应当晓得如何经由过程指定哪些用户可毗连到服务器、从那里举行毗连,和在毗连时做甚么,来设置MySQL用户账号。MySQL3.22.11引进了两个更简单举行这项事情的语句:GRANT语句创立MySQL用户并指定其权限,REVOKE语句删除权限。这两个语
句充任mysql数据库中的受权表的前端,并供应间接利用这些表内容的可选择的办法。GRANT和REVOKE语句影响以下四个表:
受权表内容user可毗连到服务器的用户和他们具有的任何全局特权db数据库级的特权tables_priv表级特权columns_priv列级特权另有第五个受权表(host),但它不受GRANT或REVOKE的影响。
当您为某个用户公布GRANT语句时,应在user表中为该用户创立一个项。假如该语句指定了一切全局特权(办理权限或用于一切数据库的权限),则这些指定也被纪录在user表中。假如指定了数据库、表或列的权限,它们将纪录在db、tables_priv和columns_priv表中。
利用GRANT和REVOKE语句比间接修正受权表更简单。可是,倡议您最好经由过程浏览第12章来增补本章的内容,第12章中具体会商了受权表。这些表十分主要,作为一名办理员应当懂得这些表是如何在GRANT和REVOKE语句级上事情的。
本节上面的部分将会商怎样设置MySQL用户的账号和受权,还将先容怎样作废权限和从受权表中删除全体用户,而且将思索一个困扰很多新的MySQL办理员的困难。
您还要思索利用mysqlaccess和mysql_setpermission剧本,它们是MySQL分发包的构成部分。这些是Perl的剧本,它们供应了设置用户账号的GRANT语句的代用品。mysql_setpermission必要具有DBI的撑持情况。

创立新用户和受权

GRANT语句的语法以下:
GRANTprivileges(columns)
ONwhat
TOuserIDENTIFIEDBY"password"
WITHGRANTOPTION
要利用该语句,必要填写以下部分:
privileges分派给用户的权限。下表列出了可在GRANT语句中利用的权限申明符:
权限申明符权限同意的操纵

上表显现的第一组权限申明符合用于数据库、表和列。第二组申明符是办理特权。一般,这些权限的授与相称守旧,由于它们会影响服务器的操纵(比方,SHUTDOWN特权不是按天天来分发的权限)。第三组申明符是特别的。ALL的意义是“一切的权限”,而USAGE的
意义是“无权限”─即创立用户,但不授与任何的权限。
columns权限合用的列。这是可选的,只来设置列专有的权限。假如定名多于一个列,则用逗号分隔。
what权限使用的级别。权限能够是全局的(合用于一切数据库和一切的表)、数据库专有的(合用于某个数据库中的一切表),或表专有的。能够经由过程指定一个COLUMNS子句将权限授与特定的列。
user利用权限的用户。它由用户名和主机名构成。在MySQL中,不但指定谁举行毗连,还要指定从那里毗连。它同意您具有两个带有不异名字的、从分歧地位毗连的用户。MySQL同意在它们之间举行区分并互相自力地分派权限。
MySQL的用户名就是您在毗连到服务器时指定的名字。该名字与您的UNIX注册名或Windows名的没有一定结合。缺省设置时,客户机程序将利用您注册的名字作为MySQL的用户名(假如您不明白指定一个名字的话),但这只是一个商定。有关将root作为能够
操纵统统MySQL的超等用户名也是如许,就是一种商定。您也能够在受权表中将此名修正成nobody,然后作为nobody用户举行毗连,以实行必要超等用户特权的操纵。
password分派给该用户的口令。这是可选的。假如您不给新用户指定IDENTIFIEDBY子句,该用户不分派口令(长短平安的)。关于已有的用户,任何指定的口令将替换旧口令。假如不指定新口令,用户的旧口令仍旧坚持稳定。当您的确要利用IDENTIFIEDBY时,该口令串应当是间接量,GRANT将对口令举行编码。当用SETPASSWORD语句时,不要利用PASSWORD()函数。
WITHGRANTOPTION子句是可选的。假如包括该子句,该用户能够将GRANT语句授与的任何权限授与其他的用户。可使用该子句将受权的才能授与其他的用户。
用户名、口令和数据库和表的称号在受权表项中是辨别巨细写的,而主机名和列名则不是。
经由过程查询某些成绩,一般能够揣度出所需的GRANT语句的范例:
谁能够举行毗连,从那里毗连?
用户应具有甚么级其余权限,这些权限合用于甚么?
同意用户办理权限吗?
让我们来发问这些成绩,同时看一些使用GRANT语句设置MySQL用户账号的例子。
1.谁能够举行毗连,从那里毗连
您能够同意用户在特定的主机或触及局限很宽的一组主机中举行毗连。在一个极度,假如晓得用户将仅从谁人主机中举行毗连,则可限制对单个主机的会见:
GRANTALLONsamp_db.*TOboris@localhostIDENTFIEDBY"ruby"
GRANTALLONsamp_db.*TOfred@ares.mars.netIDENTFIEDBY"quartz"
(标记samp_db.*寄义是“在samp_db数据库中的一切表”)在另外一个极度,您大概会有一个用户max,他漫游天下并必要可以从天下各地的主机中举行毗连。在这类情形下,不管他从那里毗连您都将同意:
GRANTALLONsamp_db.*TOmax@%IDENTFIEDBY"diamond"
‘%’字符起通配符的感化,与LIKE形式婚配的寄义不异,在上个语句中,它的意义是“任何主机”。假如您基本不给出主机名部分,则它与指定“%”的寄义不异。因而,max和max@%是等价的。这是设置一个用户最简单的办法,但平安性最小。
要想接纳让步的举措,可同意用户在一组无限的主机中举行毗连。比方,要使mary从snake.net域的任何主机中举行毗连,可以使用%.snake.net主机申明符:
GRANTALLONsamp_db.*TOmary@%.snake.netIDENTFIEDBY"topaz"
该用户标识符的主机部分可用IP地点而不是主机名给出(假如乐意的话)。能够指定一个间接的IP地点或包括形式字符的地点。一样,自MySQL3.23起,能够用一个收集掩码来指定IP号,收集掩码标明了用于该收集号的二进制位数:
GRANTALLONsamp_db.*TOjoe@192.168.0.3IDENTIFIEDBY"water"
GRANTALLONsamp_db.*TOardis@192.168.128.%IDENTIFIEDBY"snow"
GRANTALLONsamp_db.*TOrex@192.168.128.0/17IDENTIFIEDBY"ice"
第一条语句指明用户可举行毗连的特定的主机。第二条语句指定129.168.128ClassC子网的IP形式。在第三条语句中,192.168.128.0/17指定一个17位二进制的收集号,并将任何主机与其IP地点的前17个二进制位中的192.168.128.0/17举行婚配。
假如MySQL埋怨您指定的用户值,则大概必要利用引号(但对用户名和主机名分离加引号):
GRANTALLONsamp_db.presidentTO"myfriend"@"boa.snake.net"
2.用户应具有甚么级其余权限,这些权限合用于甚么
您可授与分歧级其余权限。全局权限的功效最强,由于它们合用于任何数据库。为了使ethel成为能够举行统统操纵的超等用户(个中包含能够对其他用户受权),公布以下语句:
GRANTALLON*.*TOethel@localhostIDENTIFIEDBY"coffee"
WITHGRANTOPTION
ON子句中*.*申明符的意义是“一切数据库,一切的表”,为保险起见,我们已指定ethel只能从当地主机中毗连。限定超等用户从哪些主机长进行毗连一般是明智的做法,由于它限定住了其他用户对口令举行探索。
有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是办理权限,只能用NO*.*全局权限申明符来授与。假如但愿的话,也能够不必授与数据库级的权限来授与这些权限。比方,以下语句创建了一个flush用户,它除公布FLUSH语句外不做其他任何事变。在办理剧本中这多是有效的,由于必要在这些剧本中实行诸如在日记文件轮回时代革新日记的操纵:
GRANTRELOADON*.*TOflush@localhostIDENTIFIEDBY"flushpass"
一般授与办理权限应当是守旧的,由于具有这些权限的用户大概影响服务器的操纵。
数据库级的权限合用于特定命据库中的一切表。这些权限利用ONdb_name.*子句举行授与:
GRANTALLONsamp_db.*TObill@racer.snake.netIDENTIFIEDBY"rock"
GRANTSELECTONmenagerie.*TOro_user@%IDENTIFIEDBY"dirt"
第一条语句将bill的一切权限授与samp_db数据库的任何表。第二条语句创立一个限定会见的用户ro_user(只读用户),它能够会见menagerie数据库的一切表,但只能读取。也就是说,该用户只能公布SELECT语句。
如何在受权表项中指定当地主机名
假如您利用服务器的主机名而非localhost,一般存在从该服务器主机毗连的成绩。这多是因为在受权表中指命名字的办法和名字分化器例程(nameresloverroutine)向程序呈报名字的办法之间的毛病婚配。假如分化器呈报了一个非限制的名字(如pit-viper),但受权表包括了具有全限制的名字的项(如pit-viper.snake.net,反之亦然),则产生毛病婚配。
为了断定这类情形是不是正在体系中产生,可试着用-h选项毗连到当地服务器,该选项指定了主机的名字。然后检察服务器的惯例日记文件。它是如何呈报主机名的?是以非限制情势仍是限制情势?不管它是哪一种情势,都将告知您在公布GRANT语句时必要如何指定用户申明符的主机名部分。
能够同时列出很多被授与的单个权限。比方,假如想让用户能读取和修正已有表的内容,但又不同意创立新表或删除表,可按以下受权:
GRANTSELECT,INSERT,DELETE,UPDATEONsamp_db.*TOjennie@%
IDENTIFIEDBY"boron"
关于更小粒度(fine-grained)的会见把持,能够在单个表上受权,乃至在表的单个列上受权。当存在要对用户埋没的表时,大概,当只同意用户修正特定列时,列专有的权限是有效的。假定汗青联盟会中有一些意愿者使用您作为联盟会秘书应实行的职责来匡助您事情。这是一个好动静,但您决意起首给新的助手授与对member表只读的权限(该表中包括了会员资历的信息),然后再对他们增添授与该表的expiration列的列专有UPDATE权限。也就是说,您的助手能够在人们更新其会员资历时举行变动停止日期的事情。设置此MySQL用户的语句以下:

第一条语句授与对全部member表的读会见权并设置口令。第二条语句增添UPDATE权限,但只是对expiration列。此时不用要再指定口令,由于在第一条语句中已完成了。
假如想要为多个列授与列专有的权限,可指定一个列清单,并用逗号将这些列分开。比方,为了给assistant用户增添对member表地点列的UPDATE权限,可使用以下语句。新的权限将被增添到对该用户来讲已存在的一切列上:
GRANTUPDATE(street,city,state,zip)ONsamp_db.member
TOassistant@localhost
一般,不要给用户授与比实践必要更年夜的权限。可是,当您想要利用户可以创立存储两头了局的一时表,而又不同意用户在包括有他们不克不及修正的数据的数据库中如许做时,就有了要在数据库上授与相称多的允许权限的来由。您能够创建一个独自的数据库(笔者称它为
tmp)并授与用户该数据库的一切权限。比方,假如想要mars.net域的主机中的任何用户都可以利用tmp数据库,可公布以下GRANT语句:
GRANTALLONtmp.*TO""@%.mars.net
在完成这些以后,用户可以使用tmp.tbl_name格局的名字创立和援用tmp数据库中的表(用户申明符中的“”创立一个匿名用户项,任何用户都与空缺用户名相婚配)。
3.同意用户办理权限吗
经由过程授与数据库一切者数据库的一切权限并在操纵时指定WITHGRANTOPTION,能够同意数据库一切者把持对该数据库的会见。比方,假如要让alicia能在big.corp.com域的一切主机中举行毗连并办理sales数据库中一切表的权限,应利用以下GRANT语句:

实践上,WITHGRANTOPTION子句同意将会见的权力授与给另外一个用户。要晓得,具有GRANT权限的两个用户能够互相授与本人的权限。假如只给一个用户授与SELECT权限而给另外一个用户除SELECT外还授与了GRANT和其他的权限,则第二个用户可使第一个用户“壮大”起来。

作废权限和删除用户

为了发出某个用户的权限,可以使用REVOKE语句。除要用FROM交换TO而且没有IDENTIFIEDBY或WITHGRANTOPTION子句外,REVOKE的语法与GRANT语句十分类似:
REVOKEprivileges(columns)ONwhatFROMuser
user部分必需与您想要作废其权限的用户的原始GRANT语句的user部分相婚配。privileges部分不必要婚配,您可用GRANT语句受权,然后用REVOKE语句作废个中的一部分。REVOKE语句只删除权限,不删除用户。用户的项仍旧保存在user表中,即便您作废了该用户的一切权限也是云云。这意味着该用户仍旧可毗连到服务器上。要想删除全部用户,必需用DELETE语句将该用户的纪录从user表中间接删除:

DELETE语句删除该用户的项,FLUSH语句告知服务重视新加载受权表(当利用GRANT或REVOKE语句,而不是间接修正受权表时,这些表将主动从头加载)。
11.4节将会商为何删除user表项的缘故原由。
一个权限困难,第一部分
上面是一个在MySQL邮件清单中重复呈现的情形:一名新的MySQL办理员给某用户增添一个项,利用了主机名部分,该部分是用一个形式来指定的。比方:
GRANTALLONsamp_db.*TOfred@%.snake.netIDENTIFIEDBY"cocoa"
这里的企图是同意用户fred从snake.net域的一切主机中举行毗连,而且具有对samp_db数据库的一切权限。现实上,fred可以从那些主机中毗连(除服务器主机自己外)。当fred试着从服务器主机中举行毗连时,该妄图以“会见被回绝”的动静而告失利。
即便用户指定了准确的口令也是云云。
假如受权表中包括了由mysql_install_db安装剧本安装的缺省项,这类情形也会产生。其缘故原由是,当服务器考证fred毗连的妄图时,一个匿名用户项(anonymous-userentry)比fred项优先。匿名用户项请求该用户不必口令来毗连,而且一个口令毛病婚配产生。
该成绩的另外一个背景将在第12章“权限困难,第二部分”中给出。今朝,只需说修改此成绩的办法是从user表中删除匿名用户项就充足了,我们不克不及用REVOKE,由于该命令只删除权限。要想完整挣脱这些匿名项,实行以下操纵:
%mysql-urootmysqlmysql>DELETEFROMuserwhereUser="";
mysql>FLUSHPRIVILEGES;
如今,当fred试图从当地主机毗连时乐成了。
RDBMS并非没有局限性。它们难以扩展,需要大量的资源来配置和维护,比如时间、硬件和人力。同样,它们往往遵循峰值性能模型,这就要求系统按照峰值容量来配置可用性,而不考虑典型的数据使用情况。

蒙在股里 发表于 2015-1-19 16:30:55

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

若天明 发表于 2015-2-2 22:36:46

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

再现理想 发表于 2015-2-8 18:24:47

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书

灵魂腐蚀 发表于 2015-2-25 22:32:13

如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。

金色的骷髅 发表于 2015-3-8 08:36:21

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

只想知道 发表于 2015-3-15 21:23:29

只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。

冷月葬花魂 发表于 2015-3-22 05:07:56

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。

精灵巫婆 发表于 2015-3-22 05:07:56

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。

老尸 发表于 2015-3-22 05:07:56

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
页: [1]
查看完整版本: MYSQL网页编程之MYSQL用户帐号办理