<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>思维 &#187; 数据相关</title>
	<atom:link href="http://blog.acmind.com/archives/category/program/database/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.acmind.com</link>
	<description>Acme of Mind</description>
	<lastBuildDate>Mon, 19 Apr 2010 02:23:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>绿化数据中心 &#8211; 第一部分 &#8211; 整合，再整合</title>
		<link>http://blog.acmind.com/archives/912</link>
		<comments>http://blog.acmind.com/archives/912#comments</comments>
		<pubDate>Tue, 02 Jun 2009 08:43:09 +0000</pubDate>
		<dc:creator>笑谈</dc:creator>
				<category><![CDATA[数据相关]]></category>
		<category><![CDATA[中心]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[整合]]></category>

		<guid isPermaLink="false">http://blog.acmind.com/?p=912</guid>
		<description><![CDATA[出于多种原因，服务器整合项目在许多组织里正开展得如火如荼。此类项目一般有如下一些目标：

以新设备替换老设备。 
实现数据中心更好的整体利用率。 
降低购买设备的总成本。 

考虑一下如下事实：今天的多核、多处理器系统与昨日的单核的庞然大物相较而言已是相去甚远。现代的服务器跟老家伙比起来，即便是开足马力，也能以消耗更低能量的方式来实现负荷目标。还有，再考虑一下使用模式。时至今日，把那些旧的单应用服务器迁移至运行于新硬件上的虚拟机器之上的虚拟机器已远非罕见。（译者：很拗口吧，实际上指的是现在的虚拟技术已经允许在虚拟的基础上多重虚拟）。其结果是：大多数情况下，曾经许多10台、20台甚至30台服务器才能满足的负载，现已可高效地仅运行于两三台设备上。随着海量的虚拟机器监控解决方案的出现，由于其中许多都是免费的，虚拟化是实现服务器整合目标最快捷的方式。
在许多情况下，即便是新老设备一对一的替换也能降低整体能源消耗。然而，通过把许多服务器的负载整合到单台设备上则可实现大量的能源节约。
显然，此非易事 &#8211; 不会是抛出一台新服务器、把一堆负载迁移过去然后回家享受周末那么简单。为了在一台虚拟单机上充分支持如此多的负载，海量的存储空间往往是必要的。但是即便加上SAN的电力需求，大部分大型的服务器整合项目仍实现了重大的能耗节省。
节约能耗本身就是一个进行服务器整合的主要理由，但还有其他的能源因素在起作用。比如说冷却。难道给30多台既老旧又低效的服务器降温会比两三台新的服务器加上一个SAN要便宜？除非你买了一个占满整个机房的SAN，我敢打赌冷却需求可大为降低。
整合项目并没有止步于数据中心。实际上，我们完全可以肯定， 这完全可以提高数据中心的能源利用率。想一想虚拟桌面基础设施吧（ VDI ）。通过在整个组织部署低功耗，以及在数据中心部署一些更节能的服务器，组织可以为台式电脑采取在服务器上实施的措施。简而言之，台式机基础设施的总拥有成本的会因此减少，其中包括节约了大量的能源。举个例子，假设你在用户桌面部署了200台瘦客户机型的终端，来取代200台的低能效的胖电脑。再假设需要五台服务器来支持这200个客户。做一下算术题你就会发现，这5台PC和200台瘦客户机的能源消费总量远比200台常规电脑的要的得多。您还可以得到 VDI的的其他一些好处，如桌面的快速部署，从而也降低整体管理成本。
服务器整合项目是越来越常见。如果你所在的组织还没有试水服务器虚拟化和整合的话，现正当时。此外，考虑一下VDI可能带来的好处。虽然这不是对每个组织都合适的灵丹妙药，VDI的确是可以直接且持续的大为降低成本的。
&#160;
摘自：http://www.yeeyan.com/articles/view/%E5%8D%9A%E8%B4%A4/34583?tag_related
]]></description>
			<content:encoded><![CDATA[<p>出于多种原因，服务器整合项目在许多组织里正开展得如火如荼。此类项目一般有如下一些目标：</p>
<ul>
<li>以新设备替换老设备。 </li>
<li>实现数据中心更好的整体利用率。 </li>
<li>降低购买设备的总成本。 </li>
</ul>
<p>考虑一下如下事实：今天的多核、多处理器系统与昨日的单核的庞然大物相较而言已是相去甚远。现代的服务器跟老家伙比起来，即便是开足马力，也能以消耗更低能量的方式来实现负荷目标。还有，再考虑一下使用模式。时至今日，把那些旧的单应用服务器迁移至运行于新硬件上的虚拟机器之上的虚拟机器已远非罕见。（译者：很拗口吧，实际上指的是现在的虚拟技术已经允许在虚拟的基础上多重虚拟）。其结果是：大多数情况下，曾经许多10台、20台甚至30台服务器才能满足的负载，现已可高效地仅运行于两三台设备上。随着海量的虚拟机器监控解决方案的出现，由于其中许多都是免费的，虚拟化是实现服务器整合目标最快捷的方式。</p>
<p>在许多情况下，即便是新老设备一对一的替换也能降低整体能源消耗。然而，通过把许多服务器的负载整合到单台设备上则可实现大量的能源节约。</p>
<p>显然，此非易事 &#8211; 不会是抛出一台新服务器、把一堆负载迁移过去然后回家享受周末那么简单。为了在一台虚拟单机上充分支持如此多的负载，海量的存储空间往往是必要的。但是即便加上SAN的电力需求，大部分大型的服务器整合项目仍实现了重大的能耗节省。</p>
<p>节约能耗本身就是一个进行服务器整合的主要理由，但还有其他的能源因素在起作用。比如说冷却。难道给30多台既老旧又低效的服务器降温会比两三台新的服务器加上一个SAN要便宜？除非你买了一个占满整个机房的SAN，我敢打赌冷却需求可大为降低。</p>
<p>整合项目并没有止步于数据中心。实际上，我们完全可以肯定， 这完全可以提高数据中心的能源利用率。想一想虚拟桌面基础设施吧（ VDI ）。通过在整个组织部署低功耗，以及在数据中心部署一些更节能的服务器，组织可以为台式电脑采取在服务器上实施的措施。简而言之，台式机基础设施的总拥有成本的会因此减少，其中包括节约了大量的能源。举个例子，假设你在用户桌面部署了200台瘦客户机型的终端，来取代200台的低能效的胖电脑。再假设需要五台服务器来支持这200个客户。做一下算术题你就会发现，这5台PC和200台瘦客户机的能源消费总量远比200台常规电脑的要的得多。您还可以得到 VDI的的其他一些好处，如桌面的快速部署，从而也降低整体管理成本。</p>
<p>服务器整合项目是越来越常见。如果你所在的组织还没有试水服务器虚拟化和整合的话，现正当时。此外，考虑一下VDI可能带来的好处。虽然这不是对每个组织都合适的灵丹妙药，VDI的确是可以直接且持续的大为降低成本的。</p>
<p>&#160;</p>
<p>摘自：<a title="http://www.yeeyan.com/articles/view/%E5%8D%9A%E8%B4%A4/34583?tag_related" href="http://www.yeeyan.com/articles/view/%E5%8D%9A%E8%B4%A4/34583?tag_related">http://www.yeeyan.com/articles/view/%E5%8D%9A%E8%B4%A4/34583?tag_related</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.acmind.com/archives/912/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>企业还在为管理数据犯愁？试试语义网吧</title>
		<link>http://blog.acmind.com/archives/883</link>
		<comments>http://blog.acmind.com/archives/883#comments</comments>
		<pubDate>Tue, 02 Jun 2009 03:34:15 +0000</pubDate>
		<dc:creator>笑谈</dc:creator>
				<category><![CDATA[创意创业]]></category>
		<category><![CDATA[数据相关]]></category>
		<category><![CDATA[企业]]></category>
		<category><![CDATA[商务管理]]></category>
		<category><![CDATA[语义网]]></category>
		<category><![CDATA[数据]]></category>

		<guid isPermaLink="false">http://blog.acmind.com/?p=883</guid>
		<description><![CDATA[普华永道（PricewaterhouseCoopers）最新的一封技术报告（link） 阐释了语义网和连接数据将如何更好的帮助企业管理大规模的数据。普华永道技术创新中心的团队花了数月的时间研究和分析了企业数据仓库（data silos ）的问题以及为解决这一问题正在浮现出来的解决方案。根据普华永道的报告，问题的答案是语义网技术，普华永道相信，语义网为解决大规模的数据整合问题提供了一种实际可行的方法。
我们下载了这封长达58页的报告，然后在此文中为你概括了我们的一些发现。
    普华永道在这封报告中写道，语义网的底层技术（underlying technology）不仅仅可以应用在网络数据，而且也可以应用到“内部信息和非网络的外部信息”——其中包括公司的数据仓库。目前企业在关系数据库中痛苦挣扎，但是普华永道称语义网技术不光可以降低成本而且可以提供更多数据，更重要的是，公司可以将它们“不敏感&#34;的本体（ontologies）贡献到 连接数据的云中。
”有了语义网，你就无需重复别人劳动重新创建你自己的本体，因为像 musicontology.com和DBpedia的公司已经创建了不少的本体而且将它们发布到网上了。既然它们是公开而且也有用，那么你可以使用他们 所创建的本体然后再恰当的地方使用即可。理论上，你可以将一些构成你商业模型的特定的非敏感业务本体公开，让别人也可以使用它们。”
我们对建立阅读完整的报告以全面了解本体。但是本体基本上可以被看成链接数据（connect data）和元数据（metadata）的混合体。普华永道继续解释，称本体技术正在发展成为针对机构的一种流行的业务整合技术。这封报告称，数据密集型的医疗，媒体，石油和天气行业可能会成为此次运动的早期领跑者。“
企业经常面临的一个网络技术问题就是缺乏对引入的控制权。普华永道也承认这点，但是它称企业只需控制部分数据——而不是所有数据。普华永道称，为了真正利用互联网的优势，企业需要充分利用它的规模性—— 如果不放弃一些控制权这是没办法实现的。因此普华永道建议企业”只对那些无需规模化的领域保持完全的受控环境。“
这面这个表是对采用连接数据的方式来进行数据管理所有来好处的一个绝好概括。

普华永道罗列出了许多致力于企业数据整合技术的语义技术提供商。这些解决方案中并不是所有的都是基于语义网标准的，但是大多数解决方案都或多或少的依附于语义网技术。普华永道罗列出的提供商有Cambridge Semantics，Collibra，Metatomix, OpenLink Software,和Talis集团。非常有意思的是，一些大的数据库提供商也涉足早期的企业语义网市场：微软就为Word 2007提供了一个开源的本体插件(Ontology Add-In)，Oracle提供Spatial 11g，这是119数据库的一个选项，根据普华永道的报告，它提供了形形色色的语义数据管理功能。
读者可以通过这个链接（link）免费下载这封报告，这封报道还为那些想进入语义网世界的企业打包提供了许多有用的信息。如果你的公司也正在使用语义网，你可以在下面评论中告诉我们，以及到目前为止，你公司的语义网使用情况怎么样。
&#160;
摘自：http://www.yeeyan.com/articles/view/11302/43998
]]></description>
			<content:encoded><![CDATA[<p>普华永道（PricewaterhouseCoopers）最新的一封技术报告（<a href="http://www.pwc.com/techforecast">link</a>） 阐释了语义网和连接数据将如何更好的帮助企业管理大规模的数据。普华永道技术创新中心的团队花了数月的时间研究和分析了企业数据仓库（data silos ）的问题以及为解决这一问题正在浮现出来的解决方案。根据普华永道的报告，问题的答案是语义网技术，普华永道相信，语义网为解决大规模的数据整合问题提供了一种实际可行的方法。</p>
<p>我们下载了这封长达58页的报告，然后在此文中为你概括了我们的一些发现。</p>
<p><a href="http://blog.acmind.com/wp-content/uploads/2009/06/clip-image0027.jpg" class="highslide-image" onclick="return hs.expand(this);"><img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="304" alt="clip_image002" src="http://blog.acmind.com/wp-content/uploads/2009/06/clip-image002-thumb6.jpg" width="388" border="0" /></a>    <br />普华永道在这封报告中写道，<a href="http://www.yeeyan.com/articles/tag/%E8%AF%AD%E4%B9%89%E7%BD%91"><em>语义网</em></a>的底层技术（underlying technology）不仅仅可以应用在网络数据，而且也可以应用到“内部信息和非网络的外部信息”——其中包括公司的数据仓库。目前企业在关系数据库中痛苦挣扎，但是普华永道称语义网技术不光可以降低成本而且可以提供更多数据，更重要的是，公司可以将它们“不敏感&quot;的本体（ontologies）贡献到 连接数据的云中。</p>
<p>”有了<a href="http://www.yeeyan.com/articles/tag/%E8%AF%AD%E4%B9%89%E7%BD%91"><em>语义网</em></a>，你就无需重复别人劳动重新创建你自己的本体，因为像 musicontology.com和DBpedia的公司已经创建了不少的本体而且将它们发布到网上了。既然它们是公开而且也有用，那么你可以使用他们 所创建的本体然后再恰当的地方使用即可。理论上，你可以将一些构成你商业模型的特定的非敏感业务本体公开，让别人也可以使用它们。”</p>
<p>我们对建立阅读完整的报告以全面了解本体。但是本体基本上可以被看成链接数据（connect data）和元数据（metadata）的混合体。普华永道继续解释，称本体技术正在发展成为针对机构的一种流行的业务整合技术。这封报告称，数据密集型的医疗，媒体，石油和天气行业可能会成为此次运动的早期领跑者。“</p>
<p>企业经常面临的一个网络技术问题就是缺乏对引入的控制权。普华永道也承认这点，但是它称企业只需控制部分数据——而不是所有数据。普华永道称，为了真正利用互联网的优势，企业需要充分利用它的规模性—— 如果不放弃一些控制权这是没办法实现的。因此普华永道建议企业”只对那些无需规模化的领域保持完全的受控环境。“</p>
<p>这面这个表是对采用连接数据的方式来进行数据管理所有来好处的一个绝好概括。</p>
<p><a href="http://blog.acmind.com/wp-content/uploads/2009/06/clip-image0036.jpg" class="highslide-image" onclick="return hs.expand(this);"><img title="clip_image003" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="385" alt="clip_image003" src="http://blog.acmind.com/wp-content/uploads/2009/06/clip-image003-thumb6.jpg" width="630" border="0" /></a></p>
<p>普华永道罗列出了许多致力于企业数据整合技术的语义技术提供商。这些解决方案中并不是所有的都是基于<a href="http://www.yeeyan.com/articles/tag/%E8%AF%AD%E4%B9%89%E7%BD%91"><em>语义网</em></a>标准的，但是大多数解决方案都或多或少的依附于语义网技术。普华永道罗列出的提供商有Cambridge Semantics，Collibra，Metatomix, OpenLink Software,和Talis集团。非常有意思的是，一些大的数据库提供商也涉足早期的企业语义网市场：微软就为Word 2007提供了一个开源的本体插件(Ontology Add-In)，Oracle提供Spatial 11g，这是119数据库的一个选项，根据普华永道的报告，它提供了形形色色的语义数据管理功能。</p>
<p>读者可以通过这个链接（<a href="http://www.pwc.com/techforecast">link</a>）免费下载这封报告，这封报道还为那些想进入语义网世界的企业打包提供了许多有用的信息。如果你的公司也正在使用语义网，你可以在下面评论中告诉我们，以及到目前为止，你公司的语义网使用情况怎么样。</p>
<p>&#160;</p>
<p>摘自：<a title="http://www.yeeyan.com/articles/view/11302/43998" href="http://www.yeeyan.com/articles/view/11302/43998">http://www.yeeyan.com/articles/view/11302/43998</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.acmind.com/archives/883/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle数据库系统使用的几条经验</title>
		<link>http://blog.acmind.com/archives/349</link>
		<comments>http://blog.acmind.com/archives/349#comments</comments>
		<pubDate>Wed, 27 May 2009 07:44:01 +0000</pubDate>
		<dc:creator>笑谈</dc:creator>
				<category><![CDATA[数据相关]]></category>
		<category><![CDATA[经验]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://blog.acmind.com/?p=349</guid>
		<description><![CDATA[1.having子句的使用方法
 having子句对group by 子句所确定的行组进行控制，having 子句条件中只允许涉及常量，聚组函数或group by子句中的列。
2.外部联接 &#34;+ &#34;的使用方法
 外部联接 &#34;+ &#34;按其在 &#34;= &#34;的左边或右边分左联接和右联接。若不带 &#34;+ &#34;运算符的表中的一个行不直接匹配于带 &#34;+ &#34;预算符的表中的任何行，则前者的行与后者中的一个空行相匹配并被返回。若二者均不带′+′，则二者中无法匹配的均被返回。利用外部联接 &#34;+ &#34;，可以替代效率十分低下的not in运算，大大提高运行速度。例如，下面这条命令执行起来将会很慢。
 select a.empno&#160;&#160; from&#160;&#160; emp&#160;&#160; a&#160;&#160; where&#160;&#160; a.empno&#160;&#160; not&#160;&#160; in
 （select&#160;&#160; empno&#160;&#160; from&#160;&#160; emp1&#160;&#160; where&#160;&#160; job=&#38;acute；SALE&#38;acute；）；
 假如利用外部联接，改写命令如下：
 select&#160;&#160; a.empno&#160;&#160; from&#160;&#160; emp&#160;&#160; a&#160;&#160; ，emp1&#160;&#160; b
 where&#160;&#160; a.empno=b.empno（+）
 and&#160;&#160; b.empno&#160;&#160; is&#160;&#160; null
 and&#160;&#160; b.job=&#38;acute；SALE&#38;acute；；
 大家可以发现，运行速度明显提高。
3.删除表内重复记录的方法
 大家可以利用这样的命令来删除表内重复记录：
 delete&#160;&#160; from&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>1.having子句的使用方法</p>
<p> having子句对group by 子句所确定的行组进行控制，having 子句条件中只允许涉及常量，聚组函数或group by子句中的列。</p>
<p>2.外部联接 &quot;+ &quot;的使用方法</p>
<p> 外部联接 &quot;+ &quot;按其在 &quot;= &quot;的左边或右边分左联接和右联接。若不带 &quot;+ &quot;运算符的表中的一个行不直接匹配于带 &quot;+ &quot;预算符的表中的任何行，则前者的行与后者中的一个空行相匹配并被返回。若二者均不带′+′，则二者中无法匹配的均被返回。利用外部联接 &quot;+ &quot;，可以替代效率十分低下的not in运算，大大提高运行速度。例如，下面这条命令执行起来将会很慢。</p>
<p> select a.empno&#160;&#160; from&#160;&#160; emp&#160;&#160; a&#160;&#160; where&#160;&#160; a.empno&#160;&#160; not&#160;&#160; in</p>
<p> （select&#160;&#160; empno&#160;&#160; from&#160;&#160; emp1&#160;&#160; where&#160;&#160; job=&amp;acute；SALE&amp;acute；）；</p>
<p> 假如利用外部联接，改写命令如下：</p>
<p> select&#160;&#160; a.empno&#160;&#160; from&#160;&#160; emp&#160;&#160; a&#160;&#160; ，emp1&#160;&#160; b</p>
<p> where&#160;&#160; a.empno=b.empno（+）</p>
<p> and&#160;&#160; b.empno&#160;&#160; is&#160;&#160; null</p>
<p> and&#160;&#160; b.job=&amp;acute；SALE&amp;acute；；</p>
<p> 大家可以发现，运行速度明显提高。</p>
<p>3.删除表内重复记录的方法</p>
<p> 大家可以利用这样的命令来删除表内重复记录：</p>
<p> delete&#160;&#160; from&#160;&#160; table_name&#160;&#160; a</p>
<p> where&#160;&#160; rowid &lt;&#160;&#160; （select&#160;&#160; max（rowid）&#160;&#160; from&#160;&#160; table_name</p>
<p> where&#160;&#160; column1=a.column1&#160;&#160; and&#160;&#160; column2=a.column2</p>
<p> and&#160;&#160; colum3=a.colum3&#160;&#160; and&#160;&#160; ……）；</p>
<p> 需要注意的是，当表比较大（例如50万条以上）时，需要另想办法。</p>
<p>4.set transaction命令的用法</p>
<p> 在执行大事务时，Oracle有时会报如下错误：</p>
<p> ORA-01555：snapshot&#160;&#160; too&#160;&#160; old&#160;&#160; （rollback&#160;&#160; segment&#160;&#160; too&#160;&#160; small）</p>
<p> 这说明Oracle给此事务随机分配的回滚段太小了，这时可以为它指定一个足够大的回滚段，以确保这个事务的成功执行。例如：</p>
<p> set&#160;&#160; transaction&#160;&#160; use&#160;&#160; rollback&#160;&#160; segment&#160;&#160; roll_abc；</p>
<p> delete&#160;&#160; from&#160;&#160; table_name&#160;&#160; where&#160;&#160; ……</p>
<p> commit；</p>
<p> 回滚段roll_abc被指定给这个delete事务，commit命令则在事务结束之后取消了回滚段的指定。</p>
<p>5.使用索引的注意事项</p>
<p> select，update，delete 语句中的子查询应当有规律地查找少于20%的表行。如果一个语句查找的行数超过总行数的20%，它将不能通过使用索引获得性能上的提高。</p>
<p> 索引可能产生碎片，因为记录从表中删除时，相应也从表的索引中删除。表释放的空间可以再用，而索引释放的空间却不能再用。频繁进行删除操作的被索引的表，应当阶段性地重建索引，以避免在索引中造成空间碎片，影响性能。在许可的条件下，也可以阶段性地truncate表，truncate命令删除表中所有记录，也删除索引碎片。</p>
<p>6.数据库重建应注意的问题</p>
<p> 在利用import进行数据库重建过程中，有些视图可能会带来问题，因为结构输入的顺序可能造成视图的输入先于它低层次表的输入，这样建立视图就会失败。要解决这一问题，可以采取分两步走的方法：首先输入结构，然后输入数据。命令举例如下（uesrname：jfcl，password：hfjf，host sting：ora1，数据文件：expdata.dmp）：</p>
<p> imp&#160;&#160; jfcl/hfjf@ora1&#160;&#160; file=empdata.dmp&#160;&#160; rows=N</p>
<p> imp&#160;&#160; jfcl/hfjf@ora1&#160;&#160; file=empdata.dmp&#160;&#160; full=Y&#160;&#160; buffer=64000</p>
<p> commit=Y&#160;&#160; ignore=Y</p>
<p> 注释：第1条命令输入所有数据库结构，但没有记录。第2次输入结构和数据，64000字节提交一次。ignore=Y选项则会保证第二次输入既使对象存在的情况下也能成功</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.acmind.com/archives/349/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库安全配置</title>
		<link>http://blog.acmind.com/archives/348</link>
		<comments>http://blog.acmind.com/archives/348#comments</comments>
		<pubDate>Wed, 27 May 2009 07:39:32 +0000</pubDate>
		<dc:creator>笑谈</dc:creator>
				<category><![CDATA[数据相关]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.acmind.com/?p=348</guid>
		<description><![CDATA[1、前言   
MySQL 是完全网络化的跨平台关系型数据库系统，同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点，用户可利用许多语言编写访问MySQL 数据库的程序，特别是与PHP更是黄金组合，运用十分广泛。    由于MySQL是多平台的数据库，它的默认配置要考虑各种情况下都能适用，所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员，我们有责任维护MySQL数据库系统的数据安全性和完整性。    MySQL数据库的安全配置必须从两个方面入手，系统内部安全和外部网络安全，另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。    
2、系统内部安全    
首先简单介绍一下MySQL数据库目录结构。MySQL安装好，运行了mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我们用MySQL源码包安装，而且安装目录是/usr/local/mysql，那么数据目录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成，每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录，各数据库表分别以数据库表名作为文件名，扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。    MySQL的授权表给数据库的访问提供了灵活的权限控制，但是如果本地用户拥有对库文件的读权限的话，攻击者只需把数据库目录打包拷走，然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题，如果主机不安全，被攻击者控制，那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性，也就是权限设置问题。    从MySQL主站一些老的binary发行版来看，3.21.xx版本中数据目录的属性是775，这样非常危险，任何本地用户都可以读数据目录，所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770，这种属性也有些危险，本地的同组用户既能读也能写，所以数据文件也不安全。3.23.xx 版本数据目录的属性是700，这样就比较好，只有启动数据库的用户可以读写数据库文件，保证了本地数据文件的安全。    如果启动MySQL数据库的用户是mysql，那么象如下的目录和文件的是安全的，请注意数据目录及下面的属性：    shell&#62;ls -l /usr/local/mysql    total 40    drwxrwxr-x&#160;&#160;&#160; 2 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb [...]]]></description>
			<content:encoded><![CDATA[<p>1、前言   </p>
<p>MySQL 是完全网络化的跨平台关系型数据库系统，同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点，用户可利用许多语言编写访问MySQL 数据库的程序，特别是与PHP更是黄金组合，运用十分广泛。    <br />由于MySQL是多平台的数据库，它的默认配置要考虑各种情况下都能适用，所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员，我们有责任维护MySQL数据库系统的数据安全性和完整性。    <br />MySQL数据库的安全配置必须从两个方面入手，系统内部安全和外部网络安全，另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。    </p>
<p>2、系统内部安全    </p>
<p>首先简单介绍一下MySQL数据库目录结构。MySQL安装好，运行了mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我们用MySQL源码包安装，而且安装目录是/usr/local/mysql，那么数据目录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成，每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录，各数据库表分别以数据库表名作为文件名，扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。    <br />MySQL的授权表给数据库的访问提供了灵活的权限控制，但是如果本地用户拥有对库文件的读权限的话，攻击者只需把数据库目录打包拷走，然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题，如果主机不安全，被攻击者控制，那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性，也就是权限设置问题。    <br />从MySQL主站一些老的binary发行版来看，3.21.xx版本中数据目录的属性是775，这样非常危险，任何本地用户都可以读数据目录，所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770，这种属性也有些危险，本地的同组用户既能读也能写，所以数据文件也不安全。3.23.xx 版本数据目录的属性是700，这样就比较好，只有启动数据库的用户可以读写数据库文件，保证了本地数据文件的安全。    <br />如果启动MySQL数据库的用户是mysql，那么象如下的目录和文件的是安全的，请注意数据目录及下面的属性：    <br />shell&gt;ls -l /usr/local/mysql    <br />total 40    <br />drwxrwxr-x&#160;&#160;&#160; 2 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 bin    <br />drwxrwxr-x&#160;&#160;&#160; 3 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 include    <br />drwxrwxr-x&#160;&#160;&#160; 2 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 info    <br />drwxrwxr-x&#160;&#160;&#160; 3 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 lib    <br />drwxrwxr-x&#160;&#160;&#160; 2 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 libexec    <br />drwxrwxr-x&#160;&#160;&#160; 3 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 man    <br />drwxrwxr-x&#160;&#160;&#160; 6 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 mysql-test    <br />drwxrwxr-x&#160;&#160;&#160; 3 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 share    <br />drwxrwxr-x&#160;&#160;&#160; 7 root&#160;&#160;&#160;&#160; root&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 sql-bench    <br />drwx&#8212;&#8212;&#160;&#160;&#160; 4 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:07 var    <br />shell&gt;ls -l /usr/local/mysql/var    <br />total 8    <br />drwx&#8212;&#8212;&#160;&#160;&#160; 2 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:08 mysql    <br />drwx&#8212;&#8212;&#160;&#160;&#160; 2 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4096 Feb 27 20:08 test    <br />shell&gt;ls -l /usr/local/mysql/var/mysql    <br />total 104    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 Feb 27 20:08 columns_priv.MYD    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1024 Feb 27 20:08 columns_priv.MYI    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8778 Feb 27 20:08 columns_priv.frm    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 302 Feb 27 20:08 db.MYD    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3072 Feb 27 20:08 db.MYI    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8982 Feb 27 20:08 db.frm    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 Feb 27 20:08 func.MYD    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1024 Feb 27 20:08 func.MYI    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8641 Feb 27 20:08 func.frm    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 Feb 27 20:08 host.MYD    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1024 Feb 27 20:08 host.MYI    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8958 Feb 27 20:08 host.frm    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 Feb 27 20:08 tables_priv.MYD    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1024 Feb 27 20:08 tables_priv.MYI    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8877 Feb 27 20:08 tables_priv.frm    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 428 Feb 27 20:08 user.MYD    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2048 Feb 27 20:08 user.MYI    <br />-rw&#8212;&#8212;-&#160;&#160;&#160; 1 mysql&#160;&#160;&#160; mysql&#160;&#160;&#160;&#160;&#160;&#160;&#160; 9148 Feb 27 20:08 user.frm    <br />如果这些文件的属主及属性不是这样，请用以下两个命令修正之：    <br />shell&gt;chown -R mysql.mysql /usr/local/mysql/var    <br />shell&gt;chmod -R go-rwx /usr/local/mysql/var    <br />用root用户启动远程服务一直是安全大忌，因为如果服务程序出现问题，远程攻击者极有可能获得主机的完全控制权。MySQL从3.23.15版本开始时作了小小的改动，默认安装后服务要用mysql用户来启动，不允许root用户启动。如果非要用root用户来启动，必须加上-user=root的参数 (./safe_mysqld -user=root &amp;)。因为MySQL中有LOAD DATA INFILE和SELECT &#8230; INTO OUTFILE的SQL语句，如果是root用户启动了MySQL服务器，那么，数据库用户就拥有了root用户的写权限。不过MySQL还是做了一些限制的，比如LOAD DATA INFILE只能读全局可读的文件，SELECT &#8230; INTO OUTFILE不能覆盖已经存在的文件。    <br />本地的日志文件也不能忽视，包括shell的日志和MySQL自己的日志。有些用户在本地登陆或备份数据库的时候为了图方便，有时会在命令行参数里直接带了数据库的密码，如：    <br />shell&gt;/usr/local/mysql/bin/mysqldump -uroot -ptest test&gt;test.sql    <br />shell&gt;/usr/local/mysql/bin/mysql -uroot -ptest    <br />这些命令会被shell记录在历史文件里，比如bash会写入用户目录的.bash_history文件，如果这些文件不慎被读，那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码，也会因.mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码，而是在提示后再输入数据库密码。    <br />另外这两个文件我们也应该不让它记录我们的操作，以防万一。    <br />shell&gt;rm .bash_history .mysql_history    <br />shell&gt;ln -s /dev/null .bash_history    <br />shell&gt;ln -s /dev/null .mysql_history    <br />上门这两条命令把这两个文件链接到/dev/null，那么我们的操作就不会被记录到这两个文件里了。    <br />外部网络安全    <br />MySQL数据库安装好以后，Unix平台的user表是这样的：    <br />mysql&gt; use mysql;    <br />Database changed    <br />mysql&gt; select Host,User,Password,Select_priv,Grant_priv from user;    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+    <br />| Host&#160;&#160;&#160;&#160;&#160; | User | Password | Select_priv | Grant_priv |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+    <br />| localhost | root |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| redhat&#160;&#160;&#160; | root |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| localhost |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| redhat&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+    <br />4 rows in set (0.00 sec)    <br />Windows平台的user表是这样的：    <br />mysql&gt; use mysql;    <br />Database changed    <br />mysql&gt; select Host,User,Password,Select_priv,Grant_priv from user;    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+    <br />| Host&#160;&#160;&#160;&#160;&#160; | User | Password | Select_priv | Grant_priv |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+    <br />| localhost | root |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| %&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | root |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| localhost |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Y&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| %&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+    <br />4 rows in set (0.00 sec)    <br />我们先来看Unix平台的user表。其中redhat只是我试验机的机器名，所以实际上Unix平台的MySQL默认只允许本机才能连接数据库。但是缺省root用户口令是空，所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法：    <br />1)在shell提示符下用mysqladmin命令来改root用户口令    <br />shell&gt;mysqladmin -uroot password test    <br />这样，MySQL数据库root用户的口令就被改成test了。（test只是举例，我们实际使用的口令一定不能使用这种易猜的弱口令）    <br />2)用set password修改口令：    <br />mysql&gt; set password for root@localhost=password(&#8216;test&#8217;);    <br />这时root用户的口令就被改成test了。    <br />3)直接修改user表的root用户口令    <br />mysql&gt; use mysql;    <br />mysql&gt; update user set password=password(&#8216;test&#8217;) where user=&#8217;root&#8217;;    <br />mysql&gt; flush privileges;    <br />这样，MySQL数据库root用户的口令也被改成test了。其中最后一句命令flush privileges的意思是强制刷新内存授权表，否则用的还是缓冲中的口令，这时非法用户还可以用root用户及空口令登陆，直到重启MySQL服务器。    <br />我们还看到user为空的匿名用户，虽然它在Unix平台下没什么权限，但为了安全起见我们应该删除它：    <br />mysql&gt; delete from user where user=&#8221;;    <br />Windows版本MySQL的user表有很大不同，我们看到Host字段除了localhost还有是%。这里%的意思是允许任意的主机连接MySQL服务器，这是非常不安全的，给攻击者造成可乘之机，我们必须删除Host字段为%的记录：    <br />mysql&gt;delete from user where host=&#8217;%';    <br />默认root用户的空密码也是必须修改，三种修改方法和Unix平台一样。    <br />我们注意到Host字段为localhost的匿名用户拥有所有的权限！就是说本地用户用空的用户名和空的口令登陆MySQL数据库服务器可以得到最高的权限！所以匿名用户必须删除！    <br />mysql&gt; delete from user where user=&#8221;;    <br />对user表操作以后不要忘了用flush privileges来强制刷新内存授权表，这样才能生效。    <br />默认安装的Windows版MySQL存在的不安全因素太多，我们在安装后一定要进一步配置！    <br />MySQL的5个授权表：user, db, host, tables_priv和columns_priv提供非常灵活的安全机制，从MySQL 3.22.11开始引入了两条语句GRANT和REVOKE来创建和删除用户权限，可以方便的限制哪个用户可以连接服务器，从哪里连接以及连接后可以做什么操作。作为MySQL管理员，我们必须了解授权表的意义以及如何用GRANT和REVOKE来创建用户、授权和撤权、删除用户。    <br />在3.22.11版本以前的MySQL授权机制不完善，和新版本也有较大的不同，建议升级到最新版本的MySQL。（本书的操作例子是以MySQL 3.23.49为样本）    <br />我们先来了解授权表的结构。    <br />1)MySQL授权表的结构与内容：    <br />mysql&gt; desc user;    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Field&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Host&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(60) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| User&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(16) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Password&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(16) binary |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Select_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Insert_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Update_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Delete_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Create_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Drop_priv&#160;&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Reload_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Shutdown_priv&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Process_priv&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| File_priv&#160;&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Grant_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| References_priv | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Index_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Alter_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />17 rows in set (0.01 sec)    <br />user表是5个授权表中最重要的一个，列出可以连接服务器的用户及其加密口令，并且它指定他们有哪种全局（超级用户）权限。在user表启用的任何权限均是全局权限，并适用于所有数据库。所以我们不能给任何用户访问mysql.user表的权限！    <br />权限说明：    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| 权限指定符| 列名&#160;&#160;&#160;&#160;&#160;&#160;&#160; |权限操作&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Select&#160;&#160;&#160; | Select_priv | 允许对表的访问，不对数据表进行访问的select语句不受影响，比如select 1+1|    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Insert&#160;&#160;&#160; | Insert_priv | 允许对表用insert语句进行写入操作。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Update&#160;&#160;&#160; | Update_priv | 允许用update语句修改表中现有记录。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Delete&#160;&#160;&#160; | Delete_priv | 允许用delete语句删除表中现有记录。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Create&#160;&#160;&#160; | Create_priv | 允许建立新的数据库和表。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Drop&#160;&#160;&#160;&#160;&#160; | Drop_priv&#160;&#160; | 允许删除现有的数据库和表。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Index&#160;&#160;&#160;&#160; | Index_priv&#160; | 允许创建、修改或删除索引。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Alter&#160;&#160;&#160;&#160; | Alter_priv&#160; | 允许用alter语句修改表结构。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Grant&#160;&#160;&#160;&#160; | Grant_priv&#160; | 允许将自己拥有的权限授予其它用户，包括grant。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Reload&#160;&#160;&#160; | Reload&#160;&#160;&#160;&#160;&#160; | 允许重载授权表，刷新服务器等命令。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Shutdown&#160; | Shudown_priv| 允许用mysqladmin shutdown命令关闭MySQL服务器。该权限比较危险，&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 不应该随便授予。&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Process&#160;&#160; | Process_priv| 允许查看和终止MySQL服务器正在运行的线程（进程）以及正在执行的查询语句 |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | ，包括执行修改密码的查询语句。该权限比较危险，不应该随便授予。&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| File&#160;&#160;&#160;&#160;&#160; | File_priv&#160;&#160; | 允许从服务器上读全局可读文件和写文件。该权限比较危险，不应该随便授予。|    <br />+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />mysql&gt; desc db;    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Field&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Host&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(60) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Db&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(64) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| User&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(16) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Select_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Insert_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Update_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Delete_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Create_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Drop_priv&#160;&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Grant_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| References_priv | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Index_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Alter_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />13 rows in set (0.01 sec)    <br />db表列出数据库，而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。    <br />mysql&gt; desc host;    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Field&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Host&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(60) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Db&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(64) binary |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Select_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Insert_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Update_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Delete_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Create_priv&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Drop_priv&#160;&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Grant_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| References_priv | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Index_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Alter_priv&#160;&#160;&#160;&#160;&#160; | enum(&#8216;N&#8217;,'Y&#8217;)&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; | N&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />12 rows in set (0.01 sec)    <br />host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限，这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响，所以，你可能发觉你根本不是用它。    <br />mysql&gt; desc tables_priv;    <br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Field&#160;&#160;&#160;&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |    <br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Host&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(60) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Db&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(64) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| User&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(16) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Table_name&#160; | char(60) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Grantor&#160;&#160;&#160;&#160; | char(77)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | MUL |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Timestamp&#160;&#160; | timestamp(14)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | YES&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Table_priv&#160; | set(&#8216;Select&#8217;,'Insert&#8217;,&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;Update&#8217;,'Delete&#8217;,'Create&#8217;, |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;Drop&#8217;,'Grant&#8217;,'References&#8217;,|&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;Index&#8217;,'Alter&#8217;)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Column_priv | set(&#8216;Select&#8217;,'Insert&#8217;,&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;Update&#8217;,'References&#8217;)&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />8 rows in set (0.01 sec)    <br />tables_priv表指定表级权限。在这里指定的一个权限适用于一个表的所有列。    <br />mysql&gt; desc columns_priv;    <br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Field&#160;&#160;&#160;&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |    <br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />| Host&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(60) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Db&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(64) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| User&#160;&#160;&#160;&#160;&#160;&#160;&#160; | char(16) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Table_name&#160; | char(64) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Column_name | char(64) binary&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; | PRI |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Timestamp&#160;&#160; | timestamp(14)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | YES&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />| Column_priv | set(&#8216;Select&#8217;,'Insert&#8217;, |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;Update&#8217;,'References&#8217;) |&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+    <br />7 rows in set (0.00 sec)    <br />columns_priv表指定列级权限。在这里指定的权限适用于一个表的特定列。    <br />2)MySQL授权表运行机制    <br />MySQL的访问控制分两个步骤：    <br />a)服务器检查是否允许该用户连接。    <br />b)如果该用户有权连接，那么服务器还会检查它的每一个请求是否有足够的权限。比如：用户检索数据库中的一个表需要有这个数据库的select权限，用户删除数据库中的一个表需要有这个数据库的drop权限。    <br />授权表的user, db, host表使用这两个步骤，tables_priv和columns_priv表只使用第二步（检查请求）。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。    <br />范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列，如 db表包含一个Db列指出权限运用于哪个数据库。类似地，tables_priv和columns_priv表包含范围字段，缩小范围到一个数据库中的特定表或一个表的特定列。    <br />下面是user表的Host字段和User字段组合的一些例子：    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| Host值&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | User值 | 匹配的连接&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;x.y.z&#8217;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;test&#8217; | test用户只能从x.y.z连接数据库&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;x.y.z&#8217;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8221;&#160;&#160;&#160;&#160; | 任何用户可以从x.y.z连接数据库&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;%&#8217;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;test&#8217; | test用户可以从任意主机连接数据库&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8221;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8221;&#160;&#160;&#160;&#160; | 任何用户可以从任意主机连接数据库&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;%.y.z&#8217;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;test&#8217; | test用户可以从y.z域的任意主机连接数据库&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;x.y.% &#8216;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;test&#8217; | test用户可以从x.y.net, x.y.com, x.y.edu等主机连接数据库|    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;192.168.1.1&#8242;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;test&#8217; | test用户可以从IP地址为192.168.1.1的主机连接数据库&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;192.168.1.% &#8216;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | &#8216;test&#8217; | test用户可以从C类子网192.168.1中的任意主机连接数据库&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />| &#8216;192.168.1.0/255.255.255.0&#8242; | &#8216;test&#8217; | 同上&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |    <br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+    <br />SQL的字符串通配符%表示匹配任意字符，可以是0个字符，通配符_表示匹配一个字符。    <br />权限列指出在范围列中指定的用户拥有何种权限。该表使用GRANT语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。如Select_priv对应于SELECT权限。    <br />3)授权表使用举例    <br />grant用于给增加用户和创建权限，revoke用于删除用户权限。    <br />下面是一些用grant增加用户和创建权限的例子：    <br />mysql&gt; grant all privileges on *.* to test@localhost identified by &#8216;test&#8217; with grant option;    <br />这句增加一个本地具有所有权限的test用户（超级用户），密码是test。ON子句中的*.*意味着&quot;所有数据库、所有表&quot;。with grant option表示它具有grant权限。    <br />mysql&gt; grant select,insert,update,delete,create,drop privileges on test.* to test1@&#8217;192.168.1.0/255.255.255.0&#8242; identified by &#8216;test&#8217;;    <br />这句是增加了一个test1用户，口令是test，但是它只能从C类子网192.168.1连接，对test库有select,insert,update,delete,create,drop操作权限。    <br />用grant语句创建权限是不需要再手工刷新授权表的，因为它已经自动刷新了。    <br />给用户创建权限还可以通过直接修改授权表：    <br />mysql&gt; insert into user values(&quot;localhost&quot;,&quot;test&quot;,password(&quot;test&quot;),&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;);    <br />mysql&gt; flush privileges;    <br />这两句和上面第一句grant的效果是一样的，也是增加了一个本地的test超级用户。我们看到用grant方便多了，而且还不需flush privileges。    <br />mysql&gt; insert into user (host,user,password) values(&quot;192.168.1.0/255.255.255.0&quot;,&quot;test1&quot;,PASSWORD(&quot;test&quot;));    <br />mysql&gt; insert into db values(&quot;192.168.1.0/255.255.255.0&quot;,&quot;test&quot;,&quot;test1&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;Y&quot;,&quot;N&quot;,&quot;N&quot;,&quot;N&quot;,&quot;N&quot;)    <br />mysql&gt; flush privileges;    <br />这三句和上面第二句grant的效果也是一样的，也是增加了一个只能从C类子网192.168.1连接，对test库有select,insert,update,delete,create,drop操作权限的test1用户，口令是test。    <br />要取消一个用户的权限，使用revoke语句。revoke的语法非常类似于grant语句，除了to用from取代并且没有identified by和with grant option子句，下面是用revoke删除用户权限的例子：    <br />mysql&gt; revoke all on test.* from test1@&#8217;192.168.1.0/255.255.255.0&#8242;;    <br />这句revoke就撤消了上面第二句grant创建的权限，但是test1用户并没有被删除，必须手工从user表删除：    <br />mysql&gt; delete from user where user=&#8217;test1&#8242;;    <br />mysql&gt; flush privileges;    <br />这样，test1用户就彻底删除了。    <br />这些只是MySQL授权表的简单使用，更多详细的资料请见MySQL提供的手册。    </p>
<p>3、编程需要注意的一些问题    </p>
<p>不管是用哪种程序语言写连接MySQL数据库的程序，有一条准则是永远不要相信用户提交的数据！    <br />对于数字字段，我们要使用查询语句：SELECT * FROM table WHERE ID=&#8217;234&#8242;，不要使用SELECT * FROM table WHERE ID=234这样的查询语句。MySQL会自动把字串转换为数字字符并且去除非数字字符。如果用户提交的数据经过了 mysql_escape_string处理，这样我们就可以完全杜绝了sql inject攻击，关于sql inject攻击请参考下面链接的文章：    <br /><a href="http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf">http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf</a>    <br /><a href="http://www.ngssoftware.com/papers/advanced_sql_injection.pdf">http://www.ngssoftware.com/papers/advanced_sql_injection.pdf</a>    <br />各种编程语言该注意的问题：    <br />1)所有Web程序：    <br />a)尝试在Web表单输入单引号和双引号来测试可能出现的错误，并找出原因所在。    <br />b)修改URL参数带的%22 (&#8216;&quot;&#8217;), %23 (&#8216;#&#8217;), 和 %27 (&#8221;&#8217;)。    <br />c)对于数字字段的变量，我们的应用程序必须进行严格的检查，否则是非常危险的。    <br />d)检查用户提交的数据是否超过字段的长度。    <br />e)不要给自己程序连接数据库的用户过多的访问权限。    <br />2)PHP：    <br />a)检查用户提交的数据在查询之前是否经过addslashes处理，在PHP 4.0.3以后提供了基于MySQL C API的函数mysql_escape_string()。    <br />3)MySQL C API：    <br />a)检查查询字串是否用了mysql_escape_string() API调用。    <br />4)MySQL++：    <br />a)检查查询字串是否用了escape和quote处理。    <br />5)Perl DBI：    <br />a)检查查询字串是否用了quote()方法。    <br />6)Java JDBC：    <br />a)检查查询字串是否用了PreparedStatement对象。    </p>
<p>4、一些小窍门    </p>
<p>1)如果不慎忘记了MySQL的root密码，我们可以在启动MySQL服务器时加上参数&#8211;skip-grant-tables来跳过授权表的验证 (./safe_mysqld &#8211;skip-grant-tables &amp;)，这样我们就可以直接登陆MySQL服务器，然后再修改root用户的口令，重启MySQL就可以用新口令登陆了。    <br />2)启动MySQL服务器时加&#8211;skip-show-database使一般数据库用户不能浏览其它数据库。    <br />3)启动MySQL服务器时加上&#8211;chroot=path参数，让mysqld守护进程运行在chroot环境中。这样SQL语句LOAD DATA INFILE和SELECT &#8230; INTO OUTFILE就限定在chroot_path下读写文件了。这里有一点要注意，MySQL启动后会建立一个mysql.sock文件，默认是在/tmp 目录下。使用了chroot后，MySQL会在chroot_path/tmp去建立mysql.sock文件，如果没有chroot_path/tmp 目录或启动MySQL的用户没有这个目录写权限就不能建立mysql.sock文件，MySQL会启动失败。比如我们加了&#8211;chroot=/usr /local/mysql/启动参数，那么最好建立一个启动MySQL的用户能写的/usr/local/mysql/tmp目录，当然我们也可以用 &#8211;socket=path来指定mysql.sock文件的路径，但这个path一定要在chroot_path里面。    <br />4)启动MySQL服务器时加上&#8211;log-slow-queries=file参数，这样mysqld会把SQL命令执行时间超过 long_query_time的写入file文件。如果没有指定=file，mysqld默认会写到数据目录下的hostname-slow.log。如果只指定了filename，没有指定路径，那么mysqld也会把filename写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询语句，然后尽可能的优化它减轻MySQL服务器的负担。    <br />5)如果我们只需本机使用MySQL服务，那么我们还可以加上&#8211;skip-networking启动参数使MySQL不监听任何TCP/IP连接，增加安全性。（非常推荐）    <br />6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4 mysqld Command-line Options</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.acmind.com/archives/348/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL开发中容易忽视的一些小地方（一）【null的用法及注意事项】</title>
		<link>http://blog.acmind.com/archives/202</link>
		<comments>http://blog.acmind.com/archives/202#comments</comments>
		<pubDate>Sat, 17 Jan 2009 02:39:42 +0000</pubDate>
		<dc:creator>笑谈</dc:creator>
				<category><![CDATA[数据相关]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[null]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.acmind.com/?p=202</guid>
		<description><![CDATA[写此系列文章缘由: 做开发三年来(B/S),发现基于web 架构的项目技术主要分两大方面: 
第一:C#,它是程序的基础,也可是其它开发语言,没有开发语言也就不存在应用程序.
第二:数据库,现在是信息化世界,大多数信息都可以通过数据库存储来交换信息.常与应用程序互相交流信息.
但在SQL开发应用时,我们往往只观注些常用的方法(insert delete select update),对些小细节方面(系统存储过程,函数的应用,优化分析)研究的并不多或者是知其一不知其二,所以本人想把在学习工作当中遇到的问题总结些,希望还没有重视这些方面的朋友会有帮助,少走些弯路.
主旨:本文首先根据自己的经验整理了一下SQL中的null的用法及要注意的方面. 
名词解释(英文辞典): null:无效的, 无价值的, 等于零的.
(SQL定义):SQL中, NULL 与空格, 零, 都不相同. 是指为未定义或是不可用的. 
构成因素:造成某一列成为 NULL 的因素可能是: 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (1),值不存在；
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (2), 值未知；
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (3), 列对表不可用.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
它与普通的值最大的异同是:
相同点:     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1:统统属于值范畴.数字1是一个值,字符串&#8217;aaa&#8217;同样是一个值,同理 null也是一个值.
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2:都是合法的值,普通的数字,字符可以存在于表中字段,null也可以,而且是有意义的.
不同点:     先创建测试表:     USE [myTestDB]     GO     /****** [...]]]></description>
			<content:encoded><![CDATA[<p><b>写此系列文章缘由</b>: 做开发三年来(B/S),发现基于web 架构的项目技术主要分两大方面: </p>
<p>第一:C#,它是程序的基础,也可是其它开发语言,没有开发语言也就不存在应用程序.</p>
<p>第二:数据库,现在是信息化世界,大多数信息都可以通过数据库存储来交换信息.常与应用程序互相交流信息.</p>
<p>但在SQL开发应用时,我们往往只观注些常用的方法(insert delete select update),对些<b>小细节方面</b>(系统存储过程,函数的应用,优化分析)研究的并不多或者是知其一不知其二,所以本人想把在学习工作当中遇到的问题总结些,希望还没有重视这些方面的朋友会有帮助,少走些弯路.</p>
<p><b>主旨</b><b>:</b>本文首先根据自己的经验整理了一下<b>SQL</b><b>中的</b><b>null</b><b>的用法及要注意的方面</b>. </p>
<p><b>名词解释</b><b>(</b><b>英文辞典</b><b>):</b> null:无效的, 无价值的, 等于零的.</p>
<p><b>(SQL</b><b>定义</b><b>):</b>SQL中, NULL 与空格, 零, 都不相同. 是指为未定义或是不可用的. </p>
<p><b>构成因素</b><b>:</b>造成某一列成为 NULL 的因素可能是: </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (1),值不存在；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (2), 值未知；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (3), 列对表不可用.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p>
<p>它与普通的值最大的<b>异同</b>是:</p>
<p><b>相同点</b><b>:</b>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1:统统属于值范畴.数字1是一个值,字符串&#8217;aaa&#8217;同样是一个值,同理 null也是一个值.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2:都是合法的值,普通的数字,字符可以存在于表中字段,null也可以,而且是有意义的.</p>
<p><b>不同点</b><b>:</b>     <br />先创建测试表:     <br />USE [myTestDB]     <br />GO     <br />/****** 对象:&#160; Table [dbo].[testNull]&#160;&#160;&#160; 脚本日期: 10/11/2008 13:45:14 ******/     <br />SET ANSI_NULLS ON     <br />GO     <br />SET QUOTED_IDENTIFIER ON     <br />GO     <br />CREATE TABLE [dbo].[testNull](     <br />&#160;&#160;&#160; [ID] [int] IDENTITY(1,1) NOT NULL,     <br />&#160;&#160;&#160; [a] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,     <br />&#160;&#160;&#160; [b] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,     <br />CONSTRAINT [PK_testNull] PRIMARY KEY CLUSTERED     <br />(     <br />&#160;&#160;&#160; [ID] ASC     <br />)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]     <br />) ON [PRIMARY]     <br />插入相关测试值:     <br />insert into testNull     <br />values(&#8216;1&#8242;,&#8221;)     <br />insert into testNull</p>
<p>values(&#8216;2&#8242;,null)</p>
<p><b>1:</b>普通的值一般都可能进行运算符操作,例如:ID列为int,所以可以这样:ID=ID+1等,但如果一列的值为null,null+1=null,就是说null与任何运算符运算后都为null,这就是大家说的黑洞,会吃掉所有的东西.     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; update testNull     <br />set b=b+1     <br />where b is null</p>
<p><b>结论</b><b>:</b><b>查询后发现</b><b>b</b><b>的值没有变化</b><b>,</b><b>仍然为</b><b>null.</b></p>
<p><b>2:</b>普通的值可以进行&quot;=&quot;操作,例如条件中一般都会这样出现:sUserName=&#8217;张三&#8217;,如果sUserName的值为null,要想找出所有名字为null的记录时,不能这样用:sUserName=null,因为null不是一个具体的值,任何值与它比较时都会返回false.此时可借用is null 或者是is not null.</p>
<p>示例查询:</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1:select * from testNull where a=null &#8211;返回空结果集    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2:select * from testNull where b is null &#8211;返回结果集 2 2 NULL</p>
<p><b>结论</b><b>:</b>说明null是不能用&quot;=&quot;来比较,可用is null来替换</p>
<p><b>3:</b>在用统计函数count时会不同,例如count(ID):统计记录数.当统计的记录中的包含有null值时,它会忽略null值.</p>
<p>示例查询: </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1:select count(*),count(b) from testNull 它的返回值为2 1    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2: select count(*),count(isnull(b,&#8221;)) from testNull 它的返回值为2 2</p>
<p><b>结论</b><b>:</b>对于列包含null 时,统计行数是可用count(*),或者是先把null值转换成对应的值再统计,例如count(isnull(b,&#8221;));</p>
<p><b>4:</b>对于in 的影响不同.</p>
<p>示例查询: 查询testNull表中b的值包含在null中的记录.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; select * from testNull    <br />where b in(null) &#8211;没有任何记录     <br /><b>结论</b><b>:</b>in在查询时会忽略null的记录,查询的时候可用is not null来查询.     <br /><b>5:</b>排序时顺序有不同:当使用ORDER BY时，首先呈现NULL值。如果你用DESC以降序排序，NULL值最后显示。     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1:select * from testNull     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 1 &#8221;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 2 NULL     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2:select * from testNull order by b     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 2 NULL     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 1 &#8221;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3:select * from testNull order by b desc     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 1 &#8221;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 2 NULL</p>
<p><b>6:</b>当使用GROUP BY时，所有的NULL值被认为是相等的。这时先多插入几条数据,方便查看结果.     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; insert into testNull     <br />values(&#8216;3&#8242;,null)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; values(&#8216;4&#8242;,&#8217;4&#8242;)     <br />select * from testNull     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; select count(b) from testNull     <br />group by b     <br /><b>返回结果</b><b>:</b>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 1 1</p>
<p><b>结论</b><b>:</b>可见在group by&#160; 的时候,null视为等同.</p>
<p><b>7:</b>永远不会有什么数据等于NULL。1不等于NULL，2也一样。但NULL也不等于NULL。所以我们只能比较它“是”或“不是”。</p>
<p><b>总结</b><b>:</b>SQL中提供了如此众多的存储过程,函数供我们调用,而我们又真正的理解几个呢?只有真正了解它们,才会对开发中出现的种种问题迅速找出问题所在并解决它. </p>
<p>引用：<a href="http://www.cnblogs.com/ASPNET2008/archive/2008/10/12/1308633.html">http://www.cnblogs.com/ASPNET2008/archive/2008/10/12/1308633.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.acmind.com/archives/202/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何用Powerdesigner的PDM(物理数据模型)生成数据库</title>
		<link>http://blog.acmind.com/archives/133</link>
		<comments>http://blog.acmind.com/archives/133#comments</comments>
		<pubDate>Sat, 17 Jan 2009 02:24:44 +0000</pubDate>
		<dc:creator>笑谈</dc:creator>
				<category><![CDATA[数据相关]]></category>
		<category><![CDATA[辅助工具]]></category>
		<category><![CDATA[建模]]></category>
		<category><![CDATA[PDM]]></category>
		<category><![CDATA[PowerDesigner]]></category>

		<guid isPermaLink="false">http://blog.acmind.com/?p=133</guid>
		<description><![CDATA[pdm做好后，最终是要将其转化为数据库实体的。    1.确认当前Powerdesigner设置的dbms是否正确,即是否是我们要生成的数据库类型，我在这里使用的是sqlserver2000:     Powerdesigner-&#62;数据库-&#62;更改当前dbms，选择您的数据库类型。 
 
2.配置Powerdesigner与数据源的连接    Powerdesigner-&#62;数据库-&#62;配置连接-&#62;用户dsn(或系统dsn)-&#62;选择、添加您的数据源     3.连接     Powerdesigner-&#62;数据库-&#62;连接-&#62;设置好您刚才建立的dsn确定。     OK,设置好连接后我们就可以将pdm生成sql语句了。     4.数据库生成     Powerdesigner-&#62;数据库-&#62;生成数据库-&#62;配置好（默认就可以）后选择确定就好了。     拿到sql脚本语句，大家都知道应当如何做了吧，放到sql查询分析器里执行吧。 
]]></description>
			<content:encoded><![CDATA[<p>pdm做好后，最终是要将其转化为数据库实体的。    <br />1.确认当前Powerdesigner设置的dbms是否正确,即是否是我们要生成的数据库类型，我在这里使用的是sqlserver2000:     <br />Powerdesigner-&gt;数据库-&gt;更改当前dbms，选择您的数据库类型。 </p>
<p><a href="http://blog.acmind.com/wp-content/uploads/2009/01/image12.png" class="highslide-image" onclick="return hs.expand(this);"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="386" alt="image" src="http://blog.acmind.com/wp-content/uploads/2009/01/image-thumb12.png" width="474" border="0" /></a> </p>
<p>2.配置Powerdesigner与数据源的连接    <br />Powerdesigner-&gt;数据库-&gt;配置连接-&gt;用户dsn(或系统dsn)-&gt;选择、添加您的数据源     <br />3.连接     <br />Powerdesigner-&gt;数据库-&gt;连接-&gt;设置好您刚才建立的dsn确定。     <br />OK,设置好连接后我们就可以将pdm生成sql语句了。     <br />4.数据库生成     <br />Powerdesigner-&gt;数据库-&gt;生成数据库-&gt;配置好（默认就可以）后选择确定就好了。     <br />拿到sql脚本语句，大家都知道应当如何做了吧，放到sql查询分析器里执行吧。 </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.acmind.com/archives/133/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

