﻿<?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-【Xine】中文站-文章分类-SQL Server</title><link>http://www.blogjava.net/xine/category/11742.html</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I love you not because of who you are,but because of who I am when I am with you.&lt;br&gt;&lt;br&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:43:35 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:43:35 GMT</pubDate><ttl>60</ttl><item><title>SQL Server建立跨服务器的视图</title><link>http://www.blogjava.net/xine/articles/50757.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Tue, 06 Jun 2006 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/50757.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/50757.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/50757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/50757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/50757.html</trackback:ping><description><![CDATA[--首先建立链接服务器<br />EXEC sp_addlinkedserver <br />   'instance1', <br />   '', <br />   'MSDASQL',<br />   NULL,<br />   NULL,<br />   'DRIVER={SQL Server};SERVER=192.168.1.100;UID=sa;PWD=123;'<br />GO<br /><br />--查看链接服务器<br />EXEC sp_linkedservers<br /><br />--删除链接服务器<br />EXEC sp_dropserver 'instance1'<br /><br />--开始查询测试<br />select * from instance1.db1.dbo.table1<br />select * from 别名.数据库名.dbo.表名<br /><br /><br />经delphi连接测试，发现一个数据源并不能连接到链接服务器的表<br />经尝试以下方法可以用delphi连接视图：<br />create view educational1 as<br />SELECT         *<br />FROM             OPENDATASOURCE ('SQLOLEDB', <br />                          'Data Source=192.168.1.100; <br />                          USER ID = sa ;Password=123 '<br />                           ).shbbs.dbo.educational Rowset_1<img src ="http://www.blogjava.net/xine/aggbug/50757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-06 13:37 <a href="http://www.blogjava.net/xine/articles/50757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修复SQL Server 2000数据库之实战经验</title><link>http://www.blogjava.net/xine/articles/49692.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49692.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49692.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49692.html</trackback:ping><description><![CDATA[我所讲的一个故事的背景是这样的，在某一个POS的项目中使用SQLSERVER 2000做前台数据库，IBM 的DB2做后台数据库。前台数据库的环境是这样的操作系统是WINDOWS2000 SERVER(10 USERS),数据库是SQLSERVER2000(E)+SP3,Application是POS的收银系统（是一种实时的交易系统）。硬件的配置是：P4 XRON 2.4G*2,36G HDD*5 做的RAID5 ,1G MEMORY，HP DDS4 磁带机,数据库的容量一般保持在5G左右。<br />　　因为数据比较的重要，并且数据容量也不大，我们要求的备份策略是每天在磁带机做POS_DB的全备份（一个星期7天一个循环），在晚上还在硬盘上做全部备份（MASTER,MSDB,POS_DB).这样保持双重的保险。 
<p><font face="宋体" size="4"><strong>1.故障爆发：</strong></font><br />2003－12－26 13:00<br />客户报告所有的POS死机和SERVER运行速度非常的慢。经过重新启动服务器（启动到检查RAID卡时开始报警）我们发现在WINDEOWS 2000 SERVER的“系统日志”中有这样的信息：<br /><font color="#ff0000">Error: 823, Severity: 24, State: 2<br />I/O error (torn page) detected during read at offset 0x0000001bf96000 in file D :\DATA\POS_DB.mdf'. <br /></font>SQLSERVER的“错误日志”中有这样的信息： <br /><font color="#ff0000">2003-12-10 03:34:22.23 spid56 Error: 823, Severity: 24, State: 2<br />2003-12-10 03:34:22.23 spid56 I/O error (torn page) detected during read at offset 0x00000074964000 in file 'D:\DATA\POS_DB.mdf'</font>..<br />来自msdn的解释：<br />　　I/O logical check failure: If a read Windows API call or a write Windows API call for a database file is successful, but specific logical checks on the data are not successful (a torn page, for example), an 823 error is raised. The following error message is an example of an 823 error for an I/O logical check failure: <br /><font color="#ff0000">2003-09-05 16:51:18.90 spid17 Error: 823, Severity: 24, State: 2 <br />2003-09-05 16:51:18.90 spid17 I/O error (torn page) detected during read at offset 0x00000094004000 in file 'F:\SQLData\mydb.MDF'..</font><br />　　To resolve this problem, first run the DBCC CHECKDB statement on the database that is associated with the file in the error message. If the DBCC CHECKDB statement reports errors, correct those errors before you troubleshoot this problem. If the problem persists even after the DBCC CHECKDB errors have been corrected, or if the DBCC CHECKDB statement does not report any errors, review the Microsoft Windows NT system event log for any system errors or disk-related errors. You can also contact your hardware vendor to run any appropriate diagnostics.<br />　　 I/O逻辑检查失败：如果有一个WINDOWS程序在读取和写数据库文件时是成功的，但是在详细的数据逻辑检查时没有成功（比如：不完整的页），SQLSERVER会返回MSG 823的错误。下面就是一个I/O逻辑检查失败MSG 823的实例：<br /><font color="#ff0000">2003-09-05 16:51:18.90 spid17 Error: 823, Severity: 24, State: 2 <br />2003-09-05 16:51:18.90 spid17 I/O error (torn page) detected during read at offset 0x00000094004000 in file 'F:\SQLData\mydb.MDF'.. <br /></font>　　要解决这样的问题，首先要在该数据库中执行DBCC CHECKDB（错误信息提示的数据库文件）。如果DBCC CHECKDB报错，在你修复错误之前纠正这些错误。如果这些错误信息一直保留到执行DBCC CHECKDB运行之后，或者DBCC CHECKDB没有报告任何错误，检查WINDOWS NT系统的的事件查看器的和系统错误或磁盘错误相关的信息。你也可以联系硬件厂商运行正确的诊断工具。</p><p><br />　　坏了:-(，数据库文件有问题，在检查OS的事件查看器，我们发现在一个星期之前就有错误信息（只是OFFSET的偏移地址不同）。</p><p>　　赶紧检查HDD,果然发现在RAID5的第一快HDD亮了红灯（灰尘太多，很难于看清）</p><p>执行 <strong><font color="#dd6d22">DBCC CHECKDB('POS_DB')</font></strong>检查发现：<br /><font color="#ff0000">Server: Msg 8909, Level 16, State 1, Line 1<br />Table error: Object ID 26342838, index ID 35207, page ID (1:50978). The PageId in the page header =(32230:-2048732002).</font></p><font color="#ff0000"><p><br />Server: Msg 8939, Level 16, State 1, Line 1<br />Table error: Object ID 859150106, index ID 255, page (1:238770). Test (IS_ON (BUF_IOERR, bp-&gt;bstat) &amp;&amp; bp-&gt;berrcode) failed. Values are 2057 and -1.</p><p><br />Server: Msg 8928, Level 16, State 1, Line 1<br />Object ID 861246123, index ID 0: Page (1:57291) could not be processed. See other errors for details.</p><p><br />Server: Msg 2511, Level 16, State 1, Line 1<br />Table error: Object ID 862626116, Index ID 0. Keys out of order on page (1:269310), slots 0 and 1.<br /></p></font>啊哈，果然有很多的表都有错误关联（请记录每一个错误表的OBJECT ID)<br />从MSDN查到：<br />错误号Msg 823:表示SQLSERVER在读取数据和写数据时检测到硬件设备有问题或者系统有问题。<br />TORN PAGE:的意思是不完整的页<br />0x0000001bf96000：这是从数据文件开始处到TORN PAGE 的字节数。<br />错误号Msg 8939 ：大家可以看看：<a href="http://support.microsoft.com/default.aspx?kbid=320434"><font color="#163498">http://support.microsoft.com/default.aspx?kbid=320434</font></a><br />FIX：在运行 CHECKDB 时，具有 TABLOCK 提示的大容量插入（bulk insert, bcp 等）可能导致错误 8929 和 8965<br />错误号MSG 8928:是和8939相关联的信息，<br />错误号MSG 8965:是和8939相关联的信息，<p>大家可以到下面的地址找到相关的信息：<br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;826433"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;826433</font></a><br />PRB: Additional SQL Server Diagnostics Added to Detect Unreported I/O Problems<br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;828339"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;828339</font></a><br />PRB: Error message 823 may indicate hardware problems or system problems<br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;308795"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;308795</font></a><br />FIX: CheckDB May Not Fix Error 8909 or Error 8905</p><p>故障确诊：RAID有一块HDD坏，造成数据库文件破坏</p><p><font size="4"><strong>2.更换HDD</strong></font><br />2003－12－28 23:00<br />现在就体现了RAID5的好处，坏了一块HDD，系统可以照常运行，不过系统的日志和SQLSERVER的日志还是有MSG823的报错信息。<br />按照RAID 卡的REBUILD的步骤将新的HDD绑定到原始的RAID5中，顺利完成:-)<br />用DBCC检查数据库的完整性<br /><strong><font color="#dd6d22">DBCC CHECKDB('POS_DB') WITH ALL_ERRORMSGS</font></strong><br />发现还是有和更换HDD之前一样的ERROR信息，看来数据库文件还是有问题。</p><p>--有一个奇怪问题1，既然是5块HDD的RAID5，为何有一块HDD坏会影响数据库文件的损坏，不解？？？:-(</p><p><font size="4"><strong>3.恢复数据库<br /></strong></font>2003－12－29 00:30<br />没有办法，用备份的数据集恢复数据库（看来备份是多么的重要）<br /><font color="#dd6d22"><strong>USE MASTER<br />GO<br />RESTORE DATABASE POS_DB FROM DISK='D:\DATABASEBACKUP\POS_DB_BACKUP.DAT'<br /></strong></font>重新启动MSSQLSERCVER服务，<br /><font color="#dd6d22"><strong>NET STOP MSSQLSERVER / NET START MSSQLSERVER<br /></strong></font>用DBCC检查数据库的完整性<br /><font color="#dd6d22"><strong>DBCC CHECKDB('POS_DB') WITH ALL_ERRORMSGS </strong></font></p><p>和恢复之前的错误信息一致，没有改变。<br />--奇怪问题之2，SQLSERVER BACKUP 之前并不验证数据库的完整性，数据库的全备份竟然是有问题的。气愤！！</p><p>看来只能通过工具修复数据库了（--在修改之前记录错误表的记录数，以便修复数据库后进行比较）。<br />在查询分析器中运行：<br /><font color="#dd6d22"><strong>ALTER DATABASE POS_DB SET SINGL_USER<br />GO<br />DBCC CHECKDB('POS_DB',repair_allow_data_loss) WITH TABLOCK<br />GO<br />ALTER DATABASE POS_DB SET MULTI_USER<br />GO</strong></font></p><p><strong>CHECKDB 有3个参数:</strong><br />REPAIR_ALLOW_DATA_LOSS <br />执行由 REPAIR_REBUILD 完成的所有修复，包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。修复完成后，备份数据库。 <br />REPAIR_FAST 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。这些修复可以很快完成，并且不会有丢失数据的危险。 <br />REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复，包括需要较长时间的修复（如重建索引）。执行这些修复时不会有丢失数据的危险。 </p><p></p><p>第一次运行，我们会发现：<br /><font color="#ff0000">DBCC results for 'TABLE_NAME'.<br />There are 1 rows in 1 pages for object 'TABLE_NAME'.<br />The error has been repaired.<br />CHECKDB found 0 allocation errors and 1 consistency errors in table '(Object ID 26342838)' (object ID 26342838).<br />CHECKDB fixed 0 allocation errors and 1 consistency errors in table '(Object ID 26342838)' (object ID 26342838).<br /></font>这样的信息有很多，并且有“The error has been repaired”的提示。不过到最后还是有这样的信息：<br /><font color="#ff0000">CHECKDB found 0 allocation errors and 19 consistency errors in database 'POS_DB'.<br />CHECKDB fixed 0 allocation errors and 19 consistency errors in database 'POS_DB'.<br /></font>再次运行，还是有同样的错误。糟糕:=)看来这种方式是无法修复这样测错误。</p><p>失败！！！</p><p>再仔细看看SQLSERVER BOL发现CHECKDB还有一个非常有用的参数PHYSICAL_ONLY</p><p>PHYSICAL_ONLY<br />仅限于检查页和记录标题物理结构的完整性，以及页对象 ID 和索引 ID 与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性，同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGS，并且不能与任何修复选项一起使用。</p><p><br />再次运行：<br /><strong><font color="#dd6d22">DBCC CHECKDB('POS_DB') with NO_INFOMSGS,PHYSICAL_ONLY<br /></font></strong>然后再运行：<br /><strong><font color="#dd6d22">DBCC CHECKDB('POS_DB',repair_allow_data_loss) WITH TABLOCK<br /></font></strong>这次会返回一些8952.8956的错误信息:<br /><font color="#ff0000">Server: Msg 8952, Level 16, State 1, Line 1<br />Table error: Database 'POS_DB', index 'POS_REFER.Idx2_POS_REFER' (ID 861246123) (index ID 2). Extra or invalid key for the keys:</font></p><p><font color="#ff0000"><br />Server: Msg 8956, Level 16, State 1, Line 1<br />Index row (1:26315:23) with values (PLU_ID = '6922825200240' and PRD_AGGR_ID = 10006 and EVNT_ID = NULL and RGST_MDE = 0 and SUBPRD_NBR = 0 and STR_ID = 12 and PRD_AGGR_ID = 10006 and SUBPRD_NBR = 0 and STR_ID = 12 and PLU_ID = '6922825200240' and EVNT_ID = NULL and RGST_MDE = 0) points to the data row identified by ().</font></p><p>根据MSDN上的说明：<br />This problem does not cause any data or index corruption. The problem is in the metadata which is corrected only by dropping and re-creating the indexes. <br />这些问题不会引起数据或索引的损坏，这些问题的元数据是正确的，只是删除再重新建立索引。<br />看来问题是修改了。</p><p><br />再次运行DBCC CHECKDB('POS_DB'),再次运行:DBCC CHECKDB('POS_DB'),message没有错误信息。</p><p>ok成功修复:-)</p><p><br /><font size="4"><strong>4.检查修复后的数据库并且备份数据库</strong></font><br />检查DBCC CHECKDB报错的相关表，和没有执行DBCC之前的记录数进行比较，发现有一个表少了40条记录。郁闷:- </p><p><strong><font size="4">5.总结</font></strong></p><p>1.RAID5并不能保证SQLSERVER 2000 数据库的数据文件的完整性；<br />2.SQLERVER 2000的备份程序不验证数据库文件的数据完整性；如果你的数据文件有问题，备份时也不图示；<br />3.DBCC CHECKDB的repair_allow_data_loss并不是非常安全的，不能修复所有的错误，即使是对不完整页（TORN PAGE）的修复也会着成数据丢失；<br />4.DBCC CHECKDB的REPAIR_ALLOW_DATA_LOSS参数无法修复所有的错误;</p><p><strong>参考文章:<br /></strong><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;298806"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;298806</font></a><br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;284440"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;284440</font></a><br /><a href="http://support.microsoft.com/default.aspx?kbid=320434"><font color="#163498">http://support.microsoft.com/default.aspx?kbid=320434</font></a><br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;828339"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;828339</font></a><br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;308795"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;308795</font></a><br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;826433"><font color="#163498">http://support.microsoft.com/default.aspx?scid=kb;en-us;826433</font></a><br /><br />-----------------------------------------------------------------------------------------------------------------<br /></p><p>EXECUTE master.dbo.xp_sqlmaint N'-PlanID 4F597334-7ABF-4140-8DF3-2CE11E9CE6C2 -Rpt "E:\DATABASE\数据库维护计划14.txt"  -BkUpMedia DISK -BkUpDB "E:\DATABASE" -BkExt "BAK"'</p><p><font color="#ff0000">数据库全备份也成功了</font></p><p><br />Microsoft (R) SQLMaint 实用工具（Unicode），版本 登录到 SQL Server“P4”以“NT AUTHORITY\SYSTEM”（受信任）身份<br />开始维护计划“数据库维护计划1”（在 2005-7-6 15:56:31 上）<br />[1] 数据库 OTSP库 备份...<br />    目的: [E:\DATABASE\OtSpOnline_db_200507061556.BAK]</p><p>    ** 执行时间: 0 小时，2 分钟，30 秒 **</p><p>结束维护计划“数据库维护计划1”（在 2005-7-6 15:59:01 上）<br />SQLMAINT.EXE 进程退出代码: 0 (成功)<br /><br /><br />------------------------------------------------------------------------------------------------------------<br /><br /></p><p><font color="#ff0000">执行下面的数据库维护计划</font></p><p>EXECUTE master.dbo.xp_sqlmaint N'-PlanID DB9949C7-4262-46EF-A16E-B5A16E9455CC -Rpt "E:\db_bak\数据库维护计划-Tonychen-200507022.txt" -DelTxtRpt 1WEEKS -WriteHistory  -CkDBRepair  '</p><p><font color="#ff0000">错误日志如下：</font><br />Microsoft (R) SQLMaint 实用工具（Unicode），版本 登录到 SQL Server“SPSERVER”以“SPSERVER\Administrator”（受信任）身份<br />开始维护计划“数据库维护计划-Tonychen-20050702”（在 2005-7-6 11:32:32 上）<br />[1] 数据库 OtSp: 检查数据链接...<br />[Microsoft SQL-DMO （ODBC SQLState: 42000）] 错误 8906: [Microsoft][ODBC SQL Server Driver][SQL Server]扩展盘区 (3:10487)（属于数据库 ID 7）在 SGAM (3:3) 和 PFS (3:8088) 中进行了分配，但未在任何 IAM 中进行过分配。PFS 标志 'MIXED_EXT ALLOCATED   0_PCT_FULL'。<br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现了 1 个分配错误和 0 个一致性错误（在表 'WWCHAT_SUB_Around' 中，该表的对象 ID 为 1214627370）。<br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现了 1 个分配错误和 0 个一致性错误（在数据库 'OtSp' 中）。<br />[Microsoft][ODBC SQL Server Driver][SQL Server]repair_allow_data_loss 是最低的修复级别（对于由 DBCC CHECKDB (OtSp noindex) 发现的错误而言）。</p><p>    发现下列错误:</p><p>[Microsoft][ODBC SQL Server Driver][SQL Server]扩展盘区 (3:10487)（属于数据库 ID 7）在 SGAM (3:3) 和 PFS (3:8088) 中进行了分配，但未在任何 IAM 中进行过分配。PFS 标志 'MIXED_EXT ALLOCATED   0_PCT_FULL'。<br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现了 1 个分配错误和 0 个一致性错误（在表 'WWCHAT_SUB_Around' 中，该表的对象 ID 为 1214627370）。<br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现了 1 个分配错误和 0 个一致性错误（在数据库 'OtSp' 中）。<br />[Microsoft][ODBC SQL Server Driver][SQL Server]repair_allow_data_loss 是最低的修复级别（对于由 DBCC CHECKDB (OtSp noindex) 发现的错误而言）。<br />    ** 执行时间: 0 小时，0 分钟，41 秒 **</p><p>[2] 数据库 otspbak: 检查数据链接...</p><p>    ** 执行时间: 0 小时，0 分钟，4 秒 **</p><p>正在删除旧的文本报告...   已删除 0 个文件。</p><p>结束维护计划“数据库维护计划-Tonychen-20050702”（在 2005-7-6 11:33:17 上）<br />SQLMAINT.EXE 进程退出代码: 1 (失败)<br /><br /><font color="#ff0000">解决方法：</font><br />alter database otsponline set single_user --切换到单用户模式下<br />dbcc checkdb('otsp',repair_allow_data_loss) WITH TABLOCK -- 进行数据库修复<br />alter database otsponline set multi_user --切换回到多用户模式下<br /><br /><br /><font color="#ff0000">重新执行数据库维护计划：</font><br />EXECUTE master.dbo.xp_sqlmaint N'-PlanID DB9949C7-4262-46EF-A16E-B5A16E9455CC -Rpt "E:\db_bak\数据库维护计划-Tonychen-200507022.txt" -DelTxtRpt 1WEEKS -WriteHistory  -CkDBRepair  '<br /><br /><br /><font color="#ff0000">事务日志正确：</font><br /><br />Microsoft (R) SQLMaint 实用工具（Unicode），版本 登录到 SQL Server“P4”以“NT AUTHORITY\SYSTEM”（受信任）身份<br />开始维护计划“数据库维护计划1”（在 2005-7-6 15:53:49 上）<br />[1] 数据库 OTSP: 检查数据链接...</p><p>    ** 执行时间: 0 小时，1 分钟，34 秒 **</p><p>结束维护计划“数据库维护计划1”（在 2005-7-6 15:55:23 上）<br />SQLMAINT.EXE 进程退出代码: 0 (成功)<br /></p><img src ="http://www.blogjava.net/xine/aggbug/49692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:49 <a href="http://www.blogjava.net/xine/articles/49692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server技巧</title><link>http://www.blogjava.net/xine/articles/49682.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49682.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49682.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49682.html</trackback:ping><description><![CDATA[1.把某个字段重新生气序列(从1到n):<br />DECLARE @i int<br />Set @i = 0<br />Update Table1 Set @i = @i + 1,Field1 = @i<br /><br />2.按成绩排名次<br />Update 成绩表<br />Set a.名次 = (<br />Select Count(*) + 1<br />From 成绩表 b<br />Where a.总成绩 &lt; b.总成绩<br />)<br />From 成绩表 a<br /><br />3.查询外部数据库<br />Select a.*<br />From OpenRowSet('Microsoft.Jet.OLEDB.4.0','c:\test.mdb';'admin';',Table1) a<br /><br />4.查询Excel文件<br />Select * <br />From OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1＄<br /><br />5.在查询中指定排序规则<br />Select * From Table1 Order By Field1 COLLATE Chinese_PRC_BIN<br />为什么要指定排序规则呢?参见:<br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blogcn.com/images/aurl.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" align="absBottom" border="0" /><a href="http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985" target="_blank"><font color="#002c99">http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985</font></a><br />例,检查数据库中的Pub_Users表中是否存在指定的用户:<br />Select Count(*) From Pub_Users Where [UserName]='admin' And [PassWord]='aaa' COLLATE Chinese_PRC_BIN<br />默认比较是不区分大小写的,如果不加COLLATE Chinese_PRC_BIN,那么密码aaa与AAA是等效的,这当然与实际不符.注意的是,每个条件都要指定排序规则,上例中用户名就不区分大小写.<br /><br /><br />6.Order By的一个小技巧<br />Order By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)<br />Select a.ID,a.Name,(Select Count(*) From TableB b Where a.ID=b.PID) From TableA a Order By 3<br /><br /><font class="diary_poster"><!--子菜单开始--><div id="blog_sub_st"> </div></font><img src ="http://www.blogjava.net/xine/aggbug/49682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:41 <a href="http://www.blogjava.net/xine/articles/49682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 分页过程</title><link>http://www.blogjava.net/xine/articles/49681.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49681.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49681.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49681.html</trackback:ping><description><![CDATA[SQL Server 分页过程<br /><br /><p>-----------------------------------------------------<br />-- Export file for user SA                         --<br />-- Created by Administrator on 2005-1-30, 18:05:12 --<br />-----------------------------------------------------</p><p>spool asdsd.log</p><p>prompt<br />prompt Creating table TEST<br />prompt ===================<br />prompt<br />create table TEST<br />(<br />  NAME   VARCHAR2(20),<br />  PASSWD VARCHAR2(20)<br />)<br />tablespace USERS<br />  pctfree 10<br />  initrans 1<br />  maxtrans 255<br />  storage<br />  (<br />    initial 64K<br />    minextents 1<br />    maxextents unlimited<br />  );</p><p>prompt<br />prompt Creating package DOTNET<br />prompt =======================<br />prompt<br />create or replace package DotNet as</p><p>  TYPE type_cur IS REF CURSOR;     --定义游标变量用于返回记录集</p><p>  PROCEDURE DotNetPagination(<br />  Pindex in varchar2,                --分页索引<br />  Psize in varchar2,                 --页面大小<br />  Psql in varchar2,                --产生dataset的sql语句<br />  Pcount out number,               --返回分页总数<br />  v_cur out type_cur               --返回当前页数据记录<br />  );<br />  <br />  PROCEDURE DotNetPageRecordsCount(<br />  Psqlcount in varchar2,<br />  Prcount   out number<br />  );<br />  <br />end DotNet;<br />/</p><p>prompt<br />prompt Creating package PKG_TEST<br />prompt =========================<br />prompt<br />CREATE OR REPLACE PACKAGE pkg_test<br />AS<br />   TYPE myrctype IS REF CURSOR;</p><p>   PROCEDURE get (p_id in NUMBER, p_rc OUT myrctype);<br />END pkg_test;<br />/</p><p>prompt<br />prompt Creating package PKG_TEST_FUNCTION<br />prompt ==================================<br />prompt<br />create or replace package pkg_test_function as<br />/* 定义ref cursor类型 <br />    不加return类型，为弱类型，允许动态sql查询， <br />    否则为强类型，无法使用动态sql查询; <br />*/ <br />   type myrctype is ref cursor;  <br />   <br />--函数申明 <br />   function get(intID number) return myrctype; <br />end pkg_test_function;<br />/</p><p>prompt<br />prompt Creating procedure DOTNETPAGINATION<br />prompt ===================================<br />prompt<br />CREATE OR REPLACE PROCEDURE dotnetpagination (<br />      pindex   IN       number,<br />      psize    IN       number,<br />      psql     IN       VARCHAR2,<br />      pcount   OUT      NUMBER<br />   )<br />   IS<br />      v_sql     VARCHAR2 (1000);<br />      v_count   NUMBER;<br />      v_plow    NUMBER;<br />      v_phei    NUMBER;<br />   BEGIN<br />------------------------------------------------------------取分页总数<br />      v_sql := 'select count(*) from (' || psql || ')';</p><p>      EXECUTE IMMEDIATE v_sql<br />                   INTO v_count;<br />      pcount := CEIL (v_count / psize);<br />------------------------------------------------------------显示任意页内容<br />      v_phei := pindex * psize + psize;<br />      v_plow := v_phei - psize + 1;</p><p>   END dotnetpagination;<br />/</p><p>prompt<br />prompt Creating package body DOTNET<br />prompt ============================<br />prompt<br />CREATE OR REPLACE PACKAGE BODY dotnet<br />AS<br />--***************************************************************************************<br />   PROCEDURE dotnetpagination (<br />      pindex   IN       VARCHAR2,<br />      psize    IN       VARCHAR2,<br />      psql     IN       VARCHAR2,<br />      pcount   OUT      NUMBER,<br />      v_cur    OUT      type_cur<br />   )<br />   IS<br />      v_sql     VARCHAR2 (1000);<br />      v_count   NUMBER;<br />      v_plow    NUMBER;<br />      v_phei    NUMBER;<br />   BEGIN<br />------------------------------------------------------------取分页总数<br />      v_sql := 'select count(*) from (' || psql || ')';</p><p>      EXECUTE IMMEDIATE v_sql<br />                   INTO v_count;<br />      pcount := CEIL (v_count / psize);<br />------------------------------------------------------------显示任意页内容<br />      v_phei := pindex * psize + psize;<br />      v_plow := v_phei - psize + 1;<br />      --Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段<br />      v_sql :='select * from ('|| psql || ') where rownum between '|| v_plow || ' and ' || v_phei;</p><p>      OPEN v_cur FOR v_sql;<br />   END dotnetpagination;</p><p>--**************************************************************************************</p><p> procedure DotNetPageRecordsCount(<br />  Psqlcount in varchar2,<br />  Prcount   out number<br />  )<br />  as</p><p>   v_sql varchar2(1000);<br />   v_prcount number;</p><p>  begin</p><p>   v_sql := 'select count(*) from (' || Psqlcount || ')';<br />   execute immediate v_sql into v_prcount;<br />   Prcount := v_prcount;                  --返回记录总数</p><p>  end DotNetPageRecordsCount;</p><p> --**************************************************************************************<br />END dotnet;<br />/</p><p>prompt<br />prompt Creating package body PKG_TEST<br />prompt ==============================<br />prompt<br />CREATE OR REPLACE PACKAGE BODY pkg_test<br />AS<br />   PROCEDURE get (p_id in NUMBER, p_rc OUT myrctype)<br />   IS<br />      sqlstr   VARCHAR2 (500);<br />   BEGIN<br />      IF p_id = 0<br />      THEN<br />         OPEN p_rc FOR<br />            SELECT phone, msg_content, gateid<br />              FROM wwchat_del_log<br />             WHERE ROWNUM &lt; 100;<br />      ELSE<br />         sqlstr :=<br />            'SELECT phone,msg_content,gateid FROM wwchat_del_log where rownum&lt;100';</p><p>         OPEN p_rc FOR sqlstr USING p_id;<br />      END IF;<br />   END get;<br />END pkg_test;<br />/</p><p>prompt<br />prompt Creating package body PKG_TEST_FUNCTION<br />prompt =======================================<br />prompt<br />CREATE OR REPLACE PACKAGE BODY pkg_test_function<br />AS<br />--函数体<br />   FUNCTION get (intid NUMBER)<br />      RETURN myrctype<br />   IS<br />      rc       myrctype;                                 --定义ref cursor变量<br />      sqlstr   VARCHAR2 (500);<br />   BEGIN<br />      IF intid = 0<br />      THEN<br />         --静态测试，直接用select语句直接返回结果<br />         OPEN rc FOR<br />            SELECT phone, msg_content, gateid<br />              FROM wwchat_del_log<br />             WHERE ROWNUM &lt; 100;<br />      ELSE<br />         --动态sql赋值，用:w_id来申明该变量从外部获得<br />         sqlstr :=<br />            'select id,name,sex,address,postcode,birthday from student where id=:w_id';</p><p>         --动态测试，用sqlstr字符串返回结果，用using关键词传递参数<br />         OPEN rc FOR sqlstr USING intid;<br />      END IF;</p><p>      RETURN rc;<br />   END get;<br />END pkg_test_function;<br />/</p><img src ="http://www.blogjava.net/xine/aggbug/49681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:40 <a href="http://www.blogjava.net/xine/articles/49681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server数据库的备份和恢复措施</title><link>http://www.blogjava.net/xine/articles/49679.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49679.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49679.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49679.html</trackback:ping><description><![CDATA[
		<strong>一、备份数据库</strong>
		<br />
		<br />1、打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server<br />2、SQL Server组--&gt;双击打开你的服务器--&gt;双击打开数据库目录<br />3、选择你的数据库名称（如论坛数据库Forum）--&gt;然后点上面菜单中的工具--&gt;选择备份数据库<br />4、备份选项选择完全备份，目的中的备份到如果原来有路径和名称则选中名称点删除，然后点添加，如果原来没有路径和名称则直接选择添加，接着指定路径和文件名，指定后点确定返回备份窗口，接着点确定进行备份 <br /><br /><b>二、还原数据库</b><br /><br />1、打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server<br />2、SQL Server组--&gt;双击打开你的服务器--&gt;点图标栏的新建数据库图标，新建数据库的名字自行取<br />3、点击新建好的数据库名称（如论坛数据库Forum）--&gt;然后点上面菜单中的工具--&gt;选择恢复数据库<br />4、在弹出来的窗口中的还原选项中选择从设备--&gt;点选择设备--&gt;点添加--&gt;然后选择你的备份文件名--&gt;添加后点确定返回，这时候设备栏应该出现您刚才选择的数据库备份文件名，备份号默认为1（如果您对同一个文件做过多次备份，可以点击备份号旁边的查看内容，在复选框中选择最新的一次备份后点确定）--&gt;然后点击上方常规旁边的选项按钮<br />5、在出现的窗口中选择在现有数据库上强制还原，以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置（也可以指定自己的目录），逻辑文件名不需要改动，移至物理文件名要根据你所恢复的机器情况做改动，如您的SQL数据库装在D:\Program Files\Microsoft SQL Server\MSSQL\Data，那么就按照您恢复机器的目录进行相关改动改动，并且最后的文件名最好改成您当前的数据库名（如原来是bbs_data.mdf，现在的数据库是forum，就改成forum_data.mdf），日志和数据文件都要按照这样的方式做相关的改动（日志的文件名是*_log.ldf结尾的），这里的恢复目录您可以自由设置，前提是该目录必须存在（如您可以指定d:\sqldata\bbs_data.mdf或者d:\sqldata\bbs_log.ldf），否则恢复将报错<br />6、修改完成后，点击下面的确定进行恢复，这时会出现一个进度条，提示恢复的进度，恢复完成后系统会自动提示成功，如中间提示报错，请记录下相关的错误内容并询问对SQL操作比较熟悉的人员，一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误，数据库正在使用的错误您可以尝试关闭所有关于SQL窗口然后重新打开进行恢复操作，如果还提示正在使用的错误可以将SQL服务停止然后重起看看，至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复<br /><br /><b>三、收缩数据库</b><br /><br />一般情况下，SQL数据库的收缩并不能很大程度上减小数据库大小，其主要作用是收缩日志大小，应当定期进行此操作以免数据库日志过大<br />1、设置数据库模式为简单模式：打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器--&gt;双击打开数据库目录--&gt;选择你的数据库名称（如论坛数据库Forum）--&gt;然后点击右键选择属性--&gt;选择选项--&gt;在故障还原的模式中选择“简单”，然后按确定保存<br />2、在当前数据库上点右键，看所有任务中的收缩数据库，一般里面的默认设置不用调整，直接点确定<br />3、<font color="blue">收缩数据库完成后，建议将您的数据库属性重新设置为标准模式，操作方法同第一点，因为日志在一些异常情况下往往是恢复数据库的重要依据</font><br /><br /><b>四、设定每日自动备份数据库</b><br /><br /><font color="red">强烈建议有条件的用户进行此操作！</font><br />1、打开企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器<br />2、然后点上面菜单中的工具--&gt;选择数据库维护计划器<br />3、下一步选择要进行自动备份的数据--&gt;下一步更新数据优化信息，这里一般不用做选择--&gt;下一步检查数据完整性，也一般不选择<br />4、下一步指定数据库维护计划，默认的是1周备份一次，点击更改选择每天备份后点确定<br />5、下一步指定备份的磁盘目录，选择指定目录，如您可以在D盘新建一个目录如：d:\databak，然后在这里选择使用此目录，如果您的数据库比较多最好选择为每个数据库建立子目录，然后选择删除早于多少天前的备份，一般设定4－7天，这看您的具体备份要求，备份文件扩展名一般都是bak就用默认的<br />6、下一步指定事务日志备份计划，看您的需要做选择--&gt;下一步要生成的报表，一般不做选择--&gt;下一步维护计划历史记录，最好用默认的选项--&gt;下一步完成<br />7、完成后系统很可能会提示Sql Server Agent服务未启动，先点确定完成计划设定，然后找到桌面最右边状态栏中的SQL绿色图标，双击点开，在服务中选择Sql Server Agent，然后点击运行箭头，选上下方的当启动OS时自动启动服务<br />8、这个时候数据库计划已经成功的运行了，他将按照您上面的设置进行自动备份 <br /><br />修改计划：<br />1、打开企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器--&gt;管理--&gt;数据库维护计划--&gt;打开后可看到你设定的计划，可以进行修改或者删除操作 <br /><br /><b>五、数据的转移（新建数据库或转移服务器）</b><br /><br />一般情况下，最好使用备份和还原操作来进行转移数据，在特殊情况下，可以用导入导出的方式进行转移，这里介绍的就是导入导出方式，导入导出方式转移数据一个作用就是可以在收缩数据库无效的情况下用来减小（收缩）数据库的大小，本操作默认为您对SQL的操作有一定的了解，如果对其中的部分操作不理解，可以咨询动网相关人员或者查询网上资料<br />1、将原数据库的所有表、存储过程导出成一个SQL文件，导出的时候注意在选项中选择编写索引脚本和编写主键、外键、默认值和检查约束脚本选项<br />2、新建数据库，对新建数据库执行第一步中所建立的SQL文件<br />3、用SQL的导入导出方式，对新数据库导入原数据库中的所有表内容<img src ="http://www.blogjava.net/xine/aggbug/49679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:37 <a href="http://www.blogjava.net/xine/articles/49679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server“数据库维护计划”</title><link>http://www.blogjava.net/xine/articles/49678.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49678.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49678.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49678.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<font color="#004fc6">SQL Server“数据库维护计划” </font>
				</strong>
		</p>
		<p>
				<span class="main">
						<span class="myp111">
								<font id="zoom">作为网管员，无论其管理的网络的规模是大还是小，在日常的管理中除了维护网络平稳运行、及时排除网络故障、保护网络安全等工作以外，备份网络中关键数据也是其中的一个非常非常重要的工作环节。 网络中的各种故障无非就分两种：软件故障和硬件故障。对于“硬件故障”可以通过维修或更换硬件设备得到及时解决；对于“软件故障”则可以通过重新安装或升级软件、重做网络或应用软件系统等方法及时解决，而且用此方法来解决网络故障大多需要一些基础的、关键的数据支持才能得以恢复正常。但是，网络中诸如此类的关键数据(特别是“应用软件系统”中的关键数据)的损坏或丢失，绝大部分是无法恢复和弥补的。即使可以恢复部分数据，弥补它们所花费的代价(诸如时间、人力、财力、物力等)都可能远远超出了公司的承受能力。 <br /><br />所以说，注重数据的备份工作是网管员日常管理工作中的必须时刻关注的一项任务，也是必须周期性重复操作的一项工作。 <br /><br /><b>目录 <br /><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#1">现行备份策略</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#2">具体实现步骤</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#3">结束语</a></b><br /><br /><b><font color="#330099"><a name="1">现行备份策略</a></font></b><br /><br />我公司在组建局域网时，考虑到商业企业的特点，仔细考量了购、销、存三大环节中发生的各种数据及其存储问题后，选定了以Windows 2000 Server为操作系统，SQL Server 2000为数据库平台来搭建局域网的应用系统的软件平台，以网线为载体将购、销、存等核心部门的计算机通过局域网平台紧密地连接起来。这样，各个核心部门每天的任何一笔业务都及时地、动态地存储到公司局域网的核心Dell服务器上的SQL Server 2000数据库中，并以此为基础平台向各方提供所需的各种数据服务。 <br /><br />因此，自公司局域网开始正式运作之日起，作为网管员的我就非常注重对局域网中的关键数据——特别是这些业务数据的备份工作。同时，我也希望备份数据的软件能够实现以下自动功能。 <br /><br />功能1：能够在每天的某个固定的时刻(如夜晚0:00:00，当然这个时间是可以自主设定的)对包含所有业务数据库在内的所有关键数据库进行一次“完全备份”。 <br /><br />功能2：能够在每天的0:00:00至23:59:59这段时间内，每间隔1个小时对功能1中所涉及到的各个数据库的事务日志进行“差异备份”。 <br /><br />功能3：每天都能够保留功能1和功能2中所生成的数据库和事务日志的最近两天的备份(即：前一天的和前两天的)，而且能够自动地删除久于两天前的所有数据库和事务日志的备份。 <br /><br />功能4：定期(如每个星期一次)将所有关键数据库的完全备份的副本备份到磁带或其它存储介质上(这部分工作可能需要手工完成)。 <br /><br />于是，围绕这些功能的实现，在日常管理工作中，我尽可能地尝试了各种备份数据的软件和方法，如Windows 2000自带的“备份”工具、SQL Server 2000自带的“备份”功能等。这些备份软件和方法的功能各有千秋，但是都存在以下缺点： <br /><br />一种就是需要人工干预，无法实现自动备份(如Windows 2000自带的“备份”工具)。如果采用这种方法，就必须时刻人工手动备份，万一哪天因为出差或其它原因没有进行备份，而这时又出现服务器或数据故障的话，那麻烦就大了。 <br /><br />另一种就是能够实现自动备份，但是旧的备份不能被自动地删除(如SQL Server 2000自带的“备份”功能)。如果采取这种方法，就必须及时地手工删除旧的备份，否则再大的硬盘也会迅速地被用完。 <br /><br />在相互比较后，我还是决定采用第二种——SQL Server 2000自带的“备份”功能对关键数据库进行备份，因为它能够实现“自动备份”功能，比第一种略强。所以，在一段时期内，我每天上班后的第一件事就是先检查一下备份目录下各种数据的新的备份，然后手工删除旧的备份数据。这种做法一度让我很是苦恼。 <br /><br />一天，我在利用SQL Server 2000的“帮助”查询某个Transact-SQL语句的语义解释时无意中阅读到“自动化管理任务”的内容。从头到尾地仔细阅读后，我不由得眼睛一亮，原来SQL Server 2000本身自带了一个能够实现我的备份要求的、强大的功能——“数据库维护计划”。于是我立刻按照这部分内容的提示，以一个数据库为试验样本一步一步地操作，成功地创建了一个数据库维护计划。经过一个星期的试运行，这个计划果然能够实现自动备份调度，以及自动删除旧的数据备份，完全能够满足我的备份要求。 <br /><br />从那时起，我就利用SQL Server 2000的“数据库维护计划”备份所有关键数据库，而且严格地、定期地执行功能4，每个星期五将完全备份的数据库备份到磁带和局域网中其它客户机(主要是用于网络管理的网管PC)的硬盘上。这样做的目的是，能同时异地保存三份相同的备份，减少故障带来的损失。 <br /><br />而且，通过SQL Server 2000的“数据库维护计划”，我现在能够较轻松地备份所需各种数据，方便地管理其备份，相应地减少了日常工作量，也减轻了部分工作压力。 <br /><br /><b><fon color="#330099"><a name="2">具体实现步骤</a></fon></b></font>
								<br />
								<br />
								<b>目录 <br /><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#20">第一步：打开SQL Server“企业管理器”窗体</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#21">第二步：找到“数据库维护计划”功能</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#22">第三步：创建“数据库维护计划”</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#23">第四步：维护和管理“数据库维护计划”</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#24">第五步：启动SQL Server 2000代理以便执行“作业”</a><br /><a href="http://tech.ccidnet.com/pub/article/c1106_a76579_p1.html#25">第六步：检查结果</a></b>
								<br />
								<br />“数据库维护计划”功能在SQL Server 2000的“企业管理器”中可以找到。 <br /><br />说明： <br /><br />1.以下操作是在服务器的Windows 2000 Server上进行操作的。在Window 9X系统上操作相同。 <br /><br />2.由于SQL Server 2000执行备份时将产生许多文件(特别是在进行事务日志备份时)，所以建议按数据库名称分别建立独立的备份目录进行存储。 <br /><br />3.以下所有操作过程当中一般不会对数据库的使用产生影响。 <br /><br /><b><a name="20">第一步：打开SQL Server“企业管理器”窗体</a></b><br /><br />用鼠标单击任务栏上的“开始”按钮中的“程序(P)”菜单下的“Microsoft SQL Server”子菜单中的“企业管理器”菜单项，即可打开SQL Server 2000的“企业管理器”窗体。 <br /><br /><b><a name="21">第二步：找到“数据库维护计划”功能</a></b><br /><br />在“企业管理器”窗体中左侧的树型选项卡中，用鼠标单击“+”图标扩展开“控制台根目录”下的“Microsoft SQL Servers”，可以看到其下有一个“SQL Server组”；接着继续扩展开“SQL Server组”，此时可以看到其下出现了服务器的名称(图1中的“JXNC-SERVER”就是我的服务器的名称)；再继续扩展开此服务器，可以看到其下列出了诸如“数据库”、“数据转换服务”等项目；最后单击“管理”项目，可以看到其下存在一个“数据库维护计划”(如图1)。 <br /><br /></span>
				</span>
		</p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113441734.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图1</center>
		<p>
				<br />
				<br />单击“数据库维护计划”项目，在“企业管理器”窗口右侧将会显示出已经存在的维护计划项目。每个维护计划均包括以下项目： <br /><br />1.名称：就是维护计划的名称。此名称可以自定义，中英文皆可。 <br /><br />2.数据库：就是维护计划所进行维护的数据库的名称。 <br /><br />因为一个维护计划允许同时维护多个数据库，所以此处可以显示出多个数据库的名称(在图1中可以看到名为“系统数据库备份”的数据库维护计划中的“数据库”就包括三个数据库：master、model和msdb)。 <br /><br />3.服务器：也就是维护计划所维护的数据库所处的服务器的名称。“(local)”表示是本地服务器。 <br /><br />4.对策：是指维护计划所需要进行的具体维护工作的内容。 <br /><br />图1中有3个“数据库维护计划”均为“数据库备份，事务日志备份”，它的含义就是这些维护计划中同时对所指定的数据库进行“数据库”和“事务日志”的备份。 <br /><br /><b><a name="22">第三步：创建“数据库维护计划”</a></b><br /><br />鼠标右击“数据库维护计划”项目，选择“新建维护计划(P)”功能，将打开“数据库维护计划向导”窗体，依照此向导能够创建一个新的“数据库维护计划”。 <br /><br />步骤1：单击 “下一步(N)”按钮，打开“选择数据库”窗体(如图2)。在此窗体中可以选定一个或多个的数据库作为操作对象。为了叙述方便，我在此只选择了一个数据库“regie”。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113441580.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图2</center>
		<p>
				<br />
				<br />步骤2：单击图2中的“下一步(N)”按钮，打开“更新数据优化信息”窗体(如图3)。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113442621.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图3</center>
		<p>
				<br />
				<br />在此窗体中可以对数据库中的数据和索引重新进行组织，以及能够设定在满足一定条件的情况下，维护计划自动删除数据库中的未使用的空间，以便提高性能。 <br /><br />但要注意的是，在此窗体中，只要选定了“重新组织数据和索引页[R]”复选框，“更新查询优化器所使用的统计。示例[D]”复选框将失效(变成灰色，不能选择)。而且“重新组织数据和索引页[R]”复选框和“从数据库文件中删除未使用的空间[M]”复选框二者只要有一个被选中，其下的“调度[S]”功能才有效。单击“更改[C]”按钮可以对“调度”进行自定义。 <br /><br />各位读者可以根据自身情况决定是否选用其中的功能。当然也可以通过单击“帮助”按钮来查看各功能的具体含义。 <br /><br />在此窗体中能够便捷地设定每项作业的持续运行时间和运行的频率。完成自己的设置后，一定要选定右上角的“启用调度[B]”复选框，这样一个作业调度才算真正完成了。 <br /><br />步骤3：单击图3中的“下一步(N)”按钮，打开“检查数据库完整性”窗体。 <br /><br />在此窗体中可以设定维护计划在备份数据库前自动检查数据库的完整性，以便检测由于硬件或软件错误而导致数据的不一致。在此窗体中只有先选定了“检查数据库完整性[H]”复选框，其下的“备份之前执行这些检查[R]”和“调度[S]”功能才有效。单击“更改[C]”按钮可以对“调度”进行自定义。 <br /><br />各位读者可以自主决定，较好的一种做法就是选中“检查数据库完整性[H]”复选框(推荐，因为有可能会修正一些错误)。 <br /><br />步骤4：在“检查数据库完整性”窗体中的“下一步(N)”按钮，打开“指定数据库备份计划”窗体。 <br /><br />如需对数据库进行备份，则必须选定“作为维护计划的一部分来备份数据库[A]”复选框，而且必须指定存储备份文件的位置：磁带[P]或磁盘[K]。 <br /><br />如果选择“磁盘[K]”作为数据库备份的位置，设定“调度”后单击“下一步(N)”按钮则显示“指定备份磁盘目录”窗体(如图4)。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113442360.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图4</center>
		<p>
				<br />
				<br />在图4中，可以具体指定存储备份文件的目录(可以使用默认的目录，也可自定义)、备份文件扩展名，而且能够指示备份计划自动地删除早于某个时间(图4中设定的是“2天”，也就是说两天前的所有备份文件将被自动地删除，只留下最近两天的备份)的备份文件。而图4中的“为每个数据库创建子目录[C]”功能只是在步骤1中选择了多个数据库时才有用，对于一个数据库作用不大。设定后，单击“下一步(N)”按钮则显示“指定事务日志备份计划”窗体。 <br /><br />如果选择“磁带[P]”作为数据库备份的位置，设定“调度”后单击“下一步(N)”按钮则直接显示“指定事务日志备份计划”窗体。 <br /><br />步骤5：指定“事务日志备份计划”的过程与步骤4的过程完全相同，只是在设定“调度”上稍有差别(因为我的要求是数据库每天备份一次，事务日志每1小时备份一次)。 <br /><br />步骤6：对事务日志的备份计划全部设定后，单击“下一步(N)”按钮则显示“要生成的报表”窗体。 <br /><br />在此窗体中可以指定用于存放整个备份计划执行过程中的日志的目录。设定过程与图4的操作及其相似。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113443371.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图5</center>
		<p>
				<br />
				<br />步骤7：完成步骤6后，单击“下一步(N)”按钮则显示“维护计划历史纪录”窗体。 <br /><br />在此窗体中可以指定如何存储此维护计划的历史纪录(是存放在“本地服务器”上，还是在“远程服务器”上)，而且通过指定表中的行数可以限定历史纪录的存储大小。 <br /><br />步骤8：完成步骤7后，单击“下一步(N)”按钮则显示“正在完成数据库维护计划向导”窗体(如图5)。 <br /><br />在此窗体中可以自定义一个“计划名[P]”(推荐，这样便于管理和识别)，当然也可使用默认的“计划名[P]”。而且还可以通过对“计划名[P]”下的文本框中的内容进行确认，如有误，则可通过单击窗体中的“上一步[B]”按钮退回到相应的窗体进行修改。 <br /><br />步骤9：完成步骤8后，单击“完成”按钮，则显示“维护计划已创建成功。”的提示框，再单击 “确定”按钮即成功地设定了一个新的数据库维护计划。 <br /><br />从图6中可以看到，已经成功的创建了一个新的数据库维护计划——“regie备份”。 <br /><br /><b><a name="23">第四步：维护和管理“数据库维护计划”</a></b><br /><br />第三步完成后，对各个“数据库维护计划”的日常维护和管理都非常方便，只需要双击“数据库维护计划”即可对第三步中所涉及的内容进行变更、修正。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113444797.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图6</center>
		<p>
				<br />
				<br />如图6所示，鼠标右击“regie备份”，单击“属性[R]”，或者直接双击“regie备份”，打开“数据库维护计划”窗体。在此窗体中集成了第三步中涉及到的所有功能，每项功能都能任意修改，修改过程与第三步中的相应步骤一样。 <br /><br />但需要说明的是，在设定图7中的“报表”选项卡下的“文本报表”中的“删除早于此时间的文本报表文件[F]”选项时，也就是第三步中的步骤6中的内容，无论您将其设定成“分钟”、“小时”、“天”，还是“月”，创建成功后都将被自动地更正为“周”，而且以后无论如何修改，保存后再去查看时它仍将显示为“周”，但不意味着其它选项无效，其它选项仍然有效。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113444112.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图7</center>
		<p>
				<br />
				<br />
				<b>
						<a name="24">第五步：启动SQL Server 2000代理以便执行“作业”</a>
				</b>
				<br />
				<br />完成第三步后，还需启动SQL Server 2000 Agent(代理)，以便执行“数据库维护计划”作业。 <br /><br />与展开SQL Server 2000“数据库维护计划”的步骤一样，在“管理”项目中，可以发现存在一个“SQL Server 代理”(如图8)。 <br /><br /></p>
		<center>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113445784.gif" onload="javascript:if(this.width&gt;500)this.style.width=500;" />
				<br />
				<br />图8</center>
		<p>
				<br />
				<br />单击“SQL Server 代理”下的“作业”子菜单，在“企业管理器”窗口右侧将会显示出已经存在的作业项目(在图8中可以看到已经存在17个作业项目)。每个作业项目均包括以下数据列： <br /><br />1.名称：当然是指作业的名称，可以自定义，中英文皆可。为了理解方便，建议用中英文结合。 <br /><br />每当新建立一个“数据库维护计划”，将自动生成以下默认名称的作业： <br /><br />(1)当新建的“数据库维护计划”中设定了“备份数据库”功能时，将生成默认名为“DB 维护计划‘******’的 DB 备份作业”的作业。 <br /><br />(2)当新建的“数据库维护计划”中设定了“备份事务日志”功能时将生成默认名为“DB 维护计划‘******’的 事务日志备份作业(多服务器)”的作业。 <br /><br />以上(1)和(2)中的“******”处将显示“数据库维护计划”中的“计划名”(也就是第三步步骤8中设定的“计划名”)。 <br /><br />2.分类：指明该作业当前所属的类别。缺省值为“[未分类(本地)]”。 <br /><br />3.启用：指明该作业是否处于“启用”状态。 <br /><br />4.可运行：指明该作业是否处于“可运行”状态。 <br /><br />5.已调度：指明该作业是否处于“已调度”状态。 <br /><br />6.状态：指明该作业当前的运行状态—不在运行、正在运行。 <br /><br />7.上次运行状态(开始日期)：显示最近一次运行该作业后的状态(“已成功”、“失败”，还是“未知”)，和运行时的日期和时间。 <br /><br />8.下次运行日期：指明下一次运行该作业的日期和时间。 <br /><br />如图8所示，鼠标右击“regie完全备份”作业，单击“属性[R]”，或者直接双击“regie完全备份”作业，打开作业的“属性”窗体。在此窗体中集成了该作业的详细的配置项。每个配置项都能任意修改。“属性”窗体中有四个选项卡： <br /><br />◆ 常规：在此选项卡中可以重新设定作业名称(“名称[N]”文本框)、修改作业的分类(“分类[Y]”下拉框)、指定作业的所有者(“所有者[W]”下拉框)、简单地对作业进行描述(“描述[R]”文本框)，以及决定是否启用此作业(“启用[E]”复选框)。 <br /><br />◆ 步骤：在此选项卡中可以新建、插入新的步骤，删除、编辑已有的步骤。 <br /><br />单击“编辑[E]”按钮，在“编辑作业步骤”窗体中的“常规”选项卡中的“命令[M]”文本框中可以查阅到该作业的执行语句。 <br /><br />◆ 调度：在此选项卡中可以新建调度、新建警报，删除、编辑已有的调度。 <br /><br />◆ 通知：在此选项卡中可以设定作业完成时(即当作业成功时、作业失败时)执行的操作，即发送电子邮件、传呼操作员、发出网络警报信息、写入Windows应用程序事件日志、自动删除等操作。 <br /><br /><b><a name="25">第六步：检查结果</a></b><br /><br />经过上述五个步骤后，一个完整的备份数据库的计划就建立起来了。可以通过“资源管理器”来检查备份目录下是否存在相应地备份文件。 <br /><br />经过长时间的使用，如果以“保留2天的数据库完全备份和2天的每个一小时的事务日志备份”的备份策略来正确地建立了一个完整的数据库维护计划的话，无论何时查看相应备份目录下的文件，都应该存在102个文件： <br /><br />◆2个数据库的完整备份，即2个以“数据库名_db_yyyy mmddhhss.bak”格式为文件名的文件； <br /><br />◆ 3个与数据库完整备份相对应的操作过程的记录报告文件，即以“数据库名”+“备份4_yyyymmddhhss.txt” 格式为文件名的文件； <br /><br />◆ 48个事务日志的差异备份，即2天各24个以“数据库名_tlog_yyyymmddhhss.trn”格式为文件名的文件； <br /><br />◆ 49个与事务日志的差异备份对应的操作过程的记录报告文件，即以“数据库名”+“备份6_yyyymmddhhss.txt” 格式为文件名的文件。 <br /><br />以上文件名中，“数据库名”为第三步的步骤一中选定的数据库的名称；“yyyymmddhhss”是时间戳，其格式为：“yyyy”指“年”(4位数值)，“mm”指“月”(2位数值，不足2位的补“0”)，“dd”指“日”(2位数值，不足2位的补“0”),“hh”指“时”(2位数值，不足2位的补“0”)，“ss”指“分”(2位数值，不足2位的补“0”)。 <br /><br /><b><font color="#330099"><a name="3">结束语</a></font></b><br /><br />对于一个企业而言，日常运作中发生的各种业务所产生的所有数据，经过计算机不断地日积月累，逐渐成为公司的一种财富和资本。利用计算机，可以便捷地统计分析部分或全部的数据，通过各种形式的反馈(如图表、表格等)，给公司的决策层用于参考，便于为公司的今后决策提供指导和帮助。正基于此，这些数据的价值随着时间的延续正呈现出几何速度的增长。因此我认为，对于数据的备份工作是网管员日常工作中最重要的工作之一。 <br /><br />通过这次“数据库维护计划”的创建，我略有感受： <br /><br />1.经过这么长时间的运用，我认为“数据库维护计划”仍然存在不足之处，虽说“数据库维护计划”功能很强大，但是它最终的结果是生成一项作业，由“SQL Server 2000 Agent”服务定期执行它来完成对数据库的备份工作。这就要求“SQL Server 2000 Agent”服务能够正常地“运行”。从多次安装来看，在Windows 2000系统中“SQL Server 2000 Agent”服务能够正常运行，而且能随Windows 2000的启动自动运行。但是在Window 98系统(包括第二版)中，却不能正常运行。所以说，在Windows 98系统中即使依照上述步骤成功地创建了“数据库维护计划”，也会因为“SQL Server 2000 Agent”服务无法启动而变得没有任何作用。 <br /><br />2.之所以选择“完全备份”，主要在于，在进行完全备份时，SQL Server将.mdf与其对应的.ldf文件进行对比，删除一些旧的、不必要的日志，然后将.mdf和.ldf文件进行合并、压缩后一起存储。 <br /><br />◆ 优点是：能最大可能地、完整地保存数据库。 <br /><br />◆ 缺点是：存储量随着数据库的增大而增大，存储时间也将随着数据库的增大而延长。 <br /><br />3.在建立“数据库维护计划”过程，各位读者应该尽可能地去使用各种选项、功能，以便加深对“数据库维护计划”的理解和掌握。 <br /><br />4.虽然Internet上有许多第三方备份软件和工具，但是大多数是共享版。由于担心知识产权问题、病毒问题和其它问题，所以我没有试用这些第三方软件。这样的话，它们的性能我就不清楚了。也许这些软件的功能非常强大，能够满足更多的、更高的要求。在这里我只是就Windows 2000和SQL Server 2000自带的“备份”工具和软件进行一个比较。<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/down_info.asp?id=2389" width="1" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" /><br /></p>
