﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-thinktalk-随笔分类-DataBase</title><link>http://www.blogjava.net/ThinkingTalking/category/26285.html</link><description>Do what I can do!</description><language>zh-cn</language><lastBuildDate>Sun, 22 Nov 2009 06:17:34 GMT</lastBuildDate><pubDate>Sun, 22 Nov 2009 06:17:34 GMT</pubDate><ttl>60</ttl><item><title>SQL2005 安装过程</title><link>http://www.blogjava.net/ThinkingTalking/archive/2009/06/11/281408.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Thu, 11 Jun 2009 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2009/06/11/281408.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/281408.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2009/06/11/281408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/281408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/281408.html</trackback:ping><description><![CDATA[<p>SQL2005 安装，全部默认是不能安装SQL Server Management Studio（sql2000叫企业管理器），一定要自己从安装高级中自己选择上（客户端组件－＞连接组件　与　管理工具）．</p>
<p>&nbsp;</p>
<div forimg="1">
<div forimg="1">
<p><img style="width: 282px; height: 159px" class="blogimg" border="0" alt="" src="http://hiphotos.baidu.com/chjyezi/pic/item/dc5d9a23d4c5f649ad34ded4.jpg" width="383" height="279" small="0" /></p>
<p>&nbsp;</p>
<div forimg="1">
<p><img class="blogimg" border="0" alt="" src="http://hiphotos.baidu.com/chjyezi/pic/item/04a02334188254365bb5f5d5.jpg" small="0" /></p>
<p>&nbsp;</p>
<div forimg="1">
<p><img class="blogimg" border="0" alt="" src="http://hiphotos.baidu.com/chjyezi/pic/item/81b72d9752f46a6055fb96d6.jpg" small="0" /></p>
<p>&nbsp;</p>
<div forimg="1">
<p><img class="blogimg" border="0" alt="" src="http://hiphotos.baidu.com/chjyezi/pic/item/3b4ebc4595b3d52bcffca3d7.jpg" small="0" /></p>
<p>&nbsp;</p>
<div forimg="1">
<p><img class="blogimg" border="0" alt="" src="http://hiphotos.baidu.com/chjyezi/pic/item/e5a0cd5c2926044efbf2c0d2.jpg" small="0" /></p>
<p>2、接受软件使用许可协议。<br />
3、SQL2005在进行初始检测后开始执行安装 SQL2005 所需组件。<br />
4、完成所必需组件的安装。<br />
5、安装程序开始执行系统配置检查。<br />
6、进入SQL2005的安装向导。<br />
7、向导开始执行系统配置检查，因为是安装群集，会自动检查各节点并给出状态提示。因为虚拟机配置的是512M内存，所以这里会&#8220;最低硬件要求&#8221;的警告，可以忽略！<br />
8、选择要安装的组件，如要得到各组件的详细信息可以选择高级项。<br />
9、进入高级项后就来到了详细的各组件的功能选择，这里可以得到详细的组件信息。根据需要选择组件功能。<br />
10、&#8220;实例名&#8221;配置中选择&#8220;默认实例&#8221;。<br />
11、虚拟服务器名称配置中，为此群集命名为sql2005<br />
12、为虚拟服务器配置IP，这里我使用Public作为公共访问，并分配一个IP192.168.199.201，添加后点击&#8220;下一步&#8221;。<br />
13、在&#8220;选择群集组&#8221;中选择可以得群集组，因为这里我只有一个默认的群集组，所以点击&#8220;下一步&#8221;继续。<br />
14、弹出警告，提示我此群集组包含仲裁资源，这是因为我之前配置了一块Pln磁盘并分配两个逻辑分区来做群集，因此在这里会提示警告，可以直接忽略。<br />
15、群集节点配置中，选择可用的节点，因为我当前是双节点群集环境，所以安装向导自动为我选择了NodeA节点。<br />
16、配置远程安装的帐户，这里的帐户必须是各节点上有效的管理员帐户。<br />
17、为服务配置帐户，之前我已经添加了一个名为sql2005的域用户作为SQL服务帐户，所以这里填写上正确的信息。<br />
18、配置群集服务的域组，这里其实我到现在还没有彻底搞明白是什么意思，参看帮助文件，便在域中为每个SQL服务创建对应的全局组。（希望达人能够帮我解答一下此处的意义！）<br />
19、身份验证模式中，选择&#8220;混合模式&#8221;这和SQL2000的感念是一样的。<br />
20、排序规则我是按照默认选择的。<br />
21、这里我没有选择微软提供的跟踪服务功能。<br />
22、前期的安装配置完成后就准备开始执行正式的文件安装！</p>
</div>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/281408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2009-06-11 12:19 <a href="http://www.blogjava.net/ThinkingTalking/archive/2009/06/11/281408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql数据库加锁与解锁（转）</title><link>http://www.blogjava.net/ThinkingTalking/archive/2008/10/07/232803.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Tue, 07 Oct 2008 00:29:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2008/10/07/232803.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/232803.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2008/10/07/232803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/232803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/232803.html</trackback:ping><description><![CDATA[转自：http://www.pai7.cn/article.asp?id=359<br />
<br />
SQL语句：<br />
<br />
LOCK&nbsp;TABLES&nbsp;tablename&nbsp;WRITE;<br />
LOCK&nbsp;TABLES&nbsp;tablename&nbsp;READ;<br />
Insert&nbsp;INTO&nbsp;assignment&nbsp;VALUES&nbsp;(1,7513,'0000-00-00',5),(1,7513,'2003-01-20',8.5);<br />
UNLOCK&nbsp;TABLES;<br />
<br />
对于多个用户同时提交表单，并且同时向数据库中得到表单ID，我是这样解决的：<br />
<br />
mysql_query("lock&nbsp;tables&nbsp;po&nbsp;read");<br />
mysql_query("lock&nbsp;tables&nbsp;po&nbsp;write");<br />
<br />
mysql_query("update&nbsp;po&nbsp;set&nbsp;id=id&nbsp;+1"))；//&nbsp;increase&nbsp;po&nbsp;id<br />
<br />
$sql&nbsp;=&nbsp;"Select&nbsp;id&nbsp;FROM&nbsp;po";<br />
$result&nbsp;=&nbsp;mysql_query($sql);<br />
if&nbsp;($row&nbsp;=&nbsp;mysql_fetch_assoc($result))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$row["id"];&nbsp;//&nbsp;this&nbsp;order&nbsp;will&nbsp;use&nbsp;this&nbsp;id<br />
}<br />
<br />
mysql_free_result($result);<br />
mysql_query("unlock&nbsp;tables"); <br />
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/232803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2008-10-07 08:29 <a href="http://www.blogjava.net/ThinkingTalking/archive/2008/10/07/232803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle安装总结</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/15/153025.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Mon, 15 Oct 2007 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/15/153025.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/153025.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/15/153025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/153025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/153025.html</trackback:ping><description><![CDATA[<p>今天从网上下载了oracle10g，决心要学好它。现在从安装开始！<br />
运行 setup.exe ，之后弹出欢迎使用Orcale Database 10g 安装窗口。<br />
在这里要想快速的安装数据库的可以选择基本安装，然后点击下一步。<br />
我选择高级安装，然后指定名称路径信息，我安装到D 盘下，安装类型为企业型，启动数据库为通用的。<br />
指定数据库配置选项很重要!这里要设置全局数据库名及SID。全局数据库名用于分布式数据库系统中区分不同的数据库，如oracle1.changchun.com为长春的数据库，oracle1.jilin.com为吉林的数据库，即使数据库名称相同，但域名不同，也能区分开。要强调的是数据库的名称长度不能超过8个字符，且只能包括字母、数字、下划线、$、#。SID 是System Indentifier的简写，主要用于区分同一台计算机上的同一数据库的不同实例。<br />
我们选使用Database Control作为管理数据库的工具。以便于在本地管理数据库。在此说明以外的我都是使用的默认设置。<br />
指定数据库方案的口令，我是选择了所有的账户使用同一个口令（我不推荐），我是为了方便记住。<br />
完成了一系列的设置后就是漫长的安装了。<br />
在数据库创建完毕后显示数据库信息窗口。在此点口令管理。解除SCOTT用户的账户，设置成自己的口令：tiger<br />
确定后就完成了安装过程。<br />
下面看看oracle在你的计算机里做了些什么。。。<br />
首先，看看安装过程的日志。它存放在SYSTEM_DRIVE:\program files\oracle\Inventory\logs目录下。<br />
格式为installActionsdate_time.log<br />
在看看程序组里加入了oracle的几项内容。<br />
来看看oracle 的文件结构：<br />
安装完oracle后，目录为一个树形结构。根被称作oracle根目录（oracle_base），如我的是D:\oracle\product\10.2.0。oracle主目录(oracle_home)指向根目录的下一级目录，如：D:\oracle\product\10.2.0\db_1<br />
再看看其他目录，在根目录下还有一个admin目录，在它下是每一个数据库的目录，这些数据库以数据库的名称（DB_Name）作为目录名称。在DB_Name目录下的几个目录是分别用来保存后台进程跟踪的文件(bdump)、内核放弃文件(cdump)、数据库创建文件(create)、初始化参数文件(pfile)、用户SQL跟踪文件(udump)。根目录下还有一个oradata目录，再此目录下，每一个数据库都有一个以数据库名称命名的子目录，即DB_Name目录。该数据库的控制文件(.ctl)、重做日志文件(.log)、数据文件(.dbf)等均存放在该目录中的各个子目录里。<br />
在服务里的oracle:不说了，都明白！！<br />
在注册表里的oracle:<br />
先看看和服务有关的几个子键。因为我的数据库名为oamis，所以搜索OracleServiceOAMISSID。然后就看到了在它前面的几个与服务相关的子键了。<br />
看看与安装和运行的环境、参数设置有关的几个子键：搜索KEY_OraDb10g_home1(如果之前安装时你没有修改过安装产品的名称的话，应该能搜到)。<br />
看看和ODBC驱动程序有关的几个子键：搜索Oracle in OraDb10g_home1<br />
下面看看在环境变量中的oracle:<br />
为了能够在不提供路径的情况下直接运行或调用oracle应用程序，在系统的环境变量里有这么一行：Path=d:\oracle\product\10.2.0\db_1\bin;<br />
PERL5LIB=d:\oracle\product\10.2.0\db_1\perl\5.8.3\lib\MSWin32-x86;d:\oracle\product\10.2.0\db_1\perl\5.8.3\lib;d:\oracle\product\10.2.0\db_1\perl\5.8.3\lib\MSWin32-x86;d:\oracle\product\10.2.0\db_1\perl\site\5.8.3;d:\oracle\product\10.2.0\db_1\perl\site\5.8.3\lib;d:\oracle\product\10.2.0\db_1\sysman\admin\scripts;<br />
好了，oracle在你的计算机里留下了这么多的痕迹。<br />
下面看看怎么管理你的oracle。<br />
用SQL*Plus。用户名：(scott)、口令：(tiger)、主机字符串(oamis)<br />
用iSQL*Plus。http://你的主机名称:5560/isqlplus&nbsp;&nbsp; 用户名:(scott)口令：(tiger)保留连接标示符:<br />
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=你的主机名称)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=oamis)))<br />
用OEM(Oracle Enterprise Manager)。http://你的主机名称:1158/em&nbsp; 用户名：(system)口令:(你在前面设置的所有的账户使用同一个口令的口令)<br />
<br />
好了，安装就先说这些，欢迎大家共同讨论。<br />
<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/153025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-10-15 17:03 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/15/153025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句大全</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149848.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 30 Sep 2007 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149848.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149848.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149848.html</trackback:ping><description><![CDATA[<p>SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',<br />
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions<br />
/*动态文件名<br />
declare @fn varchar(20),@s varchar(1000)<br />
set @fn = 'c:\test.xls'<br />
set @s ='''Microsoft.Jet.OLEDB.4.0'',<br />
''Data Source="<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#102;&#110;&#43;&#39;&#37;&#50;&#50;&#59;&#85;&#115;&#101;&#114;">'+@fn+'";User</a> ID=Admin;Password=;Extended properties=Excel 5.0'''<br />
set @s = 'SELECT * FROM OpenDataSource (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#43;&#39;&#41;&#46;&#46;&#46;&#115;&#104;&#101;&#101;&#116;&#49;&#36;&#39;">'+@s+')...sheet1$'</a><br />
exec(@s)<br />
*/</p>
<p>SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+'　' 转换后的别名<br />
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',<br />
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions</p>
<p>/********************** EXCEL导到远程SQL<br />
insert OPENDATASOURCE(<br />
'SQLOLEDB',<br />
'Data Source=远程ip;User ID=sa;Password=密码'<br />
).库名.dbo.表名 (列名1,列名2)<br />
SELECT 列名1,列名2<br />
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',<br />
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions</p>
<p><br />
/** 导入文本文件<br />
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'</p>
<p>/** 导出文本文件<br />
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'<br />
或<br />
EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'</p>
<p>导出到TXT文本，用逗号分开<br />
exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'</p>
<p><br />
BULK INSERT 库名..表名<br />
FROM 'c:\test.txt'<br />
WITH (<br />
FIELDTERMINATOR = ';',<br />
ROWTERMINATOR = '\n'<br />
)</p>
<p><br />
--/* dBase IV文件<br />
select * from <br />
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'<br />
,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')<br />
--*/</p>
<p>--/* dBase III文件<br />
select * from <br />
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'<br />
,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')<br />
--*/</p>
<p>--/* FoxPro 数据库<br />
select * from openrowset('MSDASQL',<br />
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',<br />
'select * from [aa.DBF]')<br />
--*/</p>
<p>/**************导入DBF文件****************/<br />
select * from openrowset('MSDASQL',<br />
'Driver=Microsoft Visual FoxPro Driver;<br />
SourceDB=e:\VFP98\data;<br />
SourceType=DBF',<br />
'select * from customer where country != "USA" order by country')<br />
go<br />
/***************** 导出到DBF ***************/<br />
如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句</p>
<p>insert into openrowset('MSDASQL',<br />
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',<br />
'select * from [aa.DBF]')<br />
select * from 表</p>
<p>说明:<br />
SourceDB=c:\ 指定foxpro表所在的文件夹<br />
aa.DBF 指定foxpro表的文件名.</p>
<p><br />
/*************导出到Access********************/<br />
insert into openrowset('Microsoft.Jet.OLEDB.4.0', <br />
'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表</p>
<p>/*************导入Access********************/<br />
insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', <br />
'x:\A.mdb';'admin';'',A表)</p>
<p>文件名为参数<br />
declare @fname varchar(20)<br />
set @fname = 'd:\test.mdb'<br />
exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'',<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#39;&#39;&#43;&#64;&#102;&#110;&#97;&#109;&#101;&#43;&#39;&#39;&#39;&#59;&#39;&#39;&#97;&#100;&#109;&#105;&#110;&#39;&#39;&#59;&#39;&#39;&#39;&#39;">'''+@fname+''';''admin'';''''</a>, topics) as a ')</p>
<p>SELECT * <br />
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',<br />
'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品</p>
<p>********************* 导入 xml　文件</p>
<p>DECLARE @idoc int<br />
DECLARE @doc varchar(1000)<br />
--sample XML document<br />
SET @doc ='<br />
&lt;root&gt;<br />
&lt;Customer cid= "C1" name="Janine" city="Issaquah"&gt;<br />
&lt;Order oid="O1" date="1/20/1996" amount="3.5" /&gt;<br />
&lt;Order oid="O2" date="4/30/1997" amount="13.4"&gt;Customer was very satisfied<br />
&lt;/Order&gt;<br />
&lt;/Customer&gt;<br />
&lt;Customer cid="C2" name="Ursula" city="Oelde" &gt;<br />
&lt;Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue <br />
white red"&gt;<br />
&lt;Urgency&gt;Important&lt;/Urgency&gt;<br />
Happy Customer.<br />
&lt;/Order&gt;<br />
&lt;Order oid="O4" date="1/20/1996" amount="10000"/&gt;<br />
&lt;/Customer&gt;<br />
&lt;/root&gt;<br />
'<br />
-- Create an internal representation of the XML document.<br />
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc</p>
<p>-- Execute a SELECT statement using OPENXML rowset provider.<br />
SELECT *<br />
FROM OPENXML (@idoc, '/root/Customer/Order', 1)<br />
WITH (oid char(5), <br />
amount float, <br />
comment ntext 'text()')<br />
EXEC sp_xml_removedocument @idoc</p>
<p><br />
???????</p>
<p>/**********************Excel导到Txt****************************************/<br />
想用<br />
select * into opendatasource(...) from opendatasource(...)<br />
实现将一个Excel文件内容导入到一个文本文件</p>
<p>假设Excel中有两列，第一列为姓名，第二列为很行帐号(16位)<br />
且银行帐号导出到文本文件后分两部分，前8位和后8位分开。</p>
<p><br />
邹健：<br />
如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2<br />
然后就可以用下面的语句进行插入<br />
注意文件名和目录根据你的实际情况进行修改.</p>
<p>insert into<br />
opendatasource('MICROSOFT.JET.OLEDB.4.0'<br />
,'Text;HDR=Yes;DATABASE=C:\'<br />
)...[aa#txt]<br />
--,aa#txt)<br />
--*/<br />
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br />
from <br />
opendatasource('MICROSOFT.JET.OLEDB.4.0'<br />
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'<br />
--,Sheet1$)<br />
)...[Sheet1$]</p>
<p><br />
如果你想直接插入并生成文本文件,就要用bcp</p>
<p>declare @sql varchar(8000),@tbname varchar(50)</p>
<p>--首先将excel表内容导入到一个全局临时表<br />
select @tbname='[##temp'+cast(newid() as varchar(40))+']'<br />
,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br />
into <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#98;&#110;&#97;&#109;&#101;&#43;&#39;">'+@tbname+'</a> from <br />
opendatasource(''MICROSOFT.JET.OLEDB.4.0''<br />
,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls''<br />
)...[Sheet1$]'<br />
exec(@sql)</p>
<p>--然后用bcp从全局临时表导出到文本文件<br />
set @sql='bcp "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#98;&#110;&#97;&#109;&#101;&#43;&#39;">'+@tbname+'</a>" out "c:\aa.txt" /S"(local)" /P"" /c'<br />
exec master..xp_cmdshell @sql</p>
<p>--删除临时表<br />
exec('drop table <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#98;&#110;&#97;&#109;&#101;">'+@tbname</a>)</p>
<p><br />
/********************导整个数据库*********************************************/</p>
<p>用bcp实现的存储过程</p>
<p><br />
/*<br />
实现数据导入/导出的存储过程<br />
根据不同的参数,可以实现导入/导出整个数据库/单个表<br />
调用示例:<br />
--导出调用示例<br />
----导出单个表<br />
exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1<br />
----导出整个数据库<br />
exec file2table 'zj','','','xzkh_sa','C:\docman',1</p>
<p>--导入调用示例<br />
----导入单个表<br />
exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0<br />
----导入整个数据库<br />
exec file2table 'zj','','','xzkh_sa','C:\docman',0</p>
<p>*/<br />
if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)<br />
drop procedure File2Table<br />
go<br />
create procedure File2Table<br />
@servername varchar(200) --服务器名<br />
,@username varchar(200) --用户名,如果用NT验证方式,则为空''<br />
,@password varchar(200) --密码<br />
,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表<br />
,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个<br />
参数是文件存放路径,文件名自动用<br />
表名.txt<br />
,@isout bit --1为导出,0为导入<br />
as<br />
declare @sql varchar(8000)</p>
<p>if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表<br />
begin<br />
set @sql='bcp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#98;&#110;&#97;&#109;&#101;">'+@tbname</a><br />
+case when @isout=1 then ' out ' else ' in ' end<br />
+' "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101;&#43;&#39;">'+@filename+'</a>" /w'<br />
+' /S <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#101;&#114;&#118;&#101;&#114;&#110;&#97;&#109;&#101;">'+@servername</a><br />
+case when isnull(@username,'')='' then '' else ' /U <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;">'+@username</a> end<br />
+' /P '+isnull(@password,'')<br />
exec master..xp_cmdshell @sql<br />
end<br />
else<br />
begin --导出整个数据库,定义游标,取出所有的用户表<br />
declare @m_tbname varchar(250)<br />
if right(@filename,1)&lt;&gt;'\' set @filename=@filename+'\'</p>
<p>set @m_tbname='declare #tb cursor for select name from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#98;&#110;&#97;&#109;&#101;&#43;&#39;&#46;&#46;&#115;&#121;&#115;&#111;&#98;&#106;&#101;&#99;&#116;&#115;">'+@tbname+'..sysobjects</a> where xtype=''U'''<br />
exec(@m_tbname)<br />
open #tb<br />
fetch next from #tb into @m_tbname<br />
while @@fetch_status=0<br />
begin<br />
set @sql='bcp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#98;&#110;&#97;&#109;&#101;&#43;&#39;&#46;&#46;&#39;&#43;&#64;&#109;&#95;&#116;&#98;&#110;&#97;&#109;&#101;">'+@tbname+'..'+@m_tbname</a><br />
+case when @isout=1 then ' out ' else ' in ' end<br />
+' "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101;&#43;&#64;&#109;&#95;&#116;&#98;&#110;&#97;&#109;&#101;&#43;&#39;&#46;&#116;&#120;&#116;">'+@filename+@m_tbname+'.txt</a> " /w'<br />
+' /S <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#101;&#114;&#118;&#101;&#114;&#110;&#97;&#109;&#101;">'+@servername</a><br />
+case when isnull(@username,'')='' then '' else ' /U <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;">'+@username</a> end<br />
+' /P '+isnull(@password,'')<br />
exec master..xp_cmdshell @sql<br />
fetch next from #tb into @m_tbname<br />
end<br />
close #tb<br />
deallocate #tb <br />
end<br />
go</p>
<p><br />
/************* Oracle **************/<br />
EXEC sp_addlinkedserver 'OracleSvr', <br />
'Oracle 7.3', <br />
'MSDAORA', <br />
'ORCLDB'<br />
GO</p>
<p>delete from openquery(mailser,'select * from yulin')</p>
<p>select * from openquery(mailser,'select * from yulin')</p>
<p>update openquery(mailser,'select * from yulin where id=15')set disorder=555,catago=888</p>
<p>insert into openquery(mailser,'select disorder,catago from yulin')values(333,777)</p>
<p><br />
补充：</p>
<p>对于用bcp导出,是没有字段名的.</p>
<p>用openrowset导出,需要事先建好表.</p>
<p>用openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入<br />
</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-09-30 12:31 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL数据库安全解决方案</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149749.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 30 Sep 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149749.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149749.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149749.html</trackback:ping><description><![CDATA[<div class="NewsContent" id="NewsContentLabel">
<p>随着<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>的普及，基于<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>的应用也越来越多。<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>数据库就是其中之一。通过一台或几台<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">服务器</a>可以为很多客户提供服务，这种方式给人们带来了很多方便，但也给不法分子造成了可乘之机。由于数据都是通过<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>传输的，这就可以在传输的过程中被截获，或者通过非常手段进入<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>。由于以上原因，<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>安全就显得十分重要。因此，本文就以上问题讨论了MySQL数据库在<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>安全方面的一些功能。</p>
<p>　　帐户<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a></p>
<p>　　帐户是MySQL最简单的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>措施。每一帐户都由用户名、密码以及位置（一般由<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">服务器</a>名、IP或通配符）组成。如用户john从server1进行登录可能和john从server2登录的权限不同。</p>
<p>　　MySQL的用户结构是用户名/密码/位置。这其中并不包括<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>名。下面的两条命令为database1和database2设置了SELECT用户权限。</p>
<p>GRANT SELECT ON database1.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#115;&#101;&#114;&#118;&#101;&#114;&#49;&#39;">'abc'@'server1'</a> IDENTIFIED BY 'password1';</p>
<p>GRANT SELECT ON database2.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#115;&#101;&#114;&#118;&#101;&#114;&#49;&#39;">'abc'@'server1'</a> IDENTIFIED BY 'password2';</p>
<p>　　第一条命令设置了用户abc在连接<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>database1时使用password1。第二条命令设置了用户abc在连接<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>database2时使用password2。因此，用户abc在连接<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>database1和database2的密码是不一样的。</p>
<p>　　上面的设置是非常有用的。如果你只想让用户对一个<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>进行有限的访问，而对其它<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>不能访问，这样可以对同一个用户设置不同的密码。如果不这样做，当用户发现这个用户名可以访问其它<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>时，那将会造成麻烦。</p>
<p>　　MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>信息保存在MySQL中是非常有意义的。因此，我们可以使用标准的SQL来设置不同的权限。</p>
<p>　　一般在MySQL数据库中可以使用3种不同类型的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>检查：</p>
<p>　　&#183;登录验证</p>
<p>　　也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码，这个验证就可通过。</p>
<p>　　&#183;授权</p>
<p>　　在登录成功后，就要求对这个用户设置它的具体权限。如是否可以删除<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>中的表等。</p>
<p>　　&#183;访问控制</p>
<p>　　这个<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>类型更具体。它涉及到这个用户可以对数据表进行什么样的操作，如是否可以<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">编辑</a>数据库，是否可以查询数据等等。</p>
<p>　　访问控制由一</p>
<div class="NewsContent" id="NewsContentLabel">些特权组成，这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型，即要么允许，要么不允许。下面是这些特权的列表：
<p>&nbsp;</p>
<p>　　&#183;SELECT</p>
<p>　　SELECT是设定用户是否可以使用SELECT来查询数据。如果用户没有这个特权，那么就只能执行一些简单的SELECT命令，如计算表达式（SELECT 1+2）,或是日期转换（SELECT Unix_TIMESTAMP(NOW( )))等。</p>
<p>　　&#183;INSERT<br />
　　&#183;UPDATE<br />
　　&#183;INDEX</p>
<p>　　INDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限，那么将无法设置表中的索引。</p>
<p>　　&#183;ALTER<br />
　　&#183;CREATE<br />
　　&#183;GRANT</p>
<p>　　如果一个用户拥有这个GRANT权限，那么他就可以将自己的权限授给别的用户。也就是说，这个用户可以和其它用户共享自己的权限。</p>
<p>　　&#183;REFERENCES</p>
<p>　　有了REFERENCES权限，用户就可以将其它表的一个字段作为某一个表的外键约束。</p>
<p>　　除了以上的权限外，MySQL还有一些权限可以对整个MySQL进行操作。</p>
<p>　　&#183;Reload</p>
<p>　　这个权限可以使用户有权执行各种FLUSH命令，如FLUSH TABLES, FLUSH STATUS等。</p>
<p>　　&#183;Shutdown</p>
<p>　　这个权限允许用户关闭MySQL</p>
<p>　　&#183;Process</p>
<p>　　通过这个权限，用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程，可以通过这种方式查看SQL执行的细节。</p>
<p>　　&#183;File</p>
<p>　　这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重，因为有这个权限的用户可以将任意的文件装载到表中，这样对MySQL是十分危险的。</p>
<p>　　&#183;Super</p>
<p>　　这个权限允许用户终止任何查询（这些查询可能并不是这个用户执行的）。<br />
以上几种权限是非常危险的，在给用户授权限时要非常谨慎。</p>
<p>　　MySQL中的SSL</p>
<p>　　以上的帐户<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>只是以普通的Socket进行数据传输的，这样非常不<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>。因此，MySQL在4.1版以后提供了对SSL（Secure Scokets Layer）的支持。MySQL使用的是免费的OpenSSL库。</p>
<p>　　由于MySQL的Linux版本一般都是随Linux本身一起发布，因此，它们默认时都不使用SSL进行传输数据。如果要打开SSL功能，需要对hava_openssl变量进行设置：</p>
<p>　　MySQL的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">Windows</a>版本已经将OpenSSL加入了。也面的命令是</p>
</div>
<br />
<div class="NewsContent" id="NewsContentLabel">查看你的MySQL是否打开了SSL功能。
<p>&nbsp;</p>
<p>SHOW VARIABLES LIKE 'have_openssl';</p>
<p>+---------------+-------+</p>
<p>| Variable_name | Value |</p>
<p>+---------------+-------+</p>
<p>| have_openssl | NO |</p>
<p>+---------------+-------+</p>
<p>1 row in set (0.00 sec)</p>
<p>　　如果返回的是NO，那么说明你需要将OpenSSL编译进自己的MySQL</p>
<p>　　在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令：</p>
<p>GRANT ALL PRIVILEGES ON ssl_only_db.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#37;&#39;">'abc'@'%'</a> IDENTIFIED BY "password!" REQUIRE SSL;</p>
<p>　　还可以通过 REQUIRE x509 选项进行SSL传输:</p>
<p>GRANT ALL PRIVILEGES ON ssl_only_db.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#37;&#39;">'abc'@'%'</a> IDENTIFIED BY "password!" REQUIRE x509;</p>
<p>　　你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>。</p>
<p>GRANT ALL PRIVILEGES ON ssl_only_db.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#37;&#39;">'abc'@'%'</a><br />
IDENTIFIED BY "password!"<br />
REQUIRE SUBJECT "/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#47;&#101;&#109;&#97;&#105;&#108;&#65;&#100;&#100;&#114;&#101;&#115;&#115;&#61;&#114;&#97;&#121;&#109;&#111;&#110;&#100;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">example.com/emailAddress=raymond@example.com</a>";</p>
<p>　　也许你并不关心使用的是什么客户许可，而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现：</p>
<p>GRANT ALL PRIVILEGES ON ssl_only_db.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#37;&#39;">'abc'@'%'</a> IDENTIFIED BY "password!"<br />
REQUIRE ISSUER "/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#109;&#47;&#101;&#109;&#97;&#105;&#108;&#65;&#100;&#100;&#114;&#101;&#115;&#115;&#61;&#97;&#100;&#109;&#105;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">com/emailAddress=admin@example.com</a>";</p>
<p>　　SSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。</p>
<p>GRANT ALL PRIVILEGES ON ssl_only_db.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#97;&#98;&#99;&#39;&#64;&#39;&#37;&#39;">'abc'@'%'</a> IDENTIFIED BY "password!"<br />
REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA";</p>
<p>　　上面使用了GRANT命令对用户权限进行设置。而这些<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>都是保存在授权表中，这些表是<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表，将会对<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>起到积极的作用，而如果使用不慎，将是非常危险的。</p>
<p>　　下面让我们来看看MySQL中的最要的5个授权表。</p>
<p>　　user</p>
<p>　　用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">服务器</a>上。</p>
<p>　　host</p>
<p>　　这个表为每一个客户机分配权限，它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时</p>
</div>
<div class="NewsContent" id="NewsContentLabel">，首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表，我们可以通过手工方式修改这个表中的内容。
<p>&nbsp;</p>
<p>　　db</p>
<p>　　db表保存了<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>层的权限<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>。</p>
<p>　　tables_priv</p>
<p>　　这个表存储了表的权限<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>。</p>
<p>　　columns_priv</p>
<p>　　这个表保存了单独列的权限<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>。通过这个表，可以将操作某一列的权限授予一个用户。</p>
<p>　　哈希加密</p>
<p>　　如果<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>保存了敏感的数据，如银行卡密码，客户<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>等，你可能想将这些数据以加密的形式保存在<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>中。这样即使有人进入了你的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>，并看到了这些数据，也很难获得其中的真实<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>。</p>
<p>　　在应用程序的大量<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">信息</a>中，也许你只想交很小的一部分进行加密，如用户的密码等。这些密码不应该以明文的形式保存，它们应该以加密的形式保存在<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>中。一般情况下，大多数<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">系统</a>，这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。</p>
<p>　　哈希加密是单向加密，也就是说，被加密的字符串是无法得到原字符串的。这种方法使用很有限，一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密，而是将输入的字符串也使用同样的方法进行加密，再和<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串，也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。<br />
MySQL提供了4个函数用于哈希加密：PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数，看看会得到什么结果。我们以加密字符串"pa55word"为例进行说明：</p>
<p>　　让我们先来看看MD5函数</p>
<p>SELECT MD5('pa55word');</p>
<p>+----------------------------------+</p>
<p>| MD5('pa55word') |</p>
<p>+----------------------------------+</p>
<p>| a17a41337551d6542fd005e18b43afd4 |</p>
<p>+----------------------------------+</p>
<p>1 row in set (0.13 sec)</p>
<p>　　下面是PASSWORD函数</p>
<p>SELECT PASSWORD('pa55word');</p>
<p>+----------------------+</p>
<p>| PASSWORD('pa55word') |</p>
<p>+----------------------+</p>
<p>| 1d35c6556b8cab45 |</p>
<p>+----------------------+</p>
<p>1 row in set (0.00 sec)</p>
<p>　　下面是ENCRYPT函数</p>
<p>SELECT ENCRYPT('pa55word');</p>
<p>+---------------------+</p>
<p>| ENCRYPT('pa55word') |</p>
<p>+---------------------+</p>
<p>| up2Ecb0Hdj25A |</p>
<p>+--------------</p>
</div>
<div class="NewsContent" id="NewsContentLabel">-------+
<p>&nbsp;</p>
<p>1 row in set (0.17 sec)</p>
<p>　　上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写，最好在使用ENCRYPT生成加密字符串时，将这个字段定义成CHAR BINARY类型。</p>
<p>　　上面列举了3种加密的方法，但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中，这样便于跟踪。如下面的INSERT语句使用插入了一条记录，其中的密码使用了MD5进行加密：</p>
<p>INSERT INTO table1 (user, pw) VALUE ('user1', MD5('password1') )</p>
<p>　　可以通过如下的语句进行密码验证：</p>
<p>SELECT * FROM table1 WHERE user = 'user1' AND pw = MD5('password1')</p>
<p>　　哈希加密方法可以很好地对密码进行加密，使用了这种方法加密，密码将无法 恢复成明文。</p>
<p>&nbsp;</p>
</div>
</div>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-09-30 09:02 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MySQL的23个注意事项</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149748.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 30 Sep 2007 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149748.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149748.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149748.html</trackback:ping><description><![CDATA[<div class="NewsContent" id="NewsContentLabel">
<p>使用MySQL，<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>问题不能不注意。以下是MySQL提示的23个注意事项：</p>
<p><br />
1.如果客户端和<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">服务器</a>端的连接需要跨越并通过不可信任的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>，那么就需要使用SSH隧道来加密该连接的通信。</p>
<p><br />
2.用set password语句来修改用户的密码，三个步骤，先&#8220;mysql -u root&#8221;登陆<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>系统，然后&#8220;mysql&gt; update mysql.user set password=password('newpwd')&#8221;，最后执行&#8220;flush privileges&#8221;就可以了。</p>
<p><br />
3.需要提防的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">攻击</a>有，防偷听、篡改、回放、拒绝服务等，不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于ACL即访问控制列表的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>措施来完成。也有一些对SSL连接的支持。</p>
<p><br />
4.除了root用户外的其他任何用户不允许访问mysql主<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>中的user表；</p>
<p><br />
加密后存放在user表中的加密后的用户密码一旦泄露，其他人可以随意用该用户名/密码相应的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>；</p>
<p><br />
5.用grant和revoke语句来进行用户访问控制的工作；</p>
<p><br />
6.不使用明文密码，而是使用md5()和sha1()等单向的哈系函数来设置密码；</p>
<p><br />
7.不选用字典中的字来做密码；</p>
<p><br />
8.采用防火墙来去掉50%的外部危险，让<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>系统躲在防火墙后面工作，或放置在DMZ区域中；</p>
<p><br />
9.从因特网上用nmap来扫描3306端口，也可用telnet server_host 3306的方法测试，不能允许从非信任<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>中访问<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>服务器的3306号TCP端口，因此需要在防火墙或路由器上做设定；</p>
<p><br />
10.为了防止被恶意传入非法参数，例如where ID=234，别人却输入where ID=234 OR 1=1导致全部显示，所以在web的表单中使用''或""来用字符串，在动态URL中加入%22代表双引号、%23代表井号、%27代表单引号；传递未检查过的值给mysql数据库是非常危险的；</p>
<p><br />
11.在传递数据给mysql时检查一下大小；</p>
<p><br />
12.应用程序需要连接到<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>应该使用一般的用户帐号，只开放少数必要的权限给该用户；</p>
<p><br />
13.在各编程接口(C C++ PHP Perl Java JDBC等)中使用特定&#8216;逃脱字符&#8217;函数；</p>
<p><br />
在因特网上使用mysql数据库时一定少用传输明文的数据，而用SSL和SSH的加密方式数据来传输；</p>
<p><br />
14.学会使用tcpdump和strings工具来查看传输数据的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>性，例如tcpdump -l -i eth0 -w -src or dst port 3306 | strings。以普通用户来启动mysql数据库服务；</p>
<p><br />
15.不使用到</p>
<div class="NewsContent" id="NewsContentLabel">表的联结符号，选用的参数 --skip-symbolic-links；
<p>&nbsp;</p>
<p><br />
16.确信在mysql目录中只有启动<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>服务的用户才可以对文件有读和写的权限；</p>
<p><br />
17.不许将process或super权限付给非管理用户，该mysqladmin processlist可以列举出当前执行的查询文本；super权限可用于切断客户端连接、改变<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">服务器</a>运行参数状态、控制拷贝复制<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">数据库</a>的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">服务器</a>；</p>
<p><br />
18.file权限不付给管理员以外的用户，防止出现load data '/etc/passwd'到表中再用select 显示出来的问题；</p>
<p><br />
19.如果不相信DNS服务公司的服务，可以在主机名称允许表中只设置IP数字地址；</p>
<p><br />
20.使用max_user_connections变量来使mysqld服务进程，对一个指定帐户限定连接数；</p>
<p><br />
21.grant语句也支持资源控制选项；</p>
<p><br />
22.启动mysqld服务进程的<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>选项开关，--local-infile=0或1 若是0则客户端程序就无法使用local load data了，赋权的一个例子grant insert(user) on mysql.user to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#117;&#115;&#101;&#114;&#95;&#110;&#97;&#109;&#101;&#39;&#64;&#39;&#104;&#111;&#115;&#116;&#95;&#110;&#97;&#109;&#101;&#39;">'user_name'@'host_name'</a>;若使用--skip-grant-tables系统将对任何用户的访问不做任何访问控制，但可以用mysqladmin flush-privileges或mysqladmin reload来开启访问控制；默认情况是show databases语句对所有用户开放，可以用--skip-show-databases来关闭掉。</p>
<p><br />
23.碰到Error 1045(28000) Access Denied for user <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#114;&#111;&#111;&#116;&#39;&#64;&#39;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;&#39;">'root'@'localhost'</a> (Using password:NO)错误时，你需要重新设置密码，具体方法是：先用--skip-grant-tables参数启动mysqld，然后执行mysql -u root mysql,mysql&gt;update user set password=password('newpassword') where user='root';mysql&gt;Flush privileges;，最后重新启动mysql就可以了。</p>
<p>&nbsp;</p>
</div>
</div>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-09-30 09:00 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>