<img src ="http://www.blogjava.net/xine/aggbug/49678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:36 <a href="http://www.blogjava.net/xine/articles/49678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 管理常用的SQL和T-SQL</title><link>http://www.blogjava.net/xine/articles/49676.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49676.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49676.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49676.html</trackback:ping><description><![CDATA[SQL Server 数据库管理常用的SQL和T-SQL:<br /><br />1. 查看数据库的版本    <br />   select @@version<br />   <br />2. 查看数据库所在机器操作系统参数    <br />   exec master..xp_msver<br />   <br />3. 查看数据库启动的参数        <br />   sp_configure<br />        <br />4. 查看数据库启动时间        <br />   select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1<br />   <br />   查看数据库服务器名和实例名<br />   print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)        <br />   print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)      <br /><br />5. 查看所有数据库名称及大小 <br />   sp_helpdb<br />   <br />   重命名数据库用的SQL<br />   sp_renamedb 'old_dbname', 'new_dbname'<br />   <br />6. 查看所有数据库用户登录信息 <br />   sp_helplogins<br />   <br />   查看所有数据库用户所属的角色信息    <br />   sp_helpsrvrolemember<br />   <br />   修复迁移服务器时孤立用户时,可以用的<a href="http://fengyu.china.com/source/fix_orphan_user.sql" target="_blank">fix_orphan_user</a>脚本或者<a href="http://fengyu.china.com/source/LoneUser.sql" target="_blank">LoneUser</a>过程<br />   <br />   更改某个数据对象的用户属主<br />   sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'<br />   <br />   注意: 更改对象名的任一部分都可能破坏脚本和存储过程。<br />   <br />   把一台服务器上的数据库用户登录信息备份出来可以用<a href="http://fengyu.china.com/source/add_login_to_aserver.sql" target="_blank">add_login_to_aserver</a>脚本<br />   <br />7. 查看链接服务器        <br />   sp_helplinkedsrvlogin<br />   <br />   查看远端数据库用户登录信息    <br />   sp_helpremotelogin<br />   <br />8.查看某数据库下某个数据对象的大小<br />   sp_spaceused @objname<br />  <br />   还可以用<a href="http://fengyu.china.com/source/sp_toptables.sql" target="_blank">sp_toptables</a>过程看最大的N(默认为50)个表<br />  <br />   查看某数据库下某个数据对象的索引信息<br />   sp_helpindex @objname<br />   <br />   还可以用<a href="http://fengyu.china.com/source/sp_nchelpindex.sql" target="_blank">SP_NChelpindex</a>过程查看更详细的索引情况<br />   SP_NChelpindex @objname<br />   <br />   clustered索引是把记录按物理顺序排列的，索引占的空间比较少。 <br />   对键值DML操作十分频繁的表我建议用非clustered索引和约束，fillfactor参数都用默认值。<br /><br />   查看某数据库下某个数据对象的的约束信息<br />   sp_helpconstraint @objname<br />  <br />9.查看数据库里所有的存储过程和函数<br />   use @database_name<br />   sp_stored_procedures<br /><br />   查看存储过程和函数的源代码<br />   sp_helptext '@procedure_name'<br />   <br />   查看包含某个字符串@str的数据对象名称<br />   select distinct object_name(id) from syscomments where text like '%@str%'<br />  <br />   创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数<br />  <br />   解密加密过的存储过程和函数可以用<a href="http://fengyu.china.com/source/sp_decrypt.sql" target="_blank">sp_decrypt</a>过程<br />  <br />       10.查看数据库里用户和进程的信息<br />   sp_who<br /><br />  查看SQL Server数据库里的活动用户和进程的信息<br />   sp_who 'active'<br /><br />  查看SQL Server数据库里的锁的情况<br />   sp_lock<br />   <br />   进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.<br /><br />   spid是进程编号,dbid是数据库编号,objid是数据对象编号<br /><br />   查看进程正在执行的SQL语句<br />   dbcc inputbuffer (<spid>)<br />          <br />  推荐大家用经过改进后的<a href="http://fengyu.china.com/source/sp_who3.sql" target="_blank">sp_who3</a>过程可以直接看到进程运行的SQL语句<br />   sp_who3<br />   <br />  检查死锁用<a href="http://fengyu.china.com/source/sp_who_lock.sql" target="_blank">sp_who_lock</a>过程<br />   sp_who_lock    <br />      <br />       11.收缩数据库日志文件的方法<br /><br />  收缩简单恢复模式数据库日志，收缩后@database_name_log的大小单位为M<br />   backup log @database_name with no_log<br />   dbcc shrinkfile (@database_name_log, 5)<br /><br />       12.分析SQL Server SQL 语句的方法:<br />       <br />   set statistics time {on | off}<br /><br />   set statistics io {on | off}<br /><br />           图形方式显示查询执行计划<br />           <br />           在查询分析器-&gt;查询-&gt;显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://fengyu.china.com/images/sqlserver_exeute_plan.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" />图形<br />           <br />           文本方式显示查询执行计划<br /><br />   set showplan_all {on | off}<br />   <br />   set showplan_text { on | off }<br /><br />   set statistics profile { on | off }<br />   <br /><br />       13.出现不一致错误时，NT事件查看器里出3624号错误，修复数据库的方法<br />  <br />  先注释掉应用程序里引用的出现不一致性错误的表，然后在备份或其它机器上先恢复然后做修复操作<br />  <br />  alter database [@error_database_name] set single_user<br />  <br />  修复出现不一致错误的表<br />  <br />  dbcc checktable('@error_table_name',repair_allow_data_loss)<br />  <br />  或者可惜选择修复出现不一致错误的小型数据库名<br />  <br />  dbcc checkdb('@error_database_name',repair_allow_data_loss)<br /><br />  alter database [@error_database_name] set multi_user<br /><br />  CHECKDB 有3个参数:<br /><br />  repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，<br />  以及删除已损坏的文本对象，这些修复可能会导致一些数据丢失。<br />  修复操作可以在用户事务下完成以允许用户回滚所做的更改。<br />  如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。<br />  如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。<br />  修复完成后，请备份数据库。 <br /><br />  repair_fast 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。<br />  这些修复可以很快完成，并且不会有丢失数据的危险。 <br /><br />  repair_rebuild 执行由 repair_fast 完成的所有修复，包括需要较长时间的修复（如重建索引）。<br />  执行这些修复时不会有丢失数据的危险。 <br />    <br />  有兴趣还可以看看源自<a href="http://www.sqlservercentral.com/Scripts/" target="_blank">www.sqlservercentral.com</a>的检查SQL Server全部信息的<a href="http://fengyu.china.com/source/sqlserver_all_aspect.sql" target="_blank">sqlserver_all_aspect</a>脚本 </spid><img src ="http://www.blogjava.net/xine/aggbug/49676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:33 <a href="http://www.blogjava.net/xine/articles/49676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inside SQL Server Maintenance Plans</title><link>http://www.blogjava.net/xine/articles/49671.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49671.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49671.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49671.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="3" width="600" border="0">
				<tbody>
						<tr>
								<td class="PageTitle" align="middle" width="100%">Inside SQL Server Maintenance Plans </td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<center>
				<div align="center">
						<table cellspacing="0" cellpadding="3" width="600" border="0">
								<tbody>
										<tr>
												<td align="left" width="100%">
														<i>
																<font face="Verdana" size="2">by <span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: Times New Roman; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><a href="http://www.sql-server-performance.com/andrzej_kozlowski.asp">Andrzej Kozlowski</a></span></font>
														</i>
														<p> </p>
														<p>
																<font face="Verdana" size="2">Like a lot of database administrators who manage many SQL Server databases, I have problems with maintenance and administration tasks. Some of these are massive jobs, which have to be created and maintained to be sure that databases are robust and reliable. One of the tools I use often to make my life a little easier is the Database Maintenance Wizard, which is used to create SQL Server maintenance plans.</font>
														</p>
														<p>
																<font face="Verdana" size="2">While the Database Maintenance Wizard, and the plans it creates are generally good, they are not always perfect. In addition, what is going on behind the scenes when a maintenance plan is running is not so obvious. So what I recently did was to find out what was going on behind the scene using the SQL Server Profiler.</font>
														</p>
														<p>
																<font face="Verdana" size="2">To capture the Profiler trace (using SQL Server 2000), I used the predefined Profiler template called SQLProfilerStandard, with two modifications, using:</font>
														</p>
														<ul>
																<li>
																		<font face="Verdana" size="2">RPC: Starting</font>
																</li>
																<li>
																		<font face="Verdana" size="2">SQL: BatchStarting</font>
																</li>
														</ul>
														<p>
																<font face="Verdana" size="2">instead of:</font>
														</p>
														<ul>
																<li>
																		<font face="Verdana" size="2">RPC: Completed</font>
																</li>
																<li>
																		<font face="Verdana" size="2">SQL: BatchCompleted</font>
																</li>
														</ul>
														<p>
																<font face="Verdana" size="2">All the other trace configuration items were left the same. Those two changes to the SQLProfilerStandard template allow us easily to capture the relevant trace data.</font>
														</p>
														<p> </p>
														<p>
																<font face="Verdana" color="#000080" size="2">
																		<b>Profiling Integrity Maintenance Plan Options</b>
																</font>
														</p>
														<p>
																<font face="Verdana" size="2">Next, I created a Maintenance Plan using the following Integrity options (see figure as a reference point) in order to see what SQL Server statements were used.</font>
														</p>
														<p align="center">
																<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.sql-server-performance.com/images/ak_ins1.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" />
														</p>
														<p>
																<font face="Verdana" size="2">Then, I started the Profiler trace and ran the job created by the Maintenance Plan to see what the results would be. I then went back and changed some of the settings in the above screen to see what happened as options were changed.</font>
														</p>
														<p>
																<font face="Verdana" size="2">Below are the results, formatted into a table for easy viewing.</font>
														</p>
														<div align="center">
																<table cellspacing="0" cellpadding="3" width="592" border="1">
																		<tbody>
																				<tr>
																						<td valign="top" width="202">
																								<b>
																										<font face="Verdana" size="2">Which Integrity Settings Were Used</font>
																								</b>
																						</td>
																						<td valign="top" width="191">
																								<b>
																										<font face="Verdana" size="2">Profiler Trace Results</font>
																								</b>
																						</td>
																						<td valign="top" width="177">
																								<b>
																										<font face="Verdana" size="2">Xp_Sqlmaint Syntax</font>
																								</b>
																						</td>
																				</tr>
																				<tr>
																						<td valign="top" width="202">
																								<font face="Verdana" size="2">Check database integrity, include indexes, attempt to repair any minor problems</font>
																						</td>
																						<td valign="top" width="191">
																								<font face="Verdana" size="2">dbcc checkdb(Pubs, REPAIR_FAST) WITH NO_INFOMSGS</font>
																						</td>
																						<td valign="top" width="177">
																								<font face="Verdana" size="2">-CkDBRepair<br />(not documented)</font>
																						</td>
																				</tr>
																				<tr>
																						<td valign="top" width="202">
																								<font face="Verdana" size="2">Check database integrity, include indexes</font>
																						</td>
																						<td valign="top" width="191">
																								<font face="Verdana" size="2">Use pubs<br /><span style="mso-fareast-font-family: Times New Roman; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">dbcc checkdb WITH NO_INFOMSGS</span></font>
																						</td>
																						<td valign="top" width="177">
																								<font face="Verdana" size="2">
																										<br />
																								</font>
																						</td>
																				</tr>
																				<tr>
																						<td valign="top" width="202">
																								<font face="Verdana" size="2">Check database integrity, exclude indexes</font>
																						</td>
																						<td valign="top" width="191">
																								<font face="Verdana" size="2">dbcc checkdb(Pubs, noindex) WITH NO_INFOMSGS</font>
																						</td>
																						<td valign="top" width="177">
																								<font face="Verdana" size="2">-CkDBNoIdx</font>
																						</td>
																				</tr>
																				<tr>
																						<td valign="top" width="202">
																								<font face="Verdana" size="2">Perform the above tests before backing up the database or transaction log</font>
																						</td>
																						<td valign="top" width="191"> </td>
																						<td valign="top" width="177">
																								<font face="Verdana" size="2">-BkUpOnlyIfClean<br />(One of above CkDB depending on chosen settings)</font>
																						</td>
																				</tr>
																		</tbody>
																</table>
														</div>
														<p>
																<font face="Verdana" size="2">Comments on this test run:</font>
														</p>
														<ol>
																<li>
																		<font face="Verdana" size="2">Don’t use the option "Attempt to repair any minor problems" which causes DBCC Checkdb to be run with the option REPAIR_FAST. This option performs minor repair actions without risk of data loss. However, the given database must be in single-user mode to use this value, which presents problems if this is a production database.<br /><br /></font>
																</li>
																<li>
																		<font face="Verdana" size="2">If database is not in single-user mode, DBCC Checkdb with REPAIR_FAST, will not be run, unfortunately the text or html report files will still report a success.<br /><br /></font>
																</li>
																<li>
																		<font face="Verdana" size="2">By checking the option "Perform these tests before backing up the database or transaction log," SQL server modifies the backup jobs (full and log backup) by adding two option to the respective maintenance plans:<br /><br />· BkUpOnlyIfClean<br />· CkDB | CkDBNoIdx | CkDBRepair<br /><br /></font>
																</li>
																<li>
																		<font face="Verdana" size="2">Don’t use the above option if you are going to add transaction log backups to the same maintenance plan, as this will cause DBCC activity before each incremental backup, hurting performance<br /><br /></font>
																</li>
																<li>
																		<font face="Verdana" size="2">"WITH NO_INFOMSGS" is used to suppress all informational messages</font>
																</li>
														</ol>
														<p>
																<font face="Verdana" size="2">
																		<br />
																</font>
														</p>
														<p>
																<font face="Verdana" color="#000080" size="2">
																		<b>Profiling Optimization Maintenance Plan Options</b>
																</font>
														</p>
														<p>
																<font face="Verdana" size="2">In this step, I wanted to see happened under the covers when various Optimization options (see illustration below) from the Database Maintenance Wizard are traced with Profiler. As before, I will experiments with several different Optimization options, and run the resulting jobs manually in order to capture the traces.</font>
														</p>
														<p align="center">
																<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.sql-server-performance.com/images/ak_ins2.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" />
																<font face="Verdana" size="2">
																		<br />
																</font>
														</p>
														<center>
														</center>
														<p align="left">
																<font face="Verdana" size="2">Below are the results, formatted into a table for easy viewing.</font>
														</p>
														<div align="center">
																<center>
																		<table cellspacing="0" cellpadding="2" width="592" border="1">
																				<tbody>
																						<tr>
																								<td valign="top" width="210">
																										<b>
																												<font face="Verdana" size="2">Which Optimization Settings Were Used</font>
																										</b>
																								</td>
																								<td valign="top" width="219">
																										<b>
																												<font face="Verdana" size="2">Profiler Trace Results</font>
																										</b>
																								</td>
																								<td valign="top" width="143">
																										<b>
																												<font face="Verdana" size="2">Xp_Sqlmaint Syntax</font>
																										</b>
																								</td>
																						</tr>
																						<tr>
																								<td valign="top" width="210">
																										<font face="Verdana" size="2">Reorganize data and index pages, reorganize pages with the original amount of free space</font>
																								</td>
																								<td valign="top" width="219">
																										<font face="Verdana" size="2">dbcc dbreindex(dbo.Table1,'', 0, sorted_data_reorg) <br /></font>(<font face="Verdana" size="2">for each table in database)</font></td>
																								<td valign="top" width="143">
																										<font face="Verdana" size="2">-RebldIdx 100</font>
																								</td>
																						</tr>
																						<tr>
																								<td valign="top" width="210">
																										<font face="Verdana" size="2">Reorganize data and index pages, change free space per page percentage to 30%</font>
																								</td>
																								<td valign="top" width="219">
																										<font face="Verdana" size="2">dbcc dbreindex(dbo.Table1', '', 70, sorted_data_reorg) <br />(for each table in database)</font>
																								</td>
																								<td valign="top" width="143">
																										<font face="Verdana" size="2">-RebldIdx 30</font>
																								</td>
																						</tr>
																						<tr>
																								<td valign="top" width="210">
																										<font face="Verdana" size="2">Update the statistics used by the query optimizer, percentage of database to sample 30%</font>
																								</td>
																								<td valign="top" width="219">
																										<font face="Verdana" size="2">UPDATE STATISTICS dbo.table1 WITH all, SAMPLE 30 PERCENT (for each table in database)</font>
																								</td>
																								<td valign="top" width="143">
																										<font face="Verdana" size="2">-UpdOptiStats 30</font>
																								</td>
																						</tr>
																						<tr>
																								<td valign="top" width="210">
																										<font face="Verdana" size="2">Remove unused space from database files</font>
																								</td>
																								<td valign="top" width="219">
																										<font face="Verdana" size="2">DBCC shrinkdatabase(test, 10, TRUNCATEONLY )</font>
																								</td>
																								<td valign="top" width="143">
																										<font face="Verdana" size="2">-RmUnusedSpace 2048 10</font>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</center>
														</div>
														<p align="left">
																<font face="Verdana" size="2">
																		<br />Comments on this test run:</font>
														</p>
														<ol>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">DBCC DBREINDEX uses free space as the inverse of the fill factor. So in the first row in the above table, free space = 0%, which is the same as a fill factor of 0. In second position we can see a value of 30% for free space, which is the same as a 70% fill factor.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">If you choose DBREINDEX for a database, an UPDATE STATISTIC is done automatically<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Even though the UPDATE STATISTIC command gives us the possibility to choose either a SAMPLE option of PERCENT or number of ROWS, the maintenance plan allows you only to specify PERCENT.<br /><br /></font>
																		</p>
																</li>
														</ol>
														<p align="left">
																<font face="Verdana" color="#000080" size="2">
																		<b>Profiling Other Maintenance Plan Options</b>
																</font>
																<font face="Verdana" size="2">
																		<br />
																		<br />I will not describe the database and log backup options of the Database Wizard because they are very straight-forward, and work like you would expect them to. However, I would like you to discuss some other maintenance plan options which are accessible only from xp_sqlmaint utility and not from the Maintenance Plan Wizard:</font>
														</p>
														<ul>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>HtmlRpt "e:\mssql7\LOG\ak_test.html"</b>: Creates an HTML version of the database maintenance report.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>DelHtmlRpt &lt;time period&gt;</b>: Sets the retention cycle for HTML files, e.g. 3 WEEKS.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>CkCat</b>: Runs DBCC CHECKCATALOG.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>CkAl, CkAlNoIdx</b>: Runs DBCC NEWALLOC.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>CkTxtAl</b>: Runs DBCC TEXTALL.</font>
																		</p>
																</li>
														</ul>
														<p align="left">
																<font face="Verdana" size="2">
																		<br />Comments on These Commands:</font>
														</p>
														<ol>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Be careful with the syntax of the above switches. They must be exactly as I listed above. For example if you type Htmlrpt (instead of HtmlRpt) the job will fail.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Don’t use NEWALLOC and TEXTALL. They are included for backward compatibility. CHECKALLOC replaced NEWALLOC and CHECKTABLE TEXTALL. It’s better to use CHECKDB, which performs CHECKTABLE for each table in a database to check the integrity of the data, and CHECKALLOC to check allocation of all pages.</font>
																		</p>
																</li>
														</ol>
														<p align="left"> </p>
														<p align="left">
																<font face="Verdana" size="2">
																		<b>
																				<font color="#000080">Maintenance Plan Tables</font>
																		</b>
																		<br />
																		<br />Now for some details on how maintenance plans are stored inside SQL Server. The more you know about this, the easier it will be for you to automate the gathering of useful information about your maintenance plans, if you so desire.</font>
														</p>
														<p align="left">
																<font face="Verdana" size="2">There are four tables in the msdb database which are store maintenance plan information:</font>
														</p>
														<ul>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>sysdbmaintplan_databases</b>: Contains one row for each database. Note that you can use special strings for group of databases like in the Database Maintenance Plan Wizard.</font>
																		</p>
																</li>
														</ul>
														<p align="left">
																<font face="Verdana" size="2">
																		<br />
																		<i>Sample Data From sysdbmaintplan_databases</i>
																</font>
														</p>
														<div align="center">
																<center>
																		<table cellspacing="0" cellpadding="2" width="592" border="1">
																				<tbody>
																						<tr>
																								<td width="337">
																										<font face="Verdana" size="2">
																												<b>plan_id </b>
																										</font>
																								</td>
																								<td width="241">
																										<font face="Verdana" size="2">
																												<b>database_name</b>
																										</font>
																								</td>
																						</tr>
																						<tr>
																								<td width="337">
																										<font face="Verdana" size="2">36D539DF-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td width="241">
																										<font face="Verdana" size="2">WWW_ak</font>
																								</td>
																						</tr>
																						<tr>
																								<td width="337">
																										<font face="Verdana" size="2">36D539E1-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td width="241">
																										<font face="Verdana" size="2">All Databases</font>
																								</td>
																						</tr>
																						<tr>
																								<td width="337">
																										<font face="Verdana" size="2">36D539E2-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td width="241">
																										<font face="Verdana" size="2">All System Databases</font>
																								</td>
																						</tr>
																						<tr>
																								<td width="337">
																										<font face="Verdana" size="2">36D539E3-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td width="241">
																										<font face="Verdana" size="2">All User Databases</font>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</center>
														</div>
														<ul>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>sysdbmaintplans</b>: Contains one row for each maintenance plan.</font>
																		</p>
																</li>
														</ul>
														<p align="left">
																<font face="Verdana" size="2">
																		<i>Sample Data From </i>
																		<i>sysdbmaintplans (partial table)</i>
																		<br />
																</font>
														</p>
														<div align="center">
																<center>
																		<table cellspacing="0" cellpadding="2" width="100%" border="1">
																				<tbody>
																						<tr>
																								<td>
																										<b>
																												<font face="Verdana" size="1">Plan_id</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">Plan_name</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">date _created</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">owner</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">max _history _rows</font>
																										</b>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">00000000-0000-0000-0000-000000000000</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">All ad-hoc plans</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">11/13/98 3:10</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">REDMOND\_sqlbld</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">0</font>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">36D539DF-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">ak_test_www_ak</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">11/14/98 3:10</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">NT\TEST</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">1000</font>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">36D539E1-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">ak_test_all_db</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">11/15/98 3:10</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">NT\TEST</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">1000</font>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">36D539E2-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">ak_test_sys_db</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">11/16/98 3:10</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">NT\TEST</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">1000</font>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">36D539E3-7DE3-11D6-9855-00508BB3C376</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">ak_test_user_db </font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">11/17/98</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">3:10 NT\TEST</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">1000</font>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</center>
														</div>
														<ul>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>sysdbmaintplan_history</b>: Maintain the history information for each maintenance plan.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">
																						<b>sysdbmaintplan_jobs</b>: Maintains the relationship between the maintenance plan id and the job id.</font>
																		</p>
																</li>
														</ul>
														<p align="left">
																<font face="Verdana" size="2">
																		<br />Comments on These System Tables:</font>
														</p>
														<p align="left">
																<font face="Verdana" size="2">Notice than there is one predefined maintenance plan named: "All ad-hoc plans" with a strange owner: "REDMOND\_sqlbld". It is used for all ad-hoc jobs using the xp_sqlmaint utility. The max_history_rows for this plan is set to 0, however there are history entries in the sysdbmaintplan_history table for it.</font>
														</p>
														<p align="left">
																<font face="Verdana" size="2">To demonstrate how this "special" entries works, I created a custom job with following command:</font>
														</p>
														<p align="left">
																<font face="Courier New" size="2">EXECUTE master.dbo.xp_sqlmaint N'-D WWW_ak -Rpt "e:\mssql7\LOG\www_ak.txt" -WriteHistory -CkDB '</font>
														</p>
														<p align="left">
																<font face="Verdana" size="2">After running it twice, here's what the history table looks like:</font>
														</p>
														<div align="center">
																<center>
																		<table cellspacing="0" cellpadding="2" width="100%" border="1">
																				<tbody>
																						<tr>
																								<td>
																										<b>
																												<font face="Verdana" size="1">plan_id</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">plan<br />_name</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">database<br />_name</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">server<br />_name</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">activity</font>
																										</b>
																								</td>
																								<td>
																										<b>
																												<font face="Verdana" size="1">duration</font>
																										</b>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">00000000-0000-0000-0000-000000000000</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">All ad-hoc plans</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">WWW_ak</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">test</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">Check Data and Index Linkage</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">77</font>
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<font face="Verdana" size="1">00000000-0000-0000-0000-000000000000</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">All ad-hoc plans</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">WWW_ak</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">test</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">Check Data and Index Linkage</font>
																								</td>
																								<td>
																										<font face="Verdana" size="1">77</font>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</center>
														</div>
														<p align="left"> </p>
														<p align="left">
																<font face="Verdana" size="2">
																		<b>
																				<font color="#000080">Creating a Custom Maintenance Plan</font>
																		</b>
																		<br />
																		<br />As you can see, the SQL Server Database Maintenance Plan Wizard doesn’t allow us to include all the potentially useful options (HTML report, some DBCC stuff). As workaround, I propose that you follow one these two options when creating your own maintenance plan:</font>
														</p>
														<ol>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Create each new maintenance plan using the wizard, then modify each job manually for those options not available directly from the wizard.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Avoid the wizard completely, and create all jobs manually using the xp_sqlmaint utility.</font>
																		</p>
																</li>
														</ol>
														<p align="left">
																<font face="Verdana" size="2">I recommend the following strategy for SQL Server maintenance jobs:</font>
														</p>
														<ol>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Create jobs (ad-hoc or using the wizard) for full backups of your databases with DBCC CHECKDB and CHECKCATALOG, and set up the option to perform the backup only if they didn’t report any errors. Create this job for all databases which don’t demand transaction log backups.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Create separate jobs for only transaction log backups for all databases which need it.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">Create separate job(s) for data optimizations, depending on your demands.<br /><br /></font>
																		</p>
																</li>
																<li>
																		<p align="left">
																				<font face="Verdana" size="2">For all of your jobs, add the HTML report option and direct it to a share point for easy access with a browser.</font>
																		</p>
																</li>
														</ol>
														<p align="left">
																<font face="Verdana" size="2">All information in this article was provided to help you simplify the management of our SQL Server environment. Please send all comments and questions to: <a href="mailto:akozlowski@amadeus.net">akozlowski@amadeus.net</a><br /></font>
																<br />
																<br />
																<br />
														</p>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
		</center>
<img src ="http://www.blogjava.net/xine/aggbug/49671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:22 <a href="http://www.blogjava.net/xine/articles/49671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何数据库收缩日志文件</title><link>http://www.blogjava.net/xine/articles/49644.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49644.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49644.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49644.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">我有个数据库statmemberdata现在的日志文件都达到40G了，我要用DBCC SHRINKDATABASE来收缩这个日志，过程如下：<br />1、重新启动数据服务器（通过远程控制软件进行的）<br />2、在远程通过SQL SERVER的查询分析器中连接到数据服务器<br />3、远程控制数据服务器服务暂停<br />4、过十分钟，在远程查询分析器中执行：<br />   DBCC SHRINKDATABASE (statmemberdata)<br />   过了几分钟出现以下错误：<br />   “无法收缩日志文件 2（statmemberdata_log），因为所有的逻辑日志文件都在使用。<br /><br />（所影响的行数为 2 行）<br /><br />DBCC 执行完毕。如果 DBCC 输出了错误信息，请与系统管理员联系。”<br /><br />我不明白了，我都重新启动了数据服务器，启动完后马上有暂停了sql server的服务，然后又过了一段时间才运行DBCC SHRINKDATABASE的，怎么老是说“所有的逻辑日志文件都在使用”呢，都试过好多次了，都是这样。<br /><br /><font color="#ff0000">----------------------------------------------------------------------------------------------------------------</font><br /><br />1: 删除LOG<br />1：分离数据库   企业管理器－＞服务器－＞数据库－＞右键－＞分离数据库<br />2：删除LOG文件<br />3：附加数据库  企业管理器－＞服务器－＞数据库－＞右键－＞附加数据库<br />此法生成新的LOG，大小只有500多K<br />   再将此数据库设置自动收缩<br />或用代码： <br />下面的示例分离 pubs，然后将 pubs 中的一个文件附加到当前服务器。<br /><br /><font color="#ff0000">EXEC sp_detach_db @dbname = 'pubs'<br />EXEC sp_attach_single_file_db @dbname = 'pubs', <br />   @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'</font><br /><br /><br />2:清空日志<br />DUMP  TRANSACTION  库名  WITH  NO_LOG    <br /><br />再：<br />企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了<br /><br />3: 如果想以后不让它增长<br />企业管理器－＞服务器－＞数据库－＞属性－＞事务日志－＞将文件增长限制为2M<br /><br /></font>
		</p>
		<pre>
				<font size="2">--压缩日志

1:截断事务日志：
BACKUP LOG 数据库名 WITH NO_LOG

2:清空日志
DUMP  TRANSACTION  库名  WITH  NO_LOG    

再：
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了


3: 删除LOG
	1：分离数据库   企业管理器－＞服务器－＞数据库－＞右键－＞分离数据库
	2：删除LOG文件
	3：附加数据库  企业管理器－＞服务器－＞数据库－＞右键－＞附加数据库
	此法生成新的LOG，大小只有500多K
   再将此数据库设置自动收缩
 或用代码： 
下面的示例分离 pubs，然后将 pubs 中的一个文件附加到当前服务器。

<font color="#ff0000">EXEC sp_detach_db @dbname = 'pubs'
EXEC sp_attach_single_file_db @dbname = 'pubs', 
   @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'</font><br /><br /><br /><br /></font>
		</pre>
		<pre>
				<font size="2">对于有两个库文件的数据库请用下面的语句：<br /><br /><font color="#ff0000">exec sp_attach_db @dbname = 'pubs',<br /> @filename1 = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',<br /> @filename2 = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs1_Data.NDF'</font><br /><br /></font>
		</pre>
		<pre>
				<font size="2">如果数据库有两个日志文件，则以上方法就不行了。<br />需要删掉其中一个日志文件，方法如下：<br /><font color="#ff0000">截断事务日志：
BACKUP LOG otsp WITH NO_LOG

清空日志
DUMP  TRANSACTION  otsp WITH  NO_LOG    
   <br />删除LOG文件
	企业管理器－＞服务器－＞数据库－＞右键－＞属性－＞日志文件－＞选择第二个日志文件删除－＞确定<br /><br />再按上面说的删除日志的方法去附加数据库，就成功了</font></font>
		</pre>4: 如果想以后不让它增长企业管理器--服务器--右键数据库--属性--事务日志--将文件增长限制为xM(x是你允许的最大数据文件大小) --SQL语句的设置方式:alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)5.设置为自动收缩企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"<pre><font size="2">--还不行,就关闭用户打开的进程处理,在查询分析器中执行下面的语句

use master
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_killspid]
GO

create proc p_killspid
@dbname varchar(200)	--要关闭进程的数据库名
as  
	declare @sql  nvarchar(500)  
	declare @spid nvarchar(20)

	declare #tb cursor for
		select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
	open #tb
	fetch next from #tb into @spid
	while @@fetch_status=0
	begin  
		exec('kill '+@spid)
		fetch next from #tb into @spid
	end  
	close #tb
	deallocate #tb
go

--用法  
exec p_killspid  'statmemberdata'
go
DBCC SHRINKDATABASE (statmemberdata)
go

drop proc p_killspid
<br /><br /><br /><br /><br /><br /><p><br /><br /><br /><br />删除数据文件</p><p>dbcc shrinkfile (db_data2 , emptyfile)<br />alter database db<br />remove file db_data2<br />go<br /><br /><br /><br /><br /><br /><br /><br /></p></font></pre><pre><br /><br /><br /><font size="2">参考链接：<br /><a href="http://support.microsoft.com/?kbid=814579">http://support.microsoft.com/?kbid=814579</a><br /></font><a href="http://www.experts-exchange.com/Databases/Microsoft_SQL_Server/Q_21090815.html">http://www.experts-exchange.com/Databases/Microsoft_SQL_Server/Q_21090815.html</a><br /><a href="http://support.microsoft.com/default.aspx?scid=kb;zh-cn;317375">http://support.microsoft.com/default.aspx?scid=kb;zh-cn;317375</a><br /><a href="http://www.weste.net/html/200409/20040904QBI110037.html">http://www.weste.net/html/200409/20040904QBI110037.html</a><br /><a href="http://www.knowsky.com/18746.html">http://www.knowsky.com/18746.html</a><br /><p> </p><br /><br /><br /><br /><br /><br /></pre><img src ="http://www.blogjava.net/xine/aggbug/49644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 15:51 <a href="http://www.blogjava.net/xine/articles/49644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确配置和使用SQL mail</title><link>http://www.blogjava.net/xine/articles/49643.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49643.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49643.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49643.html</trackback:ping><description><![CDATA[我就把我配置SQL mail的过程描述一遍。<br />　　<br />　　我用SQL mail主要是要完成这样的功能：<br />　　&gt;用户在网上注册后,系统将随机产生的密码发送到用户登记的Email<br />　　&gt;用户在论坛的帖子有回复时将内容发送到用户的Email<br />　　因为上述过程都是在存储过程中完成的，所以避免了前台程序对参数的<br />　　传输处理，也不需要再用第三方的组件完成，感觉比较方便。<br />　　<br />　　1.为了使用SQL mail,首先你的服务器上得有SMTP服务，我没有安装win2000 server自带的SMTP，而是用imail6.04的SMTP,感觉比较稳定，功能也比较强。<br />　　2.安装一个邮件系统,我安装了outLook 2000，我发现在配置邮件profile时，如果<br />　　不安装outLook而是用别的第三方程序，win2k中文server版在控制面板中就找不到“邮件”一项.<br />　　3.安装完outlook后再刷新控制面板,就会找到“邮件”一项，双击进行邮件的配置，为配置文件起一个名字(假设为myProfile)，以便以后SQL mail使用，在该配置文件中设置各项属性。<br />　　4.启动outlook(设置为用myProfile作为默认的配置文件),测试进行收发邮件，确认outlook工作正常。<br />　　5.用当前的域帐户启动SQL server,在企业管理器的支持服务中，点击SQL mail的属性，可以看到在配置文件选择中，出现了刚才定义的myProfile配置文件(你也可以定义多个profile)，选择这个配置文件进行测试，SQL将返回成功开始和结束一个MAPI会话的信息，如果出现错误或是没有找到邮件配置文件，那一定是你启动SQL server用的帐号有问题<br />　　6.现在你就可以在查询分析器中用XP_sendmail这个扩展存储过程发送SQL mail了，格式如下：<br />　　xp_sendmail {[@recipients =] 'recipients [;...n]'} <br />　　[,][@message =] 'message'] <br />　　[,][@query =] 'query'] <br />　　[,][@attachments =] attachments] <br />　　[,][@copy_recipients =] 'copy_recipients [;...n]'<br />　　[,][@blind_copy_recipients =] 'blind_copy_recipients [;...n]'<br />　　[,][@subject =] 'subject']<br />　　[,[@type =] 'type'] <br />　　[,][@attach_results =] 'attach_value']<br />　　[,][@no_output =] 'output_value'] <br />　　[,][@no_header =] 'header_value'] <br />　　[,][@width =] width] <br />　　[,][@separator =] 'separator'] <br />　　[,][@echo_error =] 'echo_value'] <br />　　[,][@set_user =] 'user'] <br />　　[,][@dbuse =] 'database']<br />　　<br />　　其中@recipients是必需的<br />　　<br />　　参数说明：<br />　　<br />　　参数 说明 <br />　　@recipients 收件人，中间用逗号分开 <br />　　@message 要发送的信息 <br />　　@query 确定执行并依附邮件的有效查询，除触发器中的插入表及删除表外，此查询能引用任何对象 <br />　　@attachments 附件 <br />　　@copy_recipients 抄送 <br />　　@blind_copy_recipients 密送 <br />　　@subject 标题 <br />　　@attach_results 指定查询结果做为附件发送 <br />　　@no_header 不发送查询结果的列名 <br />　　@set_user 查询联接的用户名，默认为Guset <br />　　@dbuse 查询所用的数据库，默认为缺省数据库 <br />　　<br />　　<br />　　7.不过，如果是在web应用中使用SQL mail,还有一些问题要解决:首先，就是应用程序中连接数据库的帐号，我在网站程序中的数据库连接是使用UDL文件，帐号为DbGuest,这是一个普通帐户，所以还必须在master库的扩展存储过程找到XP_sendmail，并在其属性中增加DbGuest这个用户，并选择EXEC权限。<br />　　好了，现在设置完毕，运行网站程序，测试用户注册，几乎没有什么延迟，我测试用的邮箱中就收到了这封SQL mail发出的Email: <br />　　"谢谢你的注册，你的用户名是 [心歌],密码是 123456789,建议你首次登录后修改密码"<br />　　<br />　　大功告成!看起来很简单的过程，却折腾了我一个星期!希望你能比我顺利.<br />　　<br />　　不过，现在虽然能用SQLmail发送附件，附加数据库查询结果，但是我还没有发现有什么办法用SQLmail发送html格式的邮件，如果你知道，请一定告诉我哟!<img src ="http://www.blogjava.net/xine/aggbug/49643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 15:50 <a href="http://www.blogjava.net/xine/articles/49643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLMail的原理及实际应用</title><link>http://www.blogjava.net/xine/articles/49637.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/xine/articles/49637.html</guid><wfw:comment>http://www.blogjava.net/xine/comments/49637.html</wfw:comment><comments>http://www.blogjava.net/xine/articles/49637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xine/comments/commentRss/49637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xine/services/trackbacks/49637.html</trackback:ping><description><![CDATA[-概述<br />　　<br />　　----这里所指的SQLMail，是微软公司的关系数据库管理系统 SQLServer所提供的邮件功能。在SQLServer中包含一些扩展存储过程，使得SQLServer可以通过基于WindowsNT内部的消息应用编程界面（MAPI）的客户机邮件程序接收和发送邮件消息。SQLMail可发送的消息包括文本串，附加文件或SQL语句的执行结果集。应用SQLMail的扩展存储过程，邮件消息可以从一个触发<br />　　器或一个存储过程中发送，并且通过SQLServer提供的任务和警告等功能，可以根据需要在不同的时间和情况下发送。<br />　　<br />　　----SQLMail工作流程<br />　　<br />　　----SQLMail工作流程主要分为邮件收、发两个过程。<br />　　<br />　　----在SQLServer内可以通过一定方法，调用扩展存储过程xp_s<br />　　endmail，将收信人电子邮件地址，标题，信的内容等以参数的形式传送给xp_sendmail，由它通过客户端MAPI接口将发送邮件任<br />　　务交给如MicrosoftExchangeClient或Outlook97等邮件客户端程序，最终通过邮件服务将邮件发送出去。<br />　　<br />　　----收邮件的过程与此相似。在SQLServer端定期或手工调用xp_readmail扩展存储过程，通过客户端MAPI接口将存放在邮件服务器或客户端的邮件及其他信息读入SQL变量中，用来满足特定的处理需要。 <br />　　配置SQLMail<br />　　<br />　　----配置SQLMail的首要条件是要有一个电子邮件帐户，不管是局域网内的MSExchangeServer或MSMail3.x的邮件帐户，还是Internet上的SMTP，POP3等邮件帐户均可。具体配置可分为以下几步：<br />　　<br />　　----1．为SQLServer创建一个NT域用户帐号，要求具有本地管理员组的权限。仔细设置帐号口令，保证口令足够复杂，且设成口令永不过期和用户不得更改口令。<br />　　<br />　　----2．双击控制面板的服务图标，找到MSSQLServer的启动设置，将UseSystemAccount改为UseThisAccount，将刚才建立的NT帐号和口令输入。重新启动SQLServer。<br />　　<br />　　----3．在安装SQLServer的服务器上以与启动SQLServer相同的NT帐号登录，然后安装支持MAPI接口的邮件客户端程序，如MS<br />　　ExchangeClient和Outlook97。<br />　　<br />　　----4．打开控制面板的电子邮件选项，建立一个配置文件（Profile）。用这个配置文件启动邮件客户端程序，反复检验直至能正常收发邮件。<br />　　<br />　　----5．从SqlEnterpriserManager中，点中相应的服务器图标，从<br />　　Server菜单中选SQLMail/Configure，将在第4步中建立的配置文件名输入。<br />　　<br />　　----6．从SqlEnterpriserManager中，点中相应的服务器图标，从<br />　　Server菜单中选SQLMail/Start，如果SqlMail的图标变为绿色，则SQ<br />　　LMail成功启动。<br />　　<br />　　----常用的SQLMail扩展存储过程<br />　　<br />　　xp_sendmail@recipient=recipient<br />　　<br />　　[;recipient2;[...;recipientn]]<br />　　<br />　　[,@message=message]<br />　　<br />　　[,@query=query]<br />　　<br />　　[,@attachments=attachments]<br />　　<br />　　[,@copy_recipients=recipient<br />　　<br />　　[;recipient2;[...;recipientn]]]<br />　　<br />　　[,@blind_copy_recipients=recipient<br />　　<br />　　[;recipient2;[...;recipientn]]]<br />　　<br />　　[,@subject=subject]<br />　　<br />　　[,@type=type]<br />　　<br />　　[,@attach_results={'true'|'false'}]<br />　　<br />　　[,@no_output={'true'|'false'}]<br />　　<br />　　[,@no_header={'true'|'false'}]<br />　　<br />　　[,@width=width]<br />　　<br />　　[,@separator=separator]<br />　　<br />　　[,@echo_error={'true'|'false'}]<br />　　<br />　　[,@set_user=user]<br />　　<br />　　[,@dbuse=dbname]<br />　　<br />　　----此存储过程通过客户端MAPI接口发送邮件，内容可以是文本串，附加文件或SQL语句的执行结果集。<br />　　<br />　　xp_findnextmsg[@msg_id=msg_id[OUTPUT]]<br />　　<br />　　[,@type=type]<br />　　<br />　　[,@unread_only={'true'|'false'}])<br />　　<br />　　----此存储过程在邮箱中查找特定的邮件，并返回一封邮件的消息ID。<br />　　<br />　　xp_readmail([@msg_id=msg_id][,@type=type[OUTPUT]]<br />　　<br />　　[,@peek={'true'|'false'}]<br />　　<br />　　[,@suppress_attach={'true'|'false'}]<br />　　<br />　　[,@originator=@senderOUTPUT]<br />　　<br />　　[,@subject=@subject_lineOUTPUT]<br />　　<br />　　[,@message=@body_of_messageOUTPUT]<br />　　<br />　　[,@recipients=@recipient_listOUTPUT]<br />　　<br />　　[,@cc_list=@cc_listOUTPUT]<br />　　<br />　　[,@bcc_list=@bcc_listOUTPUT]<br />　　<br />　　[,@date_received=@dateOUTPUT]<br />　　<br />　　[,@unread={'true'|'false'}]<br />　　<br />　　[,@attachments=@temp_file_pathsOUTPUT])<br />　　<br />　　[,@skip_bytes=@bytes_toskipOUTPUT]<br />　　<br />　　[,@msg_length=@length_in_bytesOUTPUT])<br />　　<br />　　----此存储过程从指定的邮件收件箱中读取指定消息ID的邮件的各项信息。<br />　　<br />　　----xp_deletemail[@msg_id=]msg_id<br />　　<br />　　----从邮件收件箱中删除一封指定消息ID的邮件。<br />　　<br />　　----注释：<br />　　<br />　　----1.存储过程的多个参数间用逗号间隔开，[]内的为可选参数，每个参数均以@符号加字符串开头，用以区别不同的参数项。等号后可以是常量，也可以是预先定义好的变量。<br />　　<br />　　----2.如果需要将某个结果值赋予参数中预先定义好的变量，就必须在该项参数的最后加OUTPUT。<br />　　<br />　　----3.常用参数解释：<br />　　<br />　　----?@recipient=recipient；指定收件人的电子邮件地址。如果有多个收件人，可以用分号分隔开。<br />　　<br />　　----?@subject=subject；邮件的标题。发送邮件时的默认值为<br />　　"SQLServerMessage"。<br />　　<br />　　----?@message=message；邮件的具体内容。<br />　　<br />　　----?@attachments=attachments；邮件挂接的附加文件名。<br />　　<br />　　----?@type=type；基于MAPI定义的消息类型，详细信息参见"<br />　　MicrosoftWindowsNTResourceKit"或"MicrosoftMailTechnicalReference"。<br />　　<br />　　----?@query=query；一条SQL可执行语句，其执行结果以正文或附件的方式随邮件发送。<br />　　<br />　　----?@msg_id=msg_id；对于信箱中的每一封邮件均被分配了<br />　　<br />　　----?@attachments=attachments；邮件挂接的附加文件名。<br />　　<br />　　----?@type=type；基于MAPI定义的消息类型，详细信息参见"<br />　　MicrosoftWindowsNTResourceKit"或"MicrosoftMailTechnicalReference"。<br />　　<br />　　----?@query=query；一条SQL可执行语句，其执行结果以正文或附件的方式随邮件发送。<br />　　<br />　　----?@msg_id=msg_id；对于信箱中的每一封邮件均被分配了一个特殊的消息ID，用以相互区分。<br />　　<br />　　----?@originator=@sender；读取特定邮件的发送者的邮件地址。<br />　　<br />　　--基于SQLMail的电子报刊自动处理系统<br />　　<br />　　----这里利用SQLMail简单的实现了一个电子报刊自动处理系统。每当新的一期电子报刊编辑完成，只需简单追加到发行数据库publication中，SQLServer会自动定期执行my_publish存储过程。在my_publish存储过程中，它检查发行数据库，当发现有新的记录（即新的一期电子报刊）时，就通过逐个从订阅数据库sub_info中取出订阅人的邮件地址，完成给每个订阅者发送电子报刊（以邮件形式）的任务。<br />　　<br />　　----电子报刊的订阅与取消也是通过邮件来实现。SQLServer同样定期执行my_subscibe存储过程。my_subscibe存储过程检查特定<br />　　邮箱中的所有邮件，如果存在标题为"subscribe"的邮件，就取出它的发件人等信息，在订阅数据库中添加一条记录；同样，如果存在标题为"stopsubscribe"的邮件，就将它的相关记录从订阅数据库中删除。系统中用到的数据库和存储过程如下所<br />　　示。sub_info（订阅者信息数据库） 字段名称类型允许空值含义<br />　　<br />　　emailvarchar(20)NOTNULL订阅者电子邮件地址<br />　　sub_datedatetimeNOTNULL订阅时间<br />　　<br />　　othertextNULL订阅者的其他信息<br />　　<br />　　publication（电子报刊出版数据库）<br />　　<br />　　字段名称类型允许空值含义<br />　　<br />　　pub_classchar(10)NOTNULL电子报刊期号<br />　　<br />　　pub_datedatetimeNULL出版日期<br />　　<br />　　titletextNOTNULL本期电子报刊标题<br />　　<br />　　contenttextNOTNULL电子报刊正文<br />　　<br />　　endnotetextNULL附加于报刊的其他信息<br />　　<br />　　flagsmallintNULL1，标志为未出版的新报刊<br />　　<br />　　my_subscribe，用于处理订阅者信息的存储过程。<br />　　<br />　　CREATEPROCEDUREmy_subscribe<br />　　<br />　　AS<br />　　<br />　　declare@msg_idvarchar(64)<br />　　<br />　　declare@subjectvarchar(255)<br />　　<br />　　declare@messagevarchar(255)<br />　　<br />　　declare@originatorvarchar(255)<br />　　<br />　　declare@datevarchar(255)<br />　　<br />　　declare@statusint<br />　　<br />　　declare@mapifailureint<br />　　<br />　　select@mapifailure=0<br />　　<br />　　<br />　　while(1=1)<br />　　<br />　　begin<br />　　<br />　　/*查找邮件并获取消息ID*/<br />　　<br />　　exec@status=master..<br />　　<br />　　xp_findnextmsg@msg_id=@msg_idOUTPUT<br />　　<br />　　if@status&lt;&gt;0<br />　　<br />　　begin<br />　　<br />　　select@mapifailure=1<br />　　<br />　　break<br />　　<br />　　end<br />　　<br />　　if@msg_idisnullbreak<br />　　<br />　　/*读取邮件的信息到变量中*/<br />　　<br />　　exec@status=master..xp_readmail<br />　　<br />　　@msg_id=@msg_id,<br />　　<br />　　@originator=@originatorOUTPUT,<br />　　<br />　　@subject=@subjectOUTPUT,<br />　　<br />　　@message=@messageOUTPUT,<br />　　<br />　　@date_received=@dateOUTPUT<br />　　<br />　　if@status&lt;&gt;0<br />　　<br />　　begin<br />　　<br />　　select@mapifailure=1<br />　　<br />　　break<br />　　<br />　　end<br />　　<br />　　/*根据邮件标题，在订阅数据库中添加或删除记录*/<br />　　<br />　　execxp_deletemail@msg_id=@msg_id<br />　　<br />　　if@subject='subscribe'<br />　　<br />　　insertintosqlmailsample..<br />　　<br />　　sub_infovalues(@originator,@date,@message)<br />　　<br />　　else<br />　　<br />　　if@subject='stopsubscribe'<br />　　<br />　　deletefromsqlmailsample..sub_infowhereemail=@originator<br />　　<br />　　end/*循环结束*/<br />　　<br />　　<br />　　if@mapifailure=1<br />　　<br />　　/*错误处理代码*/<br />　　<br />　　else<br />　　<br />　　return(0)<br />　　<br />　　GO<br />　　<br />　　<br />　　my_publish，用于分发电子报刊的存储过程。<br />　　<br />　　CREATEPROCEDUREmy_publish<br />　　<br />　　AS<br />　　<br />　　declare@recipientvarchar(255)<br />　　<br />　　declare@subjectvarchar(255)<br />　　<br />　　declare@contentvarchar(255)<br />　　<br />　　declare@endnotevarchar(255)<br />　　<br />　　declare@statusint<br />　　<br />　　<br />　　select@subject=pub_classfrom<br />　　<br />　　sqlmailsample..publicationwhereflag=1<br />　　<br />　　/*如果有新的电子报刊，则开始分发*/<br />　　<br />　　if(@subjectisnotnull)<br />　　<br />　　begin<br />　　<br />　　/*将数据库记录取出，经过适当处理后，存放到变量中*/<br />　　<br />　　select@subject=convert(varchar<br />　　<br />　　(255),title)+'('+pub_class+')',<br />　　<br />　　@content=convert(varchar(255),content)<br />　　<br />　　+convert(varchar(255),endnote)<br />　　<br />　　fromsqlmailsample..publication<br />　　<br />　　whereflag=1<br />　　<br />　　updatesqlmailsample..publication<br />　　<br />　　setflag=0whereflag=1<br />　　<br />　　<br />　　declarecurcursorforselect<br />　　<br />　　emailfromsqlmailsample..sub_info<br />　　<br />　　opencur<br />　　<br />　　fetchcur<br />　　<br />　　while(@@fetch_status=0)<br />　　<br />　　begin<br />　　<br />　　/*取收件人的电子邮件地址*/<br />　　<br />　　fetchnextfromcurinto@recipient<br />　　<br />　　/*发送电子邮件*/<br />　　<br />　　if@@fetch_status=0<br />　　<br />　　begin<br />　　<br />　　exec@status=master..xp_sendmail<br />　　<br />　　@recipients=@recipient,<br />　　<br />　　@message=@content,<br />　　<br />　　@subject=@subject<br />　　<br />　　if@status&lt;&gt;0<br />　　<br />　　/*错误处理代码*/<br />　　<br />　　end<br />　　<br />　　end/*向所有订阅人发送电子报刊的循环结束*/<br />　　<br />　　closecur<br />　　<br />　　deallocatecur<br />　　<br />　　end<br />　　<br />　　GO<br />　　<br />　　----总之，SQLMail在数据库和电子邮件之间架起了一座沟通<br />　　<br />　　end/*向所有订阅人发送电子报刊的循环结束*/<br />　　<br />　　closecur<br />　　<br />　　deallocatecur<br />　　<br />　　end<br />　　<br />　　GO<br />　　<br />　　----总之，SQLMail在数据库和电子邮件之间架起了一座沟通的桥梁，为某些特定用途的应用提供了简单高效的解决方案，值得一试<img src ="http://www.blogjava.net/xine/aggbug/49637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 15:45 <a href="http://www.blogjava.net/xine/articles/49637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>