﻿<?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>C++博客-. . . . . . . . . . . . . . Blog Garden'  C plus plus (My technology Impire!)-文章分类-Database</title><link>http://www.cppblog.com/stevennash/category/2736.html</link><description>................................................................ It‘s a age of economic globalization and Infomation globalization........................................</description><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 19:05:02 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 19:05:02 GMT</pubDate><ttl>60</ttl><item><title>数据访问两种模式的比较 </title><link>http://www.cppblog.com/stevennash/articles/13299.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 18:52:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13299.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13299.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13299.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 数据访问两种模式的比较 				ASP.NET2.0扩展了ASP.NET1.1里数据访问的模式，简单概括起来具有两种模式						1、使用数据源控件（SqlDataSource/ObjectDataSource）				  1）建立一个项目TwoMode		  2）建立数据库连接		   由于ASP.NET2.0提供了App_Data目录，所以你可以直接把数据库文...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/13299.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/13299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 02:52 <a href="http://www.cppblog.com/stevennash/articles/13299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 计数器</title><link>http://www.cppblog.com/stevennash/articles/13277.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 11:16:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13277.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13277.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13277.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server 计数器</a>
		<br />
		<br />
		<p>　　<strong>SQL Server计数器——第一部分</strong></p>
		<p>　　Barrie Sosinsky</p>
		<p>　　接下来的那篇贴士SQL Server计数器，第二部分将会就使用计数器来监控SQL Server性能方面给出更多详细信息。</p>
		<p>　　性能监视器是你可以用来监控SQL Server性能的三个工具之一(其它两个分别是Profiler 和企业管理器)。具有超过156个独立的计数器，并且还能创建你自己的计数器(正如SQL Server在线书籍上面描述的)，这么一大串的工具要你来使用真是一件令人困惑的事情。Windows服务器操作系统提供了全部几百种可能的计数器来供你进行分析。我突然想起了“信息过载”这个词。然而，一些类型的计数器要比其它类型的更有价值，跟据你的安装和问题解决方法，可以直接根据需要挑选某些计数器。</p>
		<p>　　你可以从菜单命令或者从Profiler工具条的按钮上，直接调出系统监视器。在7.0版本中，默认安装了6个计数器进行监控:缓冲存储区命中率(Buffer Cache Hit Ratio)，页面读取(Page Reads)，页面写入(Page Writes)，SQL编辑/秒(SQL Compilations/sec)，服务器全部内存(Total Server Memory)(KB)，以及用户连接。根据你使用的SQL Server版本的不同而有所区别，以为在6.5版本中，默认情况下是5个:存储区命中率(Cache Hit Ratio)，3个I/O计数器(页面读取/秒，单页面写入/秒，以及事务/秒)，还有用户连接。这些计数器测量的参数都类似，但是在含义上有很大的区别，因此也就具有不同的解释。</p>
		<p>　　一次测量一个计数器是个好主意。最重要的计数器包括:磁盘I/O，进城，内存，用户连接，以及网络，顺序如上。数据库(总体)性能有几个主要的瓶颈，同时这里也是你能够进行适当修正的地方。你会发现，性能监视器收集的数据比你需要的多一些，通常情况都是如此;或者你会发现你想要分析的性能特点已经从下一次数据扫描的图表中去掉了。通过选项/图标命令来调整更新频率，这样你就可以更好地察看结果中重要的方面了。</p>
		<p>　　你还会发现，当你解决或者诊断问题的时候，需要添加更多的计数器。通过使用编辑/添加到命令，或者用工具栏上的添加按钮，你就可以往性能监视器中添加计数器。在选择计数器的时候，你还需要注意你添加的某个计数器的不同的实例。例如，有些实例是针对数据库的，还有一些不是。例如，SQL Server 7.0有22个计数器，表示70个实例。</p>
		<p>　　注意，许多计数器都会拖系统性能的后腿，所以小心一点，不要在永久基础上安装一个会给数据库操作带来负面影响的计数器。你还会发现，一些计数器只有当性能监视器开始的时候才能运行，并且当你退出工具时候，它也随之结束。在下一篇文章中，我们将会进一步讨论重要的用于解决问题和优化的工具。<br /><br /></p>
		<p>　　<strong><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">SQL Server </span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">计数器 ——第二部分</span></strong></p>
		<p>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">   </span>在最后的一篇贴士中，我们来看看性能监视器，然后讨论一下它的默认情况下的行为。这里我们将更进一步地察看你需要注意的特定的计数器。</p>
		<p>　　有一些值得察看的明显的瓶颈。当你使用Physical Disk: % Disk Time和Physical Disk: Current Disk Queue Length(全部实例)来测量磁盘I/O，你会想要将磁盘时间计数器保持在2.0以下，还有超过3.0的当前磁盘队列长度(Current Disk Queue Length)就意味着你可能遇到了磁盘I/O瓶颈。同时测量两个计数器，看看它们之间是否有关联，也是个不错的主意;你可以点击检索，使它高亮，然后按下键盘上的Ctrl+H来使选中的检索高亮。第二个瓶颈就是处理器，你应该打开处理器的实例环境:系统中每个处理器的%处理器时间计数器。你可以看到两个值:处理器整体活动，以及处理器负载平衡得怎么样。任何一个负载总是超过80%的处理器都是超载了，需要进行升级了。</p>
		<p>　　4个内存计数器:SQL Server: 缓冲管理器Buffer Manager:缓冲区命中率( Cache Hit Ratio)，惰性写入( Lazy Writes);内存: 页面错误/秒(Page Faults/sec)和 分页文件(Paging File): % 使用率，这些都是值得监控的。任何低于80%的存储区命中率都表示，你需要添加更多的内存来存储缓冲数据了，太大的页面错误率或者分页文件使用率也都是同样的意思。惰性写入通常应该为0，正数表示页面已经写入磁盘。所有这些计数器都可以显示内存是否充足。</p>
		<p>　　还有，不要忘记察看用户连接的数量和你的网络性能。有用的连接计数器有:SQL Server: 一般统计数字(General Statistics):用户连接( User Connections)和 SQL Server:内存管理器( Memory Manager): 连接内存(Connection Memory) (KB)。这些计数器在分析CPU利用率的时候d都会用到，每秒登录数，还有核定的工作空间内存(Granted Workspace Memory)，以上所有这些计数器都与建立和维护你的连接流量有关。</p>
		<p>　　如果你测量磁盘性能来收集一些统计数字，那么你就需要开启diskperf命令——它本身是关闭的，以保证性能不受到影响。在命令提示行下输入diskperf –y，就可以启动这个服务，还可以打开设备控制面板，然后在那里把它启动。你需要重新启动系统，以便让性能监视器接受这个新的设置。你将设置保存到PMC文件中，这个文件专门用于你的SQL Server环境实例。性能监视器也可以保存日志文件，在PerfMon的在线帮助中有详细描述。</p>
		<p>　　PerfMon是作为开发人员的工作创建的，可以被终端用户使用。你拥有创建自己的计数器的能力。察看SQL Server 在线来了解如何完成。例如，你可以使用一个客户计数器来监控某个服务器上即将到来的流量，还有其他几乎任何你能想象得到的东西。</p>
		<p>　　有关SQL Server性能计数器这个话题还有很多信息。除了在线书籍和微软网站(www.microsoft.com/sql 和 TechNet)之外，你还可以在www.sql-server-performance.com的主题中找到很多信息。虽然几乎每一本有关SQL Server的书都在某种程度上涉及了计数器，但是以下的几本有关性能调整的书对这个问题作了比较有深度的讨论。你在上述的几个网站上可以找到书籍列表，点击网站顶端的书籍标签就可以了。</p>
		<p>　　<strong><em>Barrie Sosinsky是Sosinsky and Associates (Medfield MA)咨询公司的总裁。他的著作涉及广泛的计算机主题。公司主要业务为客户软件(数据库和网络相关的)、培训和技术文档。</em></strong></p>
<img src ="http://www.cppblog.com/stevennash/aggbug/13277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 19:16 <a href="http://www.cppblog.com/stevennash/articles/13277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>九大数据仓库开发软件软件功能比较</title><link>http://www.cppblog.com/stevennash/articles/13275.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 11:02:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13275.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13275.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13275.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13275.html</trackback:ping><description><![CDATA[
		<a class="f20">九大数据仓库开发软件软件功能比较</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　<em>请问市面上可供选择的数据仓库解决方案软件有哪些？有什么差别吗？能对它们的性能和特点进行分析和比较吗？</em></p><p>　　IBM、Oracle、Sybase、CA、NCR、Informix、Microsoft、和SAS等有实力的公司相继（通过收购或研发的途径）推出了自己的数据仓库解决方案，BO和Brio等专业软件公司也在前端在线分析处理工具市场上占有一席之地。下面针对这些数据仓库解决方案的性能和特点做分析和比较。 <br /><br />　　IBM IBM公司提供了一套基于可视数据仓库的商业智能（BI）解决方案，包括：Visual Warehouse（VW）、Essbase/DB2 OLAP Server 5.0、IBM DB2 UDB，以及来自<a class="bluekey" href="http://www.yesky.com/key/2123/167123.html" target="_blank">第三方</a>的前端数据展现工具（如BO）和数据挖掘工具（如SAS）。其中，VW是一个功能很强的集成环境，既可用于数据仓库建模和元数据管理，又可用于数据抽取、转换、装载和调度。Essbase/DB2 OLAP Server支持“维”的定义和数据装载。Essbase/DB2 OLAP Server不是ROLAP（Relational OLAP）服务器，而是一个（ROLAP和MOLAP）混合的HOLAP服务器，在Essbase完成数据装载后，数据存放在系统指定的DB2 UDB数据库中。 <br /><br />　　严格说来，IBM自己并没有提供完整的数据仓库解决方案，该公司采取的是合作伙伴战略。例如，它的前端数据展现工具可以是Business Objects的BO、Lotus的Approach、Cognos的Impromptu或IBM的Query Management Facility；多维分析工具支持Arbor Software的Essbase和IBM（与Arbor联合开发）的DB2 OLAP服务器；统计分析工具采用SAS系统。 <br /><br />　　Oracle Oracle数据仓库解决方案主要包括Oracle Express和Oracle Discoverer两个部分。Oracle Express由四个工具组成：Oracle Express Server是一个MOLAP (多维OLAP)服务器，它利用多维模型，存储和管理多维数据库或多维高速缓存，同时也能够访问多种关系数据库；Oracle Express Web Agent通过CGI或Web插件支持基于Web的<a class="bluekey" href="http://www.yesky.com/key/2429/167429.html" target="_blank">动态</a>多维数据展现；Oracle Express Objects前端数据分析工具（目前仅支持Windows平台）提供了图形化建模和假设分析功能，支持可视化开发和事件驱动编程技术，提供了兼容Visual Basic语法的语言，支持OCX和OLE；Oracle Express Analyzer是通用的、面向最终用户的报告和分析工具（目前仅支持Windows平台）。Oracle Discoverer即席查询工具是专门为最终用户设计的，分为最终用户版和管理员版。 <br /><br />　　在Oracle数据仓库解决方案实施过程中，通常把汇总数据存储在Express多维数据库中，而将详细数据存储在Oracle关系数据库中，当需要详细数据时，Express Server通过构造SQL语句访问关系数据库。但目前的Express还不够灵活，数据仓库设计的一个变化往往导致数据库的重构。另外，目前的Oracle 8i和Express 之间集成度还不够高，Oracle 8i和Express之间需要复制元数据，如果Oracle Discoverer（或BO）需要访问汇总数据，则需要将汇总数据同时存放在Oracle和Express中，系统维护比较困难。值得注意的是，刚刚问世的Oracle 9i把OLAP和数据挖掘作为重要特点。<br />Sybase   Sybase提供的数据仓库解决方案称为Warehouse Studio，包括数据仓库的建模、数据抽取与转换、数据存储与管理、元数据管理以及可视化数据分析等工具。其中，Warehouse Architect是PowerDesigner中的一个设计模块，它支持星形模型、雪花模型和ER模型；数据抽取与转换工具包括PowerStage、Replication Server、Carleton PASSPORT，PowerStage是Sybase提供的可视化<a class="bluekey" href="http://www.yesky.com/key/2645/167645.html" target="_blank">数据迁移</a>工具。<br /><br />　　Adaptive Server Enterprise是Sybase企业级关系数据库，Adaptive Server IQ是Sybase公司专为数据仓库设计的关系数据库，它为高性能决策支持系统和数据仓库的建立作了优化处理，Sybase IQ支持各种流行的前端展现工具（如Cognos Impromptu、Business Objects、Brio Query等）；数据分析与展现工具包括PowerDimensions、EnglishWizard、InfoMaker、PowerDynamo等，PowerDimensions是图形化的OLAP分析工具，它支持SMP和多维缓存技术，能够集成异构的关系型数据仓库和分布式数据集市，从而形成单一的、新型的多维模式；数据仓库的维护与管理工具包括Warehouse Control Center、Sybase Central、Distribution Director，其中Warehouse Control Center是为数据仓库<a class="bluekey" href="http://www.yesky.com/key/346/165346.html" target="_blank">开发人员</a>提供的元数据管理工具。 <br /><br />　　Sybase提供了完整的数据仓库解决方案Quick Start DataMart，具有良好的性能，并支持第三方数据展现工具。从Quick Start DataMart的名称不难看出，它尤其适合于数据集市应用。另外，Sybase可以提供面向电信、金融、保险、医疗保健这4个行业的客户关系管理（CRM）产品，在这4个产品中，有80％的功能是共性的，有20％的功能需要Sybase与合作伙伴针对不同需求共同开发。 <br /><br />　　Informix   Informix于1998和1999年相继收购了国际上享有盛誉的数据仓库供应商Red Brick System和数据管理软件供应商Ardent，并提供了完整、集成的数据仓库解决方案。该解决方案还包括一个“快速启动”咨询服务，能够帮助用户快速完成数据仓库或数据集市的开发。Informix产品能够集成Microsoft IIS或Netscape Enterprise/FastTrack服务器，从而支持基于Web的数据仓库应用。 <br /><br />　　Informix没有提供自己的报表和数据挖掘工具，但他们与Brio和SAS公司建立了战略联盟，并推出了“Informix商务智能联盟计划”。该计划以Informix为主，结合Brio的前端数据分析和报表功能，以及SAS的数据挖掘功能，形成了一个“BI中心”打包方案。 <br /><br />　　（今年4月Informix Software已被IBM公司收购，此举将给IBM公司数据库及数据仓库产品，从技术和市场占有率上带来极大的提升。）</p><p>　　CA   CA于1999年收购了Platinum Technology公司后，得到了完整的数据仓库解决方案，包括：Erwin数据仓库设计工具、InfoPump数据转换与抽取工具、InfoBeacon ROLAP服务器、Forest＆Trees前端数据展现工具、Provision系统监视与作业调度工具和DecisionBase元数据管理工具等。 <br /><br />　　与Informix解决方案相似，CA解决方案也提供了数据仓库建模、元数据管理、数据抽取与转换、基于关系数据库的在线分析服务器、系统监视与作业调度、前端数据展现等功能，同时还支持Web应用。不同之处是Informix提供了专门为数据仓库设计的高性能目标数据库（Red Birck），而CA解决方案则提供ODBC接口，并将数据存储在第三方关系数据库(如Oracle、Sybase、SQL Server、Informix和IBM DB2等)中，其性能要打一些折扣，但开放性要好些。另外，CA的OLAP服务器目前只能与Microsoft的IIS Web服务器集成。 <br /><br />　　NCR Teradata   NCR Teradata是高端数据仓库市场最有力的竞争者，主要运行在NCR WorldMark SMP硬件的Unix操作系统平台上。1998年，该公司也提供了基于Windows NT的Teradata，试图开拓数据集市（Data Mart）市场。总的来看，NCR的产品性能很好，Teradata数据仓库在100GB、300GB、1TB和3TB级的TPC??D指标测试中均创世界纪录。但是，NCR产品的价格相对较高，中小企业用户难以接受。<br /><br />　　Microsoft   Microsoft将OLAP功能集成到Microsoft SQL Server 7.0中，提供可扩充的基于COM的OLAP接口。它通过一系列服务程序支持数据仓库应用。数据传输服务DTS（Data Transformation Services）提供数据输入/输出和自动调度功能，在数据传输过程中可以完成数据的验证、清洗和转换等操作，通过与Microsoft Repository集成，共享有关的元数据；Microsoft Repository存储包括元数据在内的所有中间数据；SQL Server OLAP Services支持在线分析处理；PivotTable Services提供客户端OLAP数据访问功能。<br /><br />　　通过这一服务，开发人员可以用VB或其他语言开发用户前端数据展现程序，PivotTable Services还允许在本地客户机上存储数据；MMC（Microsoft Management Console）提供日程安排、存储管理、性能监测、报警和通知的核心管理服务；Microsoft Office 2000套件中的Access和Excel可以作为数据展现工具，另外SQL Server还支持第三方数据展现工具。 <br /><br />　　SAS   SAS公司在20世纪70年代以“统计分析”和“线性<a class="bluekey" href="http://www.yesky.com/key/1409/166409.html" target="_blank">数学</a>模型”而享誉业界，90年代以后，SAS公司也加入了数据仓库市场的竞争，并提供了特点鲜明的数据仓库解决方案，包括30多个专用模块。其中，SAS/WA（Warehouse Administrator）是建立数据仓库的集成管理工具，包括定义主题、数据转换与汇总、更新汇总数据、元数据管理、数据集市的实现等；SAS/MDDB是SAS用于在线分析的多维数据库服务器；SAS/AF提供了屏幕设计功能和用于开发的SCL（屏幕控制语言）；SAS/ITSV（IT Service Vision）是IT服务的性能评估和管理的软件，这些IT服务包括计算机系统、网络系统、Web服务器和电话系统等。SAS系统的优点是功能强、性能高、特长突出，缺点是系统比较复杂。 <br /><br />　　Business Objects   Business Objects（BO）是集查询、报表和OLAP技术为一身的智能决策支持系统。它使用独特的“语义层”技术和“动态微立方”技术来表示数据库中的多维数据，具有较好的查询和报表功能，提供钻取(Drill)等多维分析技术，支持多种数据库，同时它还支持基于Web浏览器的查询、报表和分析决策。虽然BO在不断增加新的功能，但从严格意义上说，BO只能算是一个前端工具。也许正因为如此，几乎所有的数据仓库解决方案都把BO作为可选的数据展现工具。<br /><br />　　虽然国内有很多大学和研究机构从事数据仓库技术的研究，但到目前为止，国内基本上没有成熟的数据仓库解决方案。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 19:02 <a href="http://www.cppblog.com/stevennash/articles/13275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>案例分析：集团数据仓库构建</title><link>http://www.cppblog.com/stevennash/articles/13274.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 11:01:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13274.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13274.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13274.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13274.html</trackback:ping><description><![CDATA[
		<a class="f20">案例分析：集团数据仓库构建</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　问：集团下面有 10多家分公司，每公司有多台数据库服务器(SQL Server, Oracle)未来公司拟建立一个信息中心，建立资料仓库，我想现在多了解这方面的知识，以为后面作准备，请专家指点:</p><p>　　1. 该怎么入门数据仓库这一领域?</p><p>　　3. 数据库有SQL SERVER 和 ORACLE 可以整合到一起吗?</p><p>　　现在集团在作报表整合工作，也就是一张报表要访问多家公司的DB，可是感觉没有好的方法。我们做集团报表整合工作，是这样进行的:我们在集团信息中心一台SQL SERVER 2000 服务器上 建立一个数据库，每天各分公司排程定时把集团报表所需要的数据拋到该服务器，目前遇到如下问题:</p><p>　　1.由于报表很多，涉及各个部门的报表，每天由各个分公司把数据拋过来这样各个公司IT任务都比较重，而且如果TABLE有变动的话，各个公司都要跟着变，各项开销较大，而且排程太多管理起来也困难;</p><p>　　2.集团各个公司的管理人员都要通过IE来查询集团信息中心的报表，这些拋过来的数据，并没有经过汇总整理，所以有些分公司查询报表速度会很慢;如果要让各厂用户直接查询经过预处理的报表结果，这样就可以改善报表访问速度问题，但是如何预处理这些拋过来的数据呢?</p><p>　　请专家指点迷津，给一些好的建议。</p><p>　　答：1.一般来说, 数据仓库不是原有资料的直接整合, 而是根据业务需要, 对历史数据进行定期整理, 抽取分析需要的数据放入数据库中.</p><p>　　一般来说, 这种整理会把该合并的数据合并(例如, 对于销售单, 一般是根据需要按部门,产品,客户等汇总, 而不像业务数据库中那样按单据),</p><p>　　该拆分的拆分, 例如, 对于日期, 一般会把年,季,月这些信息单独拆分出来.</p><p>　　你可以看看数据挖掘, sql server的analyse serversice, olap等方面的资料, 这些在sql联机帮助上就有.</p><p>　　2.数据仓库既然不是直接连接业务数据库, 则是对业务数据的抽取, 自然也就不会存在各种类型的数据库的问题, 因为数据抽取工作就是从不同类型的业务数据库中抽取数据, 最终的结果都是放在同一种数据库中.</p><p>　　从你最后的需求"现在集团在作报表整合工作，也就是一张报表要访问多家公司的DB" 这个也可以看得出来. 你需要的东西用sql server的: analyse server, report server就能满足大多数需求(sql 2005中是BI的功能)</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 19:01 <a href="http://www.cppblog.com/stevennash/articles/13274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>黑客攻破SQL服务器系统的十种方法</title><link>http://www.cppblog.com/stevennash/articles/13272.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:59:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13272.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13272.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13272.html</trackback:ping><description><![CDATA[
		<a class="f20">黑客攻破SQL服务器系统的十种方法</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　无论是使用手工试探还是使用安全测试工具，恶意攻击者总是使用各种诡计从你的防火墙内部和外部攻破你的SQL服务器系统。既然黑客在做这样的事情。你也需要实施同样的攻击来检验你的系统的安全实力。这是理所当然的。下面是黑客访问和攻破运行SQL服务器的系统的十种诡计。</p><p>　　<strong>1.通过互联网直接连接</strong></p><p>　　这些连接可以用来攻击没有防火墙保护、全世界都可以看到和访问的SQL服务器。DShield公司的端口报告显示了有多少系统在那里等待遭受攻击。我不理解允许从互联网直接访问这种重要的服务器的理由是什么。但是，我在我的评估中仍发现了这种安全漏洞。我们都记得SQL Slammer蠕虫对那样多的有漏洞的SQL服务器系统造成的影响。而且，这些直接的攻击能够导致拒绝服务攻击、缓存溢出和其它攻击。</p><p>　　<strong>2.安全漏洞扫描</strong></p><p>　　安全漏洞扫描通常可以基本的操作系统、网络应用程序或者数据库系统本身的弱点。从没有使用SQL安全补丁、互联网信息服务(IIS)设置弱点到SNMP(简单网络管理协议)漏洞等任何事情都能够被攻击者发现，并且导致数据库被攻破。这些坏蛋也需使用开源软件、自己制作的工具软件或者商业性工具软件。有些技术高手甚至能够在命令提示符下实施手工黑客攻击。为了节省时间，我建议使用商业性的安全漏洞评估工具，如Qualys公司的QualysGuard(用于普通扫描)、SPI Dynamics公司的WebInspect(用于网络应用程序扫描)和下一代安全软件公司的“NGSSquirrel for SQL Server”(用于数据库扫描)。这些工具软件很容易使用，提供了最广泛的评估，并且可以提供最佳的结果。图1显示了你可能发现的一些SQL注入安全漏洞。</p><p align="center"><img src="http://searchsecurity.techtarget.com.cn/imagelist/06/03/48e3v4nyxou2.jpg" border="0" /><br />图1:使用WebInspect发现的普通SQL注入安全漏洞。</p><p>　　<strong>3.列举SQL服务器解析服务</strong></p><p>　　在UDP端口1434上运行，这能让你发现隐蔽的数据库实例和更深入地探查这个系统。Chip Andrews的“SQLPing v 2.5”是一个极好的工具，可用来查看SQL服务器系统并且确定版本编号。你的数据库实例即使不监听这个默认的端口，这个工具软件也能发挥作用。此外，当过分长的SQL服务器请求发送到UDP端口1434的广播地址的时候，会出现缓存溢出问题。</p><p>　　<strong>4.破解SA口令</strong></p><p>　　攻击者还可以通过破解SA口令的方法进入SQL服务器数据库。遗憾的是，在许多情况下不需要破解口令，因为没有分配口令。因此，可以使用上面提到的一种小工具SQLPing。Application安全公司的AppDetective和NGS软件公司的NGSSQLCrack等商业性工具软件也有这种功能。</p><p>　　<strong>5.直接利用安全漏洞攻击</strong></p><p>　　使用图1显示的Metasploit等工具软件可以直接实施攻击。这种软件的商业性软件“CANVAS”和“CORE IMPACT”等能够利用在正常的安全漏洞扫描过程中发现的安全漏洞实施攻击。这是非常有效的攻击手段，攻击者可利用这种手段突破系统、从事代码注入或者取得非经授权的命令行访问权限。</p><p align="center"><img src="http://searchsecurity.techtarget.com.cn/imagelist/06/03/7xv5r51j2g64.jpg" border="0" /></p><p>　　<strong>6.SQL注入</strong></p><p>　　SQL注入攻击可以通过没有正确验证用户输入的前端网络应用程序实施。包括SQL指令在内的异常的SQL查询可以直接注入到网络URL(统一资源定位符)中，并且返回一些错误通知，执行一些指令等等。如果你有时间的话，这些攻击可以手工实施。我一旦发现一个服务器有一个潜在的SQL注入安全漏洞，我喜欢使用一种自动的工具深入研究这个漏洞。这些工具包括图3显示的SPI Dynamics公司的SQL注入器等。</p><p align="center"><img src="http://searchsecurity.techtarget.com.cn/imagelist/06/03/yz61l65v24j3.jpg" border="0" /><br />图3:SPI Dynamics公司的SQL注入器自动实施SQL注入过程。</p><p>　　<strong>7.SQL盲注攻击</strong></p><p>　　这些攻击以标准的SQL注入攻击相同的基本方式利用网络应用程序和后端SQL服务器的安全漏洞。最大的区别是攻击者收不到以错误通知形式从网络服务器发回的信息。这种攻击由于涉及到猜口令，速度要比标准的SQL注入攻击慢一些。在这种情况下，你需要一种比较好的工具。那就是图4显示的Absinthe工具。</p><p align="center"><img src="http://searchsecurity.techtarget.com.cn/imagelist/06/03/0odoe8ng349i.jpg" border="0" /><br />图4:Absinthe工具在实施SQL盲注攻击测试。</p><p>　<strong>　8.对系统实施逆向工程</strong></p><p>　　逆向工程的方法可以查找软件的安全漏洞和内存损坏弱点等漏洞。在利用软件安全漏洞方面，可以参考Greg Hoglund和Gary McGraw合著的“如何破解代码”一书，你可以发现有关逆向工程方法的一些讨论。</p><p>　　<strong>9.Google hacks</strong></p><p>　　Google hacks利用Google搜索引擎不同寻常的力量搜出可公开访问的系统泄漏出来的SQL服务器的错误，如“Incorrect syntax near”(附近语法错误)。Johnny Long编写的“Google Hacking Database”数据库中一些Google的查询项目。(查看错误信息和包含口令的文件部分)。黑客能够使用Google找到口令、网络服务器中的安全漏洞、基本的操作系统、公开提供的程序以及其它能够用来攻破SQL服务器系统的东西。通过Google网站的“site:”操作符把这些查询结合在一起同场可以发现你想不到能够找到的东西。</p><p>　<strong>　10.熟读网站源代码</strong></p><p>　　源代码还能够暴露可能导致SQL服务器被攻破的信息。特别是开发人员为了简化身份识别过程把SQL服务器身份识别信息存储在ASP脚本中的情况下更是如此。手工评估或者Google能够在一瞬间就发现这个信息。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:59 <a href="http://www.cppblog.com/stevennash/articles/13272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库定时备份的问题</title><link>http://www.cppblog.com/stevennash/articles/13271.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:58:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13271.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13271.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13271.html</trackback:ping><description><![CDATA[
		<a class="f20">数据库定时备份的问题</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　<strong>问：我写了个数据库备份的存储过程,想在每天的0:00的时候触发.也就是每天把数据库做个备份,现在不知道这个触发器怎么写.请专家给出正确的代码.谢谢</strong></p><p>　　<strong>答：</strong>用触发器目前来看,似乎并不能满足你的要求，即便是可以解决，恐怕也会比较复杂。建议你尝试<strong>用作业调用SP</strong>试一下。</p><p>　　企业管理器</p><p>　　--管理</p><p>　　--SQL Server代理</p><p>　　--右键作业</p><p>　　--新建作业</p><p>　　--"常规"项中输入作业名称</p><p>　　--"步骤"项</p><p>　　--新建</p><p>　　--"步骤名"中输入步骤名</p><p>　　--"类型"中选择"Transact-SQL 脚本(TSQL)"</p><p>　　--"数据库"选择执行命令的数据库</p><p>　　--"命令"中输入要执行的语句:</p><p>　　exec sp_....</p><p>　　--确定</p><p>　　--"调度"项</p><p>　　--新建调度</p><p>　　--"名称"中输入调度名称</p><p>　　--"调度类型"中选择你的作业执行安排</p><p>　　--如果选择"反复出现"</p><p>　　--点"更改"来设置你的时间安排</p><p>　　然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行</p><p>　　设置方法:</p><p>　　我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:58 <a href="http://www.cppblog.com/stevennash/articles/13271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005数据库镜像简介</title><link>http://www.cppblog.com/stevennash/articles/13269.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13269.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13269.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13269.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server 2005数据库镜像简介</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　自从SQL Server 2000以来，你已经能够通过使用复制来创建一个备用的服务器、传输日志，以及备份和重新存储了——但是现在微软又引入了一个内建的工具，它可以实现自动的错误恢复。数据库镜像是SQL Server 2005的一个新特性，它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server上。它还让你可以在发生错误的时候，通过镜像数据库来进行错误恢复。</p><p>　　Edgewood Solutions 的Greg Robidoux 回答了我们一些SQL Server 2005中有关数据库镜像的常见问题，同时还解释了为什么你现在就应该开始测试这个内建的功能来看看它最终是否会给你的环境带来好处。</p><p>　　<strong>什么是数据库镜像?</strong></p><p>　　Robidoux:数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像的拷贝是一个备用的拷贝，不能直接访问;它只用在错误恢复的情况下。</p><p>　　因为是在SQL Server 2005中新引入的特性，这个功能只能用在，这个版本的软件中。在某种程度上说，它是复制和日志传输的混合体:你所有的事物都在事物级别(复制)上移动(日志传输)到你的数据库的一个镜像拷贝上，同时减少了你在实现日志传输或者复制的时候可能会面临的问题。</p><p>　　复制包括大量的移动部分，并且如果你的数据库计划经常改变的话，要保证你的复制运行得流畅也是困难重重。对于日志传输，为了保证同步，同样需要实现很多的处理，例如创建备份、拷贝备份，以及备份重存。如果有一个进程崩溃了，整个处理过程就崩溃了。</p><p>　　<strong>数据库镜像的工作方式是什么?</strong></p><p>　　Robidoux :要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“基本的”，第二个服务器被称作“镜像的”。基本数据库就是你实际用着的数据库，镜像数据库就是你的数据库的备用拷贝。当事务写入你的基本服务器的时候，他们也同样被传送到并写入你的镜像数据库中。</p><p>　　除了基本和镜像之外，你还可以引入另一个可选的组件，名为“证人”。证人数据库是第三个SQL Server 2005运行实例，它是在判断什么时候进行错误恢复的时候，用于基本和镜像之间内部交流。只有当你想实现自动错误恢复的时候用到这个选项。它实现了2比1投票的能力，当我的一个组件不可达，并因此需要进行错误恢复的时候。证人服务器只有在你想实现自动错误恢复的时候才需要用到。</p><p>　　<strong>实现的方式是什么?</strong></p><p>　　Robidoux :数据库镜像提供了三种实现的方式。根据你想要用什么方式来进行错误恢复处理来进行选择。</p><p>　　高可用性:这个操作模式选项允许你在两台服务器上同步事务写入，并支持自动错误恢复。要使用这个选项，你必须还要使用一个证人服务器。</p><p>　　高保护:这个选项可以让你在两台服务器上同步事物写入，但是错误恢复是手工的。因为自动的错误恢复不是这个选项的一部分，所以也不会用到证人服务器。</p><p>　　高性能:这个选项不关心两台服务器上的写入是否是同步的，因此在性能上有所提高。当使用这个选项的时候，你只能假设镜像服务器上的所有事情都是成功完成。这个选项只允许手工的错误恢复，因此不会用到证人服务器。</p><p>　　时刻记住将你的数据自动恢复到第二个拷贝才是数据库镜像的真正好处。因此，大多数的实现可能都是使用的高可达性方式。其他的选项仍然提供了内建的错误恢复过程，但是前提是你在发生错误的时候对进行自动的错误恢复怀有极大的兴趣。</p><p>　　数据库镜像可以工作在哪几个版本上?</p><p>　　Robidoux :数据库镜像只能在标准版、开发版和企业版的SQL Server 2005中找到。基本服务器和镜像服务器的SQL Server运行实例都需要是这几个版本。证人服务器可以运行在任何版本的SQL Server上。此外，还有其他的一些特性是SQL Server的开发版和企业版上特有的，但是标准版具有最基本的功能。</p><p>　　<strong>总结</strong></p><p>　　现如今，SQL Server 2005的数据库镜像已经关掉了，但是所有的功能仍然存在。数据库镜像可以通过使用检索标志来打开——但是微软现在并不支持这个功能了，所以不要在你的产品环境中运行它。数据库镜像将会在本年年末完全实现并被支持。</p><p>　　要打开这个特性并开始你的测试，你可以看看以前的专家知识解答。微软正在寻找额外的反馈，所以你可以看看它是否可以作为你的SQL Server环境的候选。</p><p>　　要找到更多有关数据库镜像的内容，你可以看看<strong>《</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx" target="_blank"><strong><font color="#002c99">SQL Server 2005 在线手册</font></strong></a><strong>》</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx" target="_blank"><img alt="点击进入" src="http://searchdatabase.techtarget.com.cn/imagelist/06/03/3luz99ouhv17.gif" border="0" /></a>，或者看看<strong>《</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx" target="_blank"><strong><font color="#002c99">微软白皮书</font></strong></a><strong>》</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx" target="_blank"><img style="FILTER: ; WIDTH: 17px; HEIGHT: 22px" height="22" alt="点击察看" hspace="0" src="http://searchdatabase.techtarget.com.cn/imagelist/06/03/xs66cze82148.gif" width="17" border="0" /></a>，其中比较详细地解释了数据库镜像的内容。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:57 <a href="http://www.cppblog.com/stevennash/articles/13269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005数据库镜像简介</title><link>http://www.cppblog.com/stevennash/articles/13270.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13270.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13270.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13270.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server 2005数据库镜像简介</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　自从SQL Server 2000以来，你已经能够通过使用复制来创建一个备用的服务器、传输日志，以及备份和重新存储了——但是现在微软又引入了一个内建的工具，它可以实现自动的错误恢复。数据库镜像是SQL Server 2005的一个新特性，它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server上。它还让你可以在发生错误的时候，通过镜像数据库来进行错误恢复。</p><p>　　Edgewood Solutions 的Greg Robidoux 回答了我们一些SQL Server 2005中有关数据库镜像的常见问题，同时还解释了为什么你现在就应该开始测试这个内建的功能来看看它最终是否会给你的环境带来好处。</p><p>　　<strong>什么是数据库镜像?</strong></p><p>　　Robidoux:数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像的拷贝是一个备用的拷贝，不能直接访问;它只用在错误恢复的情况下。</p><p>　　因为是在SQL Server 2005中新引入的特性，这个功能只能用在，这个版本的软件中。在某种程度上说，它是复制和日志传输的混合体:你所有的事物都在事物级别(复制)上移动(日志传输)到你的数据库的一个镜像拷贝上，同时减少了你在实现日志传输或者复制的时候可能会面临的问题。</p><p>　　复制包括大量的移动部分，并且如果你的数据库计划经常改变的话，要保证你的复制运行得流畅也是困难重重。对于日志传输，为了保证同步，同样需要实现很多的处理，例如创建备份、拷贝备份，以及备份重存。如果有一个进程崩溃了，整个处理过程就崩溃了。</p><p>　　<strong>数据库镜像的工作方式是什么?</strong></p><p>　　Robidoux :要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“基本的”，第二个服务器被称作“镜像的”。基本数据库就是你实际用着的数据库，镜像数据库就是你的数据库的备用拷贝。当事务写入你的基本服务器的时候，他们也同样被传送到并写入你的镜像数据库中。</p><p>　　除了基本和镜像之外，你还可以引入另一个可选的组件，名为“证人”。证人数据库是第三个SQL Server 2005运行实例，它是在判断什么时候进行错误恢复的时候，用于基本和镜像之间内部交流。只有当你想实现自动错误恢复的时候用到这个选项。它实现了2比1投票的能力，当我的一个组件不可达，并因此需要进行错误恢复的时候。证人服务器只有在你想实现自动错误恢复的时候才需要用到。</p><p>　　<strong>实现的方式是什么?</strong></p><p>　　Robidoux :数据库镜像提供了三种实现的方式。根据你想要用什么方式来进行错误恢复处理来进行选择。</p><p>　　高可用性:这个操作模式选项允许你在两台服务器上同步事务写入，并支持自动错误恢复。要使用这个选项，你必须还要使用一个证人服务器。</p><p>　　高保护:这个选项可以让你在两台服务器上同步事物写入，但是错误恢复是手工的。因为自动的错误恢复不是这个选项的一部分，所以也不会用到证人服务器。</p><p>　　高性能:这个选项不关心两台服务器上的写入是否是同步的，因此在性能上有所提高。当使用这个选项的时候，你只能假设镜像服务器上的所有事情都是成功完成。这个选项只允许手工的错误恢复，因此不会用到证人服务器。</p><p>　　时刻记住将你的数据自动恢复到第二个拷贝才是数据库镜像的真正好处。因此，大多数的实现可能都是使用的高可达性方式。其他的选项仍然提供了内建的错误恢复过程，但是前提是你在发生错误的时候对进行自动的错误恢复怀有极大的兴趣。</p><p>　　数据库镜像可以工作在哪几个版本上?</p><p>　　Robidoux :数据库镜像只能在标准版、开发版和企业版的SQL Server 2005中找到。基本服务器和镜像服务器的SQL Server运行实例都需要是这几个版本。证人服务器可以运行在任何版本的SQL Server上。此外，还有其他的一些特性是SQL Server的开发版和企业版上特有的，但是标准版具有最基本的功能。</p><p>　　<strong>总结</strong></p><p>　　现如今，SQL Server 2005的数据库镜像已经关掉了，但是所有的功能仍然存在。数据库镜像可以通过使用检索标志来打开——但是微软现在并不支持这个功能了，所以不要在你的产品环境中运行它。数据库镜像将会在本年年末完全实现并被支持。</p><p>　　要打开这个特性并开始你的测试，你可以看看以前的专家知识解答。微软正在寻找额外的反馈，所以你可以看看它是否可以作为你的SQL Server环境的候选。</p><p>　　要找到更多有关数据库镜像的内容，你可以看看<strong>《</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx" target="_blank"><strong><font color="#002c99">SQL Server 2005 在线手册</font></strong></a><strong>》</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx" target="_blank"><img alt="点击进入" src="http://searchdatabase.techtarget.com.cn/imagelist/06/03/3luz99ouhv17.gif" border="0" /></a>，或者看看<strong>《</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx" target="_blank"><strong><font color="#002c99">微软白皮书</font></strong></a><strong>》</strong><a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx" target="_blank"><img style="FILTER: ; WIDTH: 17px; HEIGHT: 22px" height="22" alt="点击察看" hspace="0" src="http://searchdatabase.techtarget.com.cn/imagelist/06/03/xs66cze82148.gif" width="17" border="0" /></a>，其中比较详细地解释了数据库镜像的内容。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:57 <a href="http://www.cppblog.com/stevennash/articles/13270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中的时间计算语句</title><link>http://www.cppblog.com/stevennash/articles/13268.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13268.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13268.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13268.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13268.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL中的时间计算语句</a>
		<br />
		<br />
		<font face="Verdana">     问：请问专家，如何计算一个表中的周起始和截止日期并写到表字段中？ 我要从一个表向另一个表导入数据，并进行转换，用的是VB</font>
		<p>
				<font face="Verdana">           我现在有有一个表 主要字段有<br /></font>
		</p>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
										<font face="Verdana">time_id int<br />time_date datetime<br />year int<br />week_of_year int<br />day nvarhar<br /></font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="Verdana">          想要转换成另外一张表<br /></font>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
										<font face="Verdana">time_id int<br />time_date datetime<br />year int<br />week_of_year nvarchar<br /></font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="Verdana">          原来的表内容是<br /></font>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
										<font face="Verdana">--------------------<br />1 2003-07-09 2003 20 星期日<br />1 2003-07-10 2003 20 星期一<br />1 2003-07-11 2003 20 星期二</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font face="Verdana">          想要变成<br /><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">--------------------<br />1 07/09/2003 2003 第20周（7/9-7/17） <br />1 07/10/2003 2003 第20周（7/9-7/17） <br />1 07/11/2003 2003 第20周（7/9-7/17） <br /></td></tr></tbody></table>         请专家指点，这个语句应该怎么去写？</font>
		</p>
		<p>
				<font face="Verdana">      答： 
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font face="Verdana">if object_id('tablename') is not null drop table tablename<br />select 1 as time_id, '2003-07-09' as time_date, 2003 as [year], 20 as week_of_year, '星期日' as [day]<br />into tablename<br />union select 1, '2003-07-10', 2003, 20, '星期一'<br />union select 1, '2003-07-11', 2003, 20, '星期二'<br />------------------------------------------------<br />select time_id, time_date, [year], '第' + cast(week_of_year as varchar(2)) + '周（' <br />    + cast(month(week_begin) as varchar(2)) + '/' + cast(day(week_begin) as varchar(2)) + '-'<br />    + cast(month(week_end) as varchar(2)) + '/' + cast(day(week_end) as varchar(2)) as week_of_year<br />from (select *, dateadd(day, 1 - datepart(weekday, time_date), time_date) as week_begin, <br />      dateadd(day, 7 - datepart(weekday, time_date), time_date) as week_end from tablename) a<br />/*<br />time_id time_date    year   week_of_year<br />1       2003-07-09   2003   第20周（7/6-7/12）<br />1       2003-07-10   2003   第20周（7/6-7/12）<br />1       2003-07-11   2003   第20周（7/6-7/12）<br />*/<br />------------------------------------------------<br />drop table tablename</font><font face="Verdana"><p><br /></p></font></td></tr></tbody></table></font>
		</p>
		<font face="Verdana">
		</font>
		<p>
				<font face="Verdana">      问题虽然解决了，但这个例子并不具备通用性，还是个案，所以我们分析了你的代码，发现一个问题：日期范围是如何确定的？所以，我们把它延伸发散到：能否自主设定日期的范围呢？比如设定到星期一或星期天开始：</font>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
										<p>思路：<br />SET DATEFIRST<br />将一周的第一天设置为从 1 到 7 之间的一个数字。</p>
										<p>语法<br />SET DATEFIRST { number | @number_var } </p>
										<p>参数<br />number | @number_var</p>
										<p>是一个整数，表示一周的第一天，可以是下列值中的一个。</p>
										<p>值 一周的第一天是 <br />1 星期一 <br />2 星期二 <br />3 星期三 <br />4 星期四 <br />5 星期五 <br />6 星期六 <br />7（默认值，美国英语） 星期日 </p>
										<p>
												<br />注释<br />使用 @@DATEFIRST 函数检查 SET DATEFIRST 的当前设置。</p>
										<p>SET DATEFIRST 的设置是在执行或运行时设置，而不是在分析时设置。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />       <strong>方法一：<br /></strong><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">先创建一个用户函数，根据日期得到周开始日期和结束日期<br />create function getwstend(@resultdate datetime)<br />returns varchar(20)<br />As<br />begin<br />declare @weekstart datetime,@weekend datetime,@dayweek int,@weeknum int<br />set @weeknum = datepart(wk,@resultdate)<br />set @dayweek = datepart(dw,@resultdate)<br />begin<br />set @weekstart = dateadd(dd,1-@dayweek,@resultdate)<br />set @weekend = DateAdd(dd,7-@dayweek,@resultdate)<br />end<br />return '第'+Convert(varchar,@weeknum)+'周'+'('+right(convert(varchar(10),@weekstart,111),5)+'--'+right(Convert(varchar(10),@weekend,111),5)+')'<br />end<br />Go <br />例如：<br />select test.getwstend('2006-4-17') <br />返回结果是：第16周(04/16--04/22)</td></tr></tbody></table>       利用这个函数相信就可以实现你的要求了，把所有表1中的数据转到表2<p>       <strong>方法二：</strong></p><p>      为了避免数据的冗余，建议不要把数据从第一个表转到第二个表。因为这样会造成数据冗余。你可以在查询时候使用函数产生week_of_year nvarchar 这个栏位。</p><p>       <strong>方法三：<br /></strong></p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">创建一个表，栏位为：<br />create table tw<br />(<br />  time_date datetime,<br />  week_of_year nvarchar<br />)<br />然后1910.1.1---2050.12.31之间的所有日期都产生一个对照的week_of_year nvarchar，方法也是使用上面创建的函数。然后查询的时候。只要两个表作关联就可以了</td></tr></tbody></table>       如果原始表中的记录很多。而且日期有很多重复，我们更推荐使用方法三。<br /><img src ="http://www.cppblog.com/stevennash/aggbug/13268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:56 <a href="http://www.cppblog.com/stevennash/articles/13268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server提取特定记录</title><link>http://www.cppblog.com/stevennash/articles/13266.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:53:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13266.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13266.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13266.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server提取特定记录</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　   <strong>问：从表中的最后一个记录开始，往上数第50个记录，提取它，这个SQL语句怎样去写，谢谢专家解答!</strong></p><p>　　答：<strong>如果表中没有自动增长型字段可以这样实现</strong></p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">insert into #t from table</font></p><p><font face="Verdana">declare @cnt int<br />set @cnt=@@rowcount-50<br />set rowcount @cnt<br />delete from #t<br />set rowcount 0<br />select * from #t</font></p><p><font face="Verdana">drop table #t</font></p></td></tr></tbody></table><p>　　<strong>如果，只要第50条那一条记录</strong></p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font face="Verdana">SELECT TOP 1 *<br />FROM (SELECT TOP 50 *<br />        FROM 你的表<br />        ORDER BY 列名 DESC) DERIVEDTBL<br />ORDER BY UserID</font></td></tr></tbody></table><p>　　<strong>如果有id的话，试试</strong></p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font face="Verdana">SELECT *<br />FROM tb1 a<br />where (select count(1) from tb1  where id&gt;=a.id )=50</font></td></tr></tbody></table></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:53 <a href="http://www.cppblog.com/stevennash/articles/13266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server的数据限制</title><link>http://www.cppblog.com/stevennash/articles/13265.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:52:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13265.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13265.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13265.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server的数据限制</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p><font face="Verdana">      <strong>问：请问专家，怎样建立这样一种数据限制，表内的每条数据的某两列不能同时相同？</strong></font></p><p><font face="Verdana">      答：可以考虑建立自定义约束。<br /><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">CREATE TABLE CheckTbl (col1 int, col2 int);<br />GO<br />CREATE FUNCTION CheckFnctn(@col1 INT,@col2 INT)<br />RETURNS bit<br />AS <br />BEGIN<br /> DECLARE @RETURN BIT<br />   IF @col1=@col2<br /> BEGIN<br />  SET @RETURN=0<br /> END<br /> ELSE <br /> BEGIN<br />  SET @RETURN=1<br /> END<br /> RETURN @RETURN<br />END;<br />GO<br />ALTER TABLE CheckTbl<br />ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn(col1,col2)= 1 );<br />GO</td></tr></tbody></table></font></p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:52 <a href="http://www.cppblog.com/stevennash/articles/13265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server去除冗余数据</title><link>http://www.cppblog.com/stevennash/articles/13264.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:51:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13264.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13264.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13264.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13264.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server去除冗余数据</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　<strong>问：请问专家有这么一个表，表T1有两个字段a,b,如下:</strong></p><p>　　a     b</p><p>　　01  10</p><p>　　01  10</p><p>　　01  12</p><p>　　02  20</p><p>　　要求1.删除a、b完全相同的记录，即结果为</p><p>　　a     b</p><p>　　01  12</p><p>　　02  20</p><p>　　要求2.删除a、b完全相同的记录,但保留一条。即结果为</p><p>　　a     b</p><p>　　01  10</p><p>　　01  12</p><p>　　02  20</p><p>　　答：要求1</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">create table tb(a varchar(10),b int)<br />insert into tb<br />select '01',10 union all<br />select '01',10 union all<br />select '01',12 union all<br />select '02',20</font></p><font face="Verdana"><p><br />delete tb<br />from (select a,b from tb group by a,b having count(*)&gt;1) as s<br />where tb.a=s.a and tb.b=s.b</p><p>select * from tb</p><p>drop table tb</p></font></td></tr></tbody></table><p>　　要求2:</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">create table tb(a varchar(10),b int)<br />insert into tb<br />select '01',10 union all<br />select '01',10 union all<br />select '01',12 union all<br />select '02',20</font></p><p><font face="Verdana">select distinct * into #temp from tb</font></p><p><font face="Verdana">delete from tb</font></p><p><font face="Verdana">insert into tb<br />select * from #temp</font></p><p><font face="Verdana">select * from tb</font></p><p><font face="Verdana">drop table tb,#temp</font></p></td></tr></tbody></table><p>　　点评：实际上，这是一个典型的删除数据库重复记录的例子，这个应用在我们日常的数据库管理和编程过程中经常被用到，是一个比较经典的案例，下面给出几个比较常见的SQL Server去除冗余数据的方法给各位做个参考，希望能够帮助各位处理类似的问题：</p><p><span class="f14">　　<strong>开发人员的噩梦——删除重复记录</strong><br /><br />　　想必每一位开发人员都有过类似的经历，在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确。解决该问题的办法就是将这些重复的记录删除，只保留其中的一条。<br /><br />　　在SQL Server中除了对拥有十几条记录的表进行人工删除外，实现删除重复记录一般都是写一段代码，用游标的方法一行一行检查，删除重复的记录。因为这种方法需要对整个表进行遍历，所以对于表中的记录数不是很大的时候还是可行的，如果一张表的数据达到上百万条，用游标的方法来删除简直是个噩梦，因为它会执行相当长的一段时间。 <br /><br />　　<strong>四板斧——轻松消除重复记录</strong><br /><br />　　殊不知在SQL Server中有一种更为简单的方法，它不需要用游标，只要写一句简单插入语句就能实现删除重复记录的功能。为了能清楚地表述，我们首先假设存在一个产品信息表Products，其表结构如下：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>CREATE TABLE Products (<br />ProductID int,<br />ProductName nvarchar (40),<br />Unit char(2),<br />UnitPrice money<br />)</td></tr></tbody></table><br />　　表中的数据如图1：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img style="WIDTH: 550px; HEIGHT: 366px" height="479" onerror="this.src='http://www.yesky.com/image20010518/187750.jpg';" hspace="3" src="http://dev.yesky.com/image20010518/187750.jpg" width="640" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　图1中可以看出，产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录，只保留其中的一条。步骤如下：<br /><br />　　<strong>第一板斧——建立一张具有相同结构的临时表<br /></strong><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>CREATE TABLE Products_temp (<br />ProductID int,<br />ProductName nvarchar (40),<br />Unit char(2),<br />UnitPrice money<br />)</td></tr></tbody></table><br />　　<strong>第二板斧——为该表加上索引，并使其忽略重复的值<br /></strong><br />　　方法是在企业管理器中找到上面建立的临时表Products _temp，单击鼠标右键，选择所有任务，选择管理索引，选择新建。如图2所示。<br /><br />　　按照图2中圈出来的地方设置索引选项。<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/187752.jpg';" hspace="3" src="http://dev.yesky.com/image20010518/187752.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　<strong>第三板斧——拷贝产品信息到临时表<br /></strong><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>insert into Products_temp Select * from Products</td></tr></tbody></table><br />　　此时SQL Server会返回如下提示：<br /><br />　　服务器: 消息 3604，级别 16，状态 1，行 1<br /><br />　　已忽略重复的键。<br /><br />　　它表明在产品信息临时表Products_temp中不会有重复的行出现。<br /><br />　　<strong>第四板斧——将新的数据导入原表</strong><br /><br />　　将原产品信息表Products清空，并将临时表Products_temp中数据导入，最后删除临时表Products_temp。<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>delete Products<br />insert into Products select * from Products_temp<br />drop table Products_temp</td></tr></tbody></table><br />　　这样就完成了对表中重复记录的删除。无论表有多大，它的执行速度都是相当快的，而且因为几乎不用写语句，所以它也是很安全的。<br /><br />　　小提示：上述方法中删除重复记录取决于创建唯一索引时选择的字段，在实际的操作过程中读者务必首先确认创建的唯一索引字段是否正确，以免将有用的数据删除。</span></p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:51 <a href="http://www.cppblog.com/stevennash/articles/13264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用游标的释放问题</title><link>http://www.cppblog.com/stevennash/articles/13263.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:50:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13263.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13263.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13263.html</trackback:ping><description><![CDATA[
		<a class="f20">使用游标的释放问题</a>
		<br />
		<br />
		<font face="Verdana">     使用游标的释放问题</font>
		<p>      问：我在查询分析器中使用,第一次执行,成功插入本班所有人的数学科目记录,换一个班别如'20043班',该语句就不发挥作用了,什么都不执行,关闭查询分析器重新打开一个,粘铁进上面的代码并改变班别,又能够执行,反正就是打开一次查询分析器就能执行一次改游标,不知道为什么??难道DEALLOCATE authors_cursor不能释放游标?</p>
		<font face="Verdana">
				<p>
				</p>
				<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
						<tbody>
								<tr>
										<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
												<p>
														<font face="Verdana">declare @xh nvarchar(20)<br />DECLARE authors_cursor CURSOR FOR <br />    SELECT xh  from xuesheng where bh='20042班'<br />OPEN authors_cursor<br /> <br />WHILE @@FETCH_STATUS = 0<br />BEGIN<br />       FETCH NEXT FROM authors_cursor INTO @xh  <br />       insert into table1(xh,kc) values(@xh,'数学')  <br />end </font>
												</p>
												<p>
														<font face="Verdana">CLOSE authors_cursor<br />DEALLOCATE authors_cursor</font>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>       请专家能否提供一个例子</p>
		</font>
		<font face="Verdana">参考一下？</font>
		<p>
				<font face="Verdana">       答：让我们先一块看一个例子：有如下一个表:<br /></font>
				<font face="Verdana">
						<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
								<tbody>
										<tr>
												<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">货号,  毛需求,订单供给,仓存供给,<br />101    500    0     0  <br />101      0    100       0<br />101      0     0        400<br />要得到如下表:(要用什么sql语句???)<br />货号,   毛需求   订单供给,仓存供给 ,  累计可用量<br />101     500        0       0           -500<br />101      0        100      0           -400<br />101      0         0       400           0 
<p><font face="Verdana">累计可用量 = 上一个累计可用量 + 订单供给 + 仓存供给-毛需求</font></p><p><font face="Verdana">declare @a table(货号 int,毛需求 int,订单供给 int,仓存供给 int)<br />insert @a(货号,毛需求,订单供给,仓存供给)<br />values(101,500,0,0)<br />insert @a(货号,毛需求,订单供给,仓存供给)<br />values(101,0,100,0)<br />insert @a(货号,毛需求,订单供给,仓存供给)<br />values(101,0,0,400)<br />insert @a(货号,毛需求,订单供给,仓存供给)<br />values(101,200,0,400)<br />select * from @a</font></p><font face="Verdana"><p><br />declare @b table(货号 int,毛需求 int,订单供给 int,仓存供给 int,累计 int)<br />declare @num int<br />set @num=0</p><p>declare @a1 int<br />declare @a2 int<br />declare @a3 int<br />declare Num_Cursor CURSOR FOR                      --游标的定义<br />select 毛需求,订单供给,仓存供给 from @a<br />open Num_Cursor                                    --打开游标<br />fetch next from Num_Cursor into @a1,@a2,@a3<br />while @@FETCH_STATUS=0<br />begin<br /> set @num=@num+@a2+@a3-@a1<br /> insert @b(毛需求,订单供给,仓存供给,累计)        <br /> values(@a1,@a2,@a3,@num)<br />fetch next  from Num_Cursor  into  @a1,@a2,@a3      --循环<br />end<br />close Num_Cursor                                    --关闭游标<br />deallocate Num_Cursor                               --销毁游标</p><p><br />select * from @b</p></font></td>
										</tr>
								</tbody>
						</table>
				</font>
		</p>
		<p>      再看看你提供的源代码： 
</p>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
										<p>declare @xh nvarchar(20)<br />DECLARE authors_cursor CURSOR FOR <br />    SELECT xh  from xuesheng where bh='20042班'<br />OPEN authors_cursor<br /> <br />WHILE @@FETCH_STATUS = 0<br />BEGIN<br />       --FETCH NEXT FROM authors_cursor INTO @xh  <br />       insert into table1(xh,kc) values(@xh,'数学')  <br />end <br />fetch next  from authors_cursor  into @xh  --看来应该是这一句出现了问题；<br />CLOSE authors_cursor<br />DEALLOCATE authors_cursor</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/stevennash/aggbug/13263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:50 <a href="http://www.cppblog.com/stevennash/articles/13263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程:轻松过滤SQL Server连接</title><link>http://www.cppblog.com/stevennash/articles/13262.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13262.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13262.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13262.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13262.html</trackback:ping><description><![CDATA[
		<a class="f20">存储过程:轻松过滤SQL Server连接</a>
		<br />
		<br />
		<a class="f1">  
<div class="guanggao"><span id="contentAdv"></span></div><p>　　存储过程:轻松过滤SQL Server连接</p><p>　　供稿人:Brian Walker</p><p>　　这篇文章继续我们对系统存储过程进行的系列讨论，通过一个例程列出有关SQL Server连接或者在某个选中的连接上执行操作的信息。</p></a>请访问每个月更新两次的<font color="#002c99"><strong>sp_ListConnections 例程</strong></font>(见后文)或者<a href="http://searchsqlserver.techtarget.com/tipsIndex/0,289482,sid87_tax301764_alpD_idx0,00.html" target="_blank"><font color="#002c99"><strong>存储过程的完全列表<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" alt="察看链接" src="http://searchdatabase.techtarget.com.cn/imagelist/06/26/b7rn8hamf84d.gif" border="1" /></strong></font></a>。<p>　　SQL Server数据库管理员需要时刻保持对服务器上连接的警惕。为了某种模式的应用，管理员需要监控这些连接;列出具有问题的连接，然后采取行动来进行修整;或者是在某个选中的连接上执行操作，例如结束某个连接。这有些困难，但是不是不可能的，要执行这些任务需要使用企业管理器(Enterprise Manager)。一个忙碌的数据库管理员需要一个更加方便的工具。</p><p>　　列表1中的SQL 代码创建了一个系统存储过程，名字为sp_ListConnections。</p><p>　　这个sp_ListConnections存储过程接受8个参数，但都不是必需的。</p><p>　　第一个参数(@DBUltra)是可选的，可用来指明是否需要限制列表为只显示那些被阻塞的连接。0这个值表示，所有符合条件的连接都应该列出来。1这个值表示只有被阻塞的和正在阻塞的连接列出来。</p><p>　　第二个参数(@PCUltra)是可选的，用来指定是否需要将列表限制为只显示那些活动的连接(正在处理T-SQL语句。)0值表示，所有符合条件的连接都应该列出来。1值表示只有活动的连接显示出来。</p><p>　　随后的四个参数都是可选的，并且在一起用来形成一个通过名字作为选择关键条件的组合形式。请参考我以前写的文章，看看我对这些参数的工作方式的解释。这些参数指定了需要考虑的数据库、应用程序、登陆或者客户机。</p><p>　　第七个参数(@DBTrain)是可选的，用来指定如何应用前面四个参数。D值表示通过使用这些参数按照名字选出某个数据库。A值表示通过使用这些参数按照名字选出的是应用程序。L值表示使用这些参数选出的是登录名。其他值表示通过使用这些参数选出的是客户机的名字。</p><p>　　最后一个参数(@PCTrain)是可选的，可用来指定在某个选定的连接上执行什么操作。这个操作可以是在每个连接上执行T-SQL代码。也可以是给客户机发送消息。接收到消息的客户机就是那些包括在其他参数中的客户机。所有的@DBTrain数值都是有效的，并且发送给任何一个客户机的消息都只有一个。</p><p>　　如果@PCTrain的数值包括了字符串“@@SPID”，那么就假设它是T-SQL代码。用当前的连接ID替换了"@@SPID"之后，T-SQL代码在每个连接上执行。</p><p>　　如果@PCTrain的数值是一个简单的文本消息，那么消息就会传输到客户机上。消息可以不包含CR/LF字符。</p><p>　　如果@PCTrain数值是数字的，那么就认为这个数字是SQL Server的错误号，就会从sysmessages表中找到相应的信息发送给客户机。客户消息可以添加到sysmessages表中，通过使用sp_addmessage系统存储过程来完成(查看MSDN了解详细信息)。</p><p>　　注意:发送消息给客户机的能力依赖于Windows消息服务。SQL Server所在的机器和客户机上的这个服务必须是启动的，sp_ListConnections存储过程返回了有关SQL Server连接或者在某个连接上执行某项操作的信息。连接通过@DBUltra, @PCUltra和其他参数经过了过滤。如果@PCTrain提供的指定操作执行了，那么就不会返回有关连接信息的集合了。</p><p>　　我建议使用查询分析器(Query Analyzer)中工具菜单下的用户选项来建立正确的存储过程调用，那么它就可以通过简单的键盘组合来执行了。下面这个截屏图像演示了我的建议。</p><p align="center"><a href="http://searchdatabase.techtarget.com.cn/" target="_blank"><img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" alt="存储过程：轻松过滤SQL Server连接" src="http://searchdatabase.techtarget.com.cn/imagelist/06/26/bm1v8x94umwd.JPG" border="1" /></a></p><p>　　用户选项</p><p>　　请注意，在下面的例子中，网页的格式可能会导致某个参数值转到第二行。如果是这样的话，在执行代码之前，删除额外的CR/LF。</p><p>　　下面这个例子列出了涉及阻塞的连接的信息。</p><p>　　EXECUTE sp_ListConnections 1</p><p>　　这个例子通过SQL Agent任务系统列出了连接的信息。</p><p>　　EXECUTE sp_ListConnections 0,0,NULL,NULL,'SQLAgent%',NULL,'A'</p><p>　　这个例子列出了Northwind数据库上所有活动的连接。</p><p>　　EXECUTE sp_ListConnections 0,1,NULL,NULL,'Northwind',NULL,'D'</p><p>　　这个例子向sysmessages表中添加了客户消息。</p><p>　　EXECUTE sp_addmessage 50001,16,N'The server will be restarted in 10 minutes.'</p><p>　　这个例子给所有连接到服务器上的计算机发送了一条客户消息。</p><p>　　EXECUTE sp_ListConnections @PCTrain = '50001'</p><p>　　这个例子给连接到Northwind数据库的连接所在的计算机发送了一条文字消息。</p><p>　　EXECUTE sp_ListConnections 0,0,'Northwind',NULL,NULL,NULL,'D','The Northwind database will go offline in 10 minutes.'</p><p>　　这个例子中断了连接到Northwind数据库上的连接。</p><p>　　EXECUTE sp_ListConnections 0,0,'Northwind',NULL,NULL,NULL,'D','KILL @@SPID'</p><p>　　我希望这个系统存储过程能对你有用。</p><p>　　<strong><a href="http://media.techtarget.com/digitalguide/images/Misc/sp_ListConnections.txt" target="_blank"><font color="#002c99">点击这里查看存储过程: sp_ListConnections</font></a></strong></p><p>　　<strong><em>作者简介:Brian Walker i是一位高级数据库架构师，他所在的信息系统部门使用SQL Server 2000，以及.NET框架。他在IT领域有超过25年的工作经验，最近的几年他将注意力集中在数据库和SQL Server上。Walker是软件开发人员、数据库开发人员、数据库管理员和数据库顾问。他出于兴趣在业余时间开发了一些有用的软件，其中包括很大一部分SQL Server工具。<br /></em></strong></p><pre>--------------------------------------------------------------------
<br />Stored Procedure: sp_ListConnections
<br />--------------------------------------------------------------------
USE master
GO
CREATE PROCEDURE dbo.sp_ListConnections
    @DBUltra bit = 0,
    @PCUltra bit = 0,
    @DBIntra varchar(8000) = NULL,
    @DBExtra varchar(8000) = NULL,
    @PCIntra varchar(100)  = NULL,
    @PCExtra varchar(100)  = NULL,
    @DBTrain    char(1)    = NULL,
    @PCTrain varchar(2000) = NULL
AS

SET NOCOUNT ON

DECLARE @Return int
DECLARE @Retain int
DECLARE @Status int

SET @Status = 0

DECLARE @Task varchar(4000)

DECLARE @Work varchar(2000)

DECLARE @Host varchar(200)

DECLARE @SPID smallint

DECLARE @SPOT smallint

SET @SPOT = CASE WHEN CHARINDEX('2000 - 8',@@VERSION,1) &gt; 0 THEN 50 ELSE 12 END

SET @Work = REPLACE(@PCTrain,CHAR(94),CHAR(39))

IF @PCTrain IS NULL

    BEGIN

       SELECT P.spid AS [ID]
            , RTRIM(P.hostname) AS [Client]
            , RTRIM(P.loginame) AS [Login]
            , RTRIM(P.program_name) AS [Application]
            , RTRIM(O.name) AS [Database]
            , P.open_tran AS [Tran]
            , P.blocked AS [Block]
            , STR(P.waittime/1000.0,5) AS [Wait]
            , CASE P.waittype
              WHEN 0x0000 THEN ''
              WHEN 0x0001 THEN 'Lock: Schema S'
              WHEN 0x0002 THEN 'Lock: Schema M'
              WHEN 0x0003 THEN 'Lock: S'
              WHEN 0x0004 THEN 'Lock: U'
              WHEN 0x0005 THEN 'Lock: X'
              WHEN 0x0006 THEN 'Lock: IS'
              WHEN 0x0007 THEN 'Lock: IU'
              WHEN 0x0008 THEN 'Lock: IX'
              WHEN 0x0009 THEN 'Lock: SIU'
              WHEN 0x000A THEN 'Lock: SIX'
              WHEN 0x000B THEN 'Lock: UIX'
              WHEN 0x000C THEN 'Lock: BU'
              WHEN 0x000D THEN 'Lock: RangeS S'
              WHEN 0x000E THEN 'Lock: RangeS U'
              WHEN 0x000F THEN 'Lock: RangeI N'
              WHEN 0x0010 THEN 'Lock: RangeI S'
              WHEN 0x0011 THEN 'Lock: RangeI U'
              WHEN 0x0012 THEN 'Lock: RangeI X'
              WHEN 0x0013 THEN 'Lock: RangeX S'
              WHEN 0x0014 THEN 'Lock: RangeX U'
              WHEN 0x0015 THEN 'Lock: RangeX X'
              WHEN 0x0041 THEN 'DTC'
              WHEN 0x0042 THEN 'OLEDB Provider'
              WHEN 0x0081 THEN 'Writelog'
              WHEN 0x0208 THEN 'CX Packet List'
              WHEN 0x020A THEN 'Shutdown'
              WHEN 0x020B THEN 'WAITFOR'
              WHEN 0x0400 THEN 'Latch NL'
              WHEN 0x0401 THEN 'Latch KP'
              WHEN 0x0402 THEN 'Latch SH'
              WHEN 0x0403 THEN 'Latch UP'
              WHEN 0x0404 THEN 'Latch EX'
              WHEN 0x0405 THEN 'Latch DT'
              WHEN 0x0410 THEN 'PageLatch NL'
              WHEN 0x0411 THEN 'PageLatch KP'
              WHEN 0x0412 THEN 'PageLatch SH'
              WHEN 0x0413 THEN 'PageLatch UP'
              WHEN 0x0414 THEN 'PageLatch EX'
              WHEN 0x0415 THEN 'PageLatch DT'
              WHEN 0x0420 THEN 'PageIOLatch NL'
              WHEN 0x0421 THEN 'PageIOLatch KP'
              WHEN 0x0422 THEN 'PageIOLatch SH'
              WHEN 0x0423 THEN 'PageIOLatch UP'
              WHEN 0x0424 THEN 'PageIOLatch EX'
              WHEN 0x0425 THEN 'PageIOLatch DT'
              WHEN 0x0800 THEN 'Network IO'
                          ELSE 'System Task' END AS [Type]
            ,   RTRIM(P.status) AS [Status]
            ,    LEFT(P.cmd,08) AS [Command]
            , CONVERT(varchar(20),P.last_batch,20) AS [Submission]
            , CONVERT(varchar(20),P.login_time,20) AS [Connection]
         FROM master.dbo.sysprocesses AS P
         JOIN master.dbo.sysdatabases AS O
           ON P.dbid = O.dbid
    LEFT JOIN master.dbo.sysprocesses AS Z
           ON P.spid = Z.blocked
        WHERE P.spid &gt; @SPOT
          AND (@DBIntra IS NULL OR CHARINDEX('|'+CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END+'|','|'+(@DBIntra)+'|') &gt; 0)
          AND (@DBExtra IS NULL OR CHARINDEX('|'+CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END+'|','|'+(@DBExtra)+'|') = 0)
          AND (@PCIntra IS NULL OR               CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END     LIKE @PCIntra)
          AND (@PCExtra IS NULL OR               CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END NOT LIKE @PCExtra)
          AND CASE
              WHEN @DBUltra = 0
              THEN 1
              WHEN P.blocked != 0
              THEN 1
              WHEN Z.spid IS NOT NULL
              THEN 1
              ELSE 0 END &gt; 0
          AND CASE
              WHEN @PCUltra = 0
              THEN 1
              WHEN P.spid != @@PROCID AND RTRIM(P.status) != 'sleeping'
              THEN 1
              WHEN P.spid != @@PROCID AND  LEFT(P.cmd,08) != 'AWAITING'
              THEN 1
              ELSE 0 END &gt; 0
     ORDER BY [Client],[Login],[Application],[Database],[Connection],[Submission]

    SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

    END

ELSE

    BEGIN

    IF ISNUMERIC(@PCTrain) &lt;&gt; 0

        BEGIN

        SELECT @Work = description FROM master.dbo.sysmessages WHERE error = CONVERT(int,@PCTrain)

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        END

    IF CHARINDEX('@@SPID',@Work) = 0

        BEGIN

          DECLARE Items CURSOR FAST_FORWARD FOR
           SELECT RTRIM(P.hostname)
             FROM master.dbo.sysprocesses AS P
             JOIN master.dbo.sysdatabases AS O
               ON P.dbid = O.dbid
        LEFT JOIN master.dbo.sysprocesses AS Z
               ON P.spid = Z.blocked
            WHERE P.spid &gt; @SPOT
              AND (@DBIntra IS NULL OR CHARINDEX('|'+CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END+'|','|'+(@DBIntra)+'|') &gt; 0)
              AND (@DBExtra IS NULL OR CHARINDEX('|'+CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END+'|','|'+(@DBExtra)+'|') = 0)
              AND (@PCIntra IS NULL OR               CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END     LIKE @PCIntra)
              AND (@PCExtra IS NULL OR               CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END NOT LIKE @PCExtra)
              AND CASE
                  WHEN @DBUltra = 0
                  THEN 1
                  WHEN P.blocked != 0
                  THEN 1
                  WHEN Z.spid IS NOT NULL
                  THEN 1
                  ELSE 0 END &gt; 0
              AND CASE
                  WHEN @PCUltra = 0
                  THEN 1
                  WHEN P.spid != @@PROCID AND RTRIM(P.status) != 'sleeping'
                  THEN 1
                  WHEN P.spid != @@PROCID AND  LEFT(P.cmd,08) != 'AWAITING'
                  THEN 1
                  ELSE 0 END &gt; 0
         GROUP BY RTRIM(P.hostname)
         ORDER BY RTRIM(P.hostname)

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        OPEN Items

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        FETCH NEXT FROM Items INTO @Host

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        WHILE @@FETCH_STATUS = 0 AND @Status = 0

            BEGIN

            SET @Task = 'NET SEND ' + @Host + CHAR(32) + @Work

            EXECUTE @Return = master.dbo.xp_cmdshell @Task, NO_OUTPUT

            SET @Retain = @@ERROR

            IF @Status = 0 SET @Status = @Retain
            IF @Status = 0 SET @Status = @Return

            FETCH NEXT FROM Items INTO @Host

            SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

            END

        CLOSE Items DEALLOCATE Items

        END

    ELSE

        BEGIN

          DECLARE Items CURSOR FAST_FORWARD FOR
           SELECT P.spid
             FROM master.dbo.sysprocesses AS P
             JOIN master.dbo.sysdatabases AS O
               ON P.dbid = O.dbid
        LEFT JOIN master.dbo.sysprocesses AS Z
               ON P.spid = Z.blocked
            WHERE P.spid &gt; @SPOT
              AND (@DBIntra IS NULL OR CHARINDEX('|'+CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END+'|','|'+(@DBIntra)+'|') &gt; 0)
              AND (@DBExtra IS NULL OR CHARINDEX('|'+CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END+'|','|'+(@DBExtra)+'|') = 0)
              AND (@PCIntra IS NULL OR               CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END     LIKE @PCIntra)
              AND (@PCExtra IS NULL OR               CASE @DBTrain WHEN 'D' THEN RTRIM(O.name) WHEN 'A' THEN RTRIM(P.program_name) WHEN 'L' THEN RTRIM(P.loginame) ELSE RTRIM(P.hostname) END NOT LIKE @PCExtra)
              AND CASE
                  WHEN @DBUltra = 0
                  THEN 1
                  WHEN P.blocked != 0
                  THEN 1
                  WHEN Z.spid IS NOT NULL
                  THEN 1
                  ELSE 0 END &gt; 0
              AND CASE
                  WHEN @PCUltra = 0
                  THEN 1
                  WHEN P.spid != @@PROCID AND RTRIM(P.status) != 'sleeping'
                  THEN 1
                  WHEN P.spid != @@PROCID AND  LEFT(P.cmd,08) != 'AWAITING'
                  THEN 1
                  ELSE 0 END &gt; 0
         GROUP BY P.spid
         ORDER BY P.spid

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        OPEN Items

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        FETCH NEXT FROM Items INTO @SPID

        SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

        WHILE @@FETCH_STATUS = 0 AND @Status = 0

            BEGIN

            SET @Task = REPLACE(@Work,'@@SPID',CONVERT(varchar(5),@SPID))

            EXECUTE (@Task)

            SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

            FETCH NEXT FROM Items INTO @SPID

            SET @Retain = @@ERROR IF @Status = 0 SET @Status = @Retain

            END

        CLOSE Items DEALLOCATE Items

        END

    END

IF @Status = 1 OR @Status NOT BETWEEN 0 AND 50000 RAISERROR ('Windows error [%d]',16,1,@Status)

SET NOCOUNT OFF

RETURN (@Status)

GO

--------------------------------------------------------------------<br /><br /><br /><br /><br /><br /><br /></pre><img src ="http://www.cppblog.com/stevennash/aggbug/13262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:48 <a href="http://www.cppblog.com/stevennash/articles/13262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005 动态管理视图:了解你的服务器</title><link>http://www.cppblog.com/stevennash/articles/13260.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:38:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13260.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13260.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13260.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13260.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server 2005 动态管理视图:了解你的服务器</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　<strong>SQL Server 2005 动态管理视图:了解你的服务器的状态</strong></p><p>　　供稿人:Adam Machanic</p><p>　　想知道到底哪一个运行T-SQL的连接阻塞了其他的连接?是的，你可以运行sp_who或者查询syslockinfo表，但是如果你想了解更多有关如何调试这个问题的信息怎么办?例如，你如何才能判断阻塞进程运行的是哪一个T-SQL，或者阻塞进程在等待哪一个资源?</p><p>　　唉，对于老一些版本的SQL Server来说，要获得这些问题的答案可是不易。历史上，数据库管理系统并不是由于它的透明度而被人们所认识。系统表提供了一些可见性，数据库控制台命令(DBCC)提供得多一些，还有更多的是通过各种没有文档的渠道获得。但是要将这些资源集中到一个单个的查询中，即使是回答一个表面化的简单的问题都是一项巨大的工程。</p><p>　　<strong>进入数据库管理视图</strong></p><p>　　如果你看过我以前写的有关SQL Server 2005 分类视图的贴士，你可以了解系统表在最后一版的数据库管理系统中进行了较大的升级。但是关于这个升级的最有趣的组件是一个叫做“动态管理视图(DMV)”的东西。尽管分类视图允许你检索有关静态数据库对象的信息，例如表和存储过程，动态管理视图却可以展示更多的动态信息。</p><p>　　现在你可以访问以前只能通过性能计数器访问的信息了;通过使用动态管理视图，你可以发现更多的详细信息，并且用它来做更多的事情。例如，这里有5个与查询计划存储区有关的SQL Server性能计数器，还有更多的几个应用在缓冲存储器上。但是这些计数器是合计的，他们无法告诉你，例如，哪个计划被存储了或者由于每个缓冲存储区条目引起的磁盘I/O的数量。动态管理视图可以。查看sys.dm_exec_cached_plans视图就可以获得有关查询计划存储区的信息，还有sys.dm_os_memory_cache_entries视图可以提供非常具体的缓冲存储区的信息。</p><p>　　与性能计数器类似，通过动态管理视图检索到的信息也不是你访问当时的最新信息。根据视图的查询情况，这些视图提供的数据每秒钟被更新了数千次。所以阅读并理解一段时间的输出的关键就是取样。如果你需要监控某种条件，那么不要通过动态管理视图来捕捉每个时刻的状态。采用常见的快照来寻找一般的或者变化的<a class="bluekey" href="http://com.chinabyte.com/trend/" target="_blank"><font color="#002c99">趋势</font></a>。或取少量的数据不但可以帮助你头脑清醒，还可以防止可能让你的服务器崩溃的数据采集。</p><p>　　<strong>使用数据库管理视图</strong></p><p>　　那么你可以在哪里找到这些权威的视图呢?启动SQL Server Management Studio，打开对象浏览器。找到“主”数据库，然后打开它的视图层次，然后打开系统视图。向下滚动，直到你看到以dm_开头的视图——这些就是动态管理视图了。还可以通过Table-valued函数的形式进入。打开Programmability这个层次，然后在函数下面，系统函数，最终是Table-valued函数。你可以看到有关的动态管理函数。这些函数可以在连接视图的时候用于特殊的帮助任务。</p><p>　　你要注意的第一件事情就是，动态管理视图是基于他们所属的10个类别命名的。例如，dm_broker视图包含了有关SQL Server Broker(代理)的信息;dm_fts视图显示了可以帮助管理员进行全文本搜索的信息。但是不要认为来自某个分类的视图就不可以加入来自其他分类的信息——这就是动态管理视图的真正强大之处。</p><p>　　让我们回顾本文早先提到的一个问题:你不但可以判断，一个阻塞进程运行了什么T-SQL，还可以判断这个进程在等待什么?</p><p>　　从“exec”(execution)视图分类开始，特别是sys.dm_exec_requests视图。通过查看blocking_session_id字段了解阻塞的进程。如果字段是非空的， session_id字段标识的那个会话就是被另一个由blocking_session_id字段标识的会话阻塞了(查看微软在线书籍了解更多详细描述)。现在，回到同一个视图，查询阻塞会话的sql_handle字段的数值。将这个字段作为sys.dm_exec_sql_text函数的输入，检索阻塞了其他进程的T-SQL连接。</p><p>　　现在，你如何获知被阻塞的资源?跳过“os”(SQLOS)视图分类，查询sys.dm_os_waiting_tasks视图。这个视图恰好拥有一个名为session_id的字段，——惊喜，惊喜——你可以用它来使该行与sys.dm_exec_requests视图的blocking_session_id字段产生关联。</p><p>　　你如何将其放在一起来找到当前哪个查询阻塞了其他的查询，还有他们在等待什么资源?以下的查询是一个不错的起始点。</p><p>　　SELECT</p><p>　　blocked_query.session_id AS blocked_session_id,</p><p>　　blocking_query.session_id AS blocking_session_id,</p><p>　　sql_text.text AS blocking_text,</p><p>　　waits.wait_type AS blocking_resource</p><p>　　FROM sys.dm_exec_requests blocked_query</p><p>　　JOIN sys.dm_exec_requests blocking_query ON</p><p>　　blocked_query.blocking_session_id = blocking_query.session_id</p><p>　　CROSS APPLY</p><p>　　(</p><p>　　SELECT *</p><p>　　FROM sys.dm_exec_sql_text(blocking_query.sql_handle)</p><p>　　) sql_text</p><p>　　JOIN sys.dm_os_waiting_tasks waits ON</p><p>　　waits.session_id = blocking_query.session_id</p><p>　　很遗憾，本文篇幅所限，只能略为涉及动态管理视图提供的强大功能的皮毛。关注本网站，阅读后续的贴士，里面包含更多有深度的场景，它可以帮助你追踪微妙的性能和利用率问题。与此同时，开始探索吧!数据库管理系统内部工作机制的这种级别的可见度对于SQL Server数据库管理员们来说，可是一个新的景象，这些信息可以加以无穷的利用。</p><p>　　<strong><em>作者简介:Adam Machanic是一位偏重数据库的软件工程师，作家和发言人，他生活在马萨诸塞州波士顿。他用SQL Server实现了各种类型的高可用性在线事务处理，以及大型数据仓库应用程序，同时在.NET数据访问层性能优化方面也有造诣。他是SQL Server方面的微软最有价值专家(MVP),还是微软认证的专家。Machanic还是Apress出版社的《Pro SQL Server 2005》一书的合著者。</em></strong></p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:38 <a href="http://www.cppblog.com/stevennash/articles/13260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库系统紧急故障处理方法（2）</title><link>http://www.cppblog.com/stevennash/articles/13258.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:36:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13258.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13258.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13258.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13258.html</trackback:ping><description><![CDATA[
		<a class="f20">数据库系统紧急故障处理方法（2）</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　<strong>新增archives 时的状况：</strong><br /><br />　　条件和假设：自上次镜像备份以来已经生成新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的镜像（冷）拷贝；archive log(s) 可用。 <br /><br />　　恢复步骤： <br /><br />　　1. 如果数据库尚未关闭，则首先把它关闭： <br /><br />　　$ svrmgrl <br />　<br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; shutdown abort <br /><br />　　2. 将备份文件抄送回原始地点： <br /><br />　　所有Database Files <br /><br />　　所有Control Files（没有archive(s) 或redo(s) 的情况下，control files 的更新无任何意义） <br /><br />　　所有On-Line Redo Logs (Not archives) <br /><br />　　init.ora file（选项） <br /><br />　　3. 启动数据库： <br /><br />　　$ svrmgrl <br /><br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; startup <br /><br />　　数据文件, 重作日志和控制文件同时丢失或损坏： <br /><br />　　条件和假设：Archivelog Mode; 有同步的所有所失文件的镜像（冷）拷贝；archive log(s) 可用 <br /><br />　　恢复步骤（必须采用不完全恢复的手法）： <br />　　<br />　　1. 如果数据库尚未关闭，则首先把它关闭： <br /><br />　　$ svrmgrl <br /><br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; shutdown abort <br /><br />　　2. 将备份文件抄送回原始地点： <br /><br />　　所有Database Files <br /><br />　　所有Control Files <br /><br />　　所有On-Line Redo Logs(Not archives) <br /><br />　　init.ora file（选项） <br /><br />　　3. 启动数据库然而并不打开： <br /><br />　　svrmgrl&gt;startup mount <br /><br />　　4. 做不完全数据库恢复，应用所有从上次镜像（冷）备份始积累起来的archives： <br /><br />　　svrmgrl&gt; recover database until cancel using backup controlfile; <br /><br />　　...... <br />　　...... <br /><br />　　cancel <br /><br />　　5. Reset the logfiles （对启动而言不可省略）： <br /><br />　　svrmgrl&gt; alter database open resetlogs; <br />　<br />　　6. 关闭数据库并做一次全库冷备份。 <br /><br />　　<strong>数据文件和控制文件同时丢失或损坏：</strong><br /><br />　　条件和假设：Archivelog Mode; 有同步的datafile(s) 和control file(s) 的冷拷贝；archive log(s) 可用 </p><p>恢复步骤： <br /><br />　　1. 将冷拷贝的datafiles(s) 和control file(s) 抄送回原始地点: <br /><br />　　$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf <br /><br />　　$ cp /backup/control1.ctl /disk1/control1.ctl <br /><br />　　2. 以mount 选项启动数据库： <br /><br />　　$ svrmgrl <br /><br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; startup mount <br />　　<br />　　3. 以旧的control file 来恢复数据库： <br /><br />　　svrmgrl&gt; recover database until cancel using backup controlfile; <br /><br />　　*** 介质恢复完成 <br /><br />　　（须在应用完最后一个archive log 后cancel ） <br /><br />　　4. Reset the logfiles （对启动而言不可省略）： <br /><br />　　svrmgrl&gt; alter database open resetlogs; <br /><br />　　<strong>重作日志和控制文件同时丢失或损坏时： <br /></strong><br />　　条件和假设：Control Files 全部丢失或损坏；Archivelog Mode; 有Control Files 的镜像（冷）拷贝。 <br />　　<br />　　恢复步骤： <br /><br />　　1. 如果数据库尚未关闭，则首先把它关闭： <br /><br />　　$ svrmgrl <br /><br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; shutdown abort <br /><br />　　svrmgrl&gt;exit <br /><br />　　2. 以Control File 的镜像（冷）拷贝覆盖损坏了的Control File: <br /><br />　　$ cp /backup/control1.ctl /disk1/control1.ctl <br /><br />　　3. 启动数据库然而并不打开： <br /><br />　　$ svrmgrl <br /><br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; startup mount <br /><br />　　4. Drop 坏掉的redo log （排除硬件故障）： <br /><br />　　svrmgrl&gt; alter database drop logfile group 2; <br /><br />　　5. 重新创建redo log: <br /><br />　　svrmgrl&gt; alter database add logfile group 2 '/orig_loc/log2.dbf' size 10M; <br />　　<br />　　6. 以旧的control file 来恢复数据库： <br />　　<br />　　svrmgrl&gt; recover database until cancel using backup controlfile; <br /><br />　　（必须马上cancel ） <br /><br />　　7. Reset the logfiles （对启动而言不可省略）： <br /><br />　　svrmgrl&gt; alter database open resetlogs; <br /><br />　　8. 关闭数据库并做一次全库冷备份 <br /><br />　　只发生归档重作日志丢失或损坏时： <br /><br />　　根据不同环境和情况，选择下述手段之一： <br /><br />　　a. 马上backup 全部datafiles （如果系统采用一般热备份或RMAN 热备份） <br /><br />　　b. 马上正常关闭数据库并进行冷备份（如果系统采用冷备份） <br /><br />　　c. 冒险前进！不做备份而让数据库接着跑，直等到下一个备份周期再做备份。这是在赌数据库在下一个备份周期到来之前不会有需要恢复的错误发生。 <br /><br />　　注意:冒险前进的选择：如果发生错误而需要数据库恢复，则最多只能恢复到出问题archive log 之前的操作现场。从另一个角度讲，archive log(s) 出现问题时，数据库若不需要恢复则其本身并没有任何问题。 </p><p>　　<strong>Oracle逻辑结构故障的处理方法：</strong><br /><br />　　逻辑结构的故障一般指由于人为的误操作而导致重要数据丢失的情况。在这种情况下数据库物理结构是完整的也是一致的。对于这种情况采取对原来数据库的全恢复是不合适的，我们一般采用三种方法来恢复用户数据。 <br />　　　<br />　　采用exp/imp工具来恢复用户数据： <br /><br />　　如果丢失的数据存在一个以前用exp命令的备份，则可以才用这种方式。 <br /><br />　　1. 在数据库内创建一个临时用户： <br /><br />　　svrmgrl&gt;create user test_user identified by test; <br /><br />　　svrmgrl&gt;grant connect，resource to test_user; <br /><br />　　2. 从以前exp命令备份的文件中把丢失数据的表按照用户方式倒入测试用户： <br /><br />$imp system/manager file=export_file_name tables=(lost_data_table_name…) fromuser=lost_data_table_owner touser=test_user constraint=n; <br /><br />　　3. 用相应的DML语句将丢失的数据从测试用户恢复到原用户。 <br /><br />　　4. 将测试用户删除： <br /><br />　　svrmgrl&gt;drop user test_user cascede; <br />　　<br />　　<strong>采用logminer来恢复用户数据：</strong><br /><br />　　Logminer是oracle提供的一个日志分析工具。它可以根据数据字典对在线联机日志、归档日志进行分析，从而可以获得数据库的各种DML操作的历史记录以及各种DML操作的回退信息。根据这些用户就可以将由于误操作而丢失的数据重新加入数据库内。 <br /><br />　　1. 确认数据库的utl_file_dir参数已经设置，如果没有则需要把这个参数加入oracle的初始化参数文件，然后重新启动数据库。下面例子中假设utl_file_dir=’/opt/oracle/db01’； <br /><br />　　2. 创建logminer所需要的数据字典信息，假设生成的数据字典文本文件为dict.ora： <br /><br />svrmgrl&gt;execute dbms_logmnr_d.build(dictionary_filename=&gt;'dict.ora'， dictionary_location=&gt;'/opt/oracle/db01’); <br /><br />　　3. 确定所需要分析的日志或者归档日志的范围。这可以根据用户误操作的时间来确定大概的日志范围。假设用户误操作时可能的日志文件为/opt/oracle/db02/oradata/ORCL/redo3.log和归档日志’/opt/oracle/arch/orcl/orclarc_1_113.ora’。 <br /><br />　　4. 创建要分析的日志文件列表，按日志文件的先后顺序依次加入： <br /><br />　　svrmgrl&gt;execute dbms_logmnr.add_logfile(logfilename=&gt;’/opt/oracle/arch/orcl/orclarc_1_113.ora’，options=&gt;dbms_logmnr.NEW); <br /><br />svrmgrl&gt; execute dbms_logmnr.add_logfile(logfilename=&gt;’ /opt/oracle/db02/oradata/ORCL/redo3.log’，options=&gt;dbms_logmnr.ADDFILE); <br /><br />　　5. 开始日志分析，假设需要分析的时间在’2003-06-28 12:00:00’和’2003-06-28 13:00:00’之间： <br /><br />　　svrmgrl&gt;execute dbms_logmnr.start_logmnr(dictfilename=&gt;’ /opt/oracle/db01/dict.ora’，starttime=&gt;to_date(’ 2003-06-28 12:00:00’，’YYYY-MM-DD HH:MI:SS’)，endtime=&gt;to_date(to_date(‘2003-06-28 13:00:00’，’YYYY-MM-DD HH:MI:SS’)); <br /><br />　　6. 获取分析结果： <br /><br />　　svrmgrl&gt;select operation，sql_redo，sql_undo from v$logmnr_contents; <br />　<br />　　7. 根据分析结果修复数据。 <br /><br />　　8.结束logmnr: <br /><br />　　svrmgrl&gt;dbms_logmnr.end_logmnr; <br /><br />　　9. 用适当的方法对原数据库进行数据库全备份。利用备份恢复用户数据： <br /><br />　　采用这种方法时并不是在原数据库进行恢复，而是利用数据库备份在新的机器上重新建立一个新的数据库。通过备份恢复在新机器上将数据库恢复到用户误操作前，这样就可以获得丢失的数据将其恢复到原数据库。 <br />　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<br />　　1. 在新的机器上安装数据库软件。 <br /><br />　　2.　 对于采用带库备份的现场，需要在新的数据库服务器上安装调试相应的备份管软件。 <br /><br />　　3. 根据用户误操作的时间点进行基于时间点的数据库恢复操作。对于没有采用带库备份的现场，可以选取用户误操作前最近的备份磁带进行恢复；对于才用带库备份的点可以通过基于时间恢复点恢复的rman脚本来进行恢复。 <br /><br />　　4.重新打开数据库： <br /><br />　　svrmgrl&gt;alter database open resetlogs; <br /><br />　　5. 从新的数据库中获取丢失的用户数据，通过DML操作将其恢复到原数据库中。 <br /><br />　　6. 用适当的方法对原数据库进行数据库全备份。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:36 <a href="http://www.cppblog.com/stevennash/articles/13258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库系统紧急故障处理方法（1）</title><link>http://www.cppblog.com/stevennash/articles/13257.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:35:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13257.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13257.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13257.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13257.html</trackback:ping><description><![CDATA[
		<a class="f20">数据库系统紧急故障处理方法（1）</a>
		<br />
		<br />
		<a class="f1"> 　　Oracle物理结构故障是指构成数据库的各个物理文件损坏而导致的各种数据库故障。这些故障可能是由于硬件故障造成的，也可能是人为误操作而引起。所以我们首先要判断问题的起因，如果是硬件故障则首先要解决硬件问题。在无硬件问题的前提下我们才能按照下面的处理方发来进一步处理。 <br /><br />　　<strong>控制文件损坏：</strong><br /><br />　　控制文件记录了关于oracle的重要配置信息，如数据库名、字符集名字、各个数据文件、日志文件的位置等等信息。控制文件的损坏，会导致数据库异常关闭。一旦缺少控制文件，数据库也无法启动，这是一种比较严重的错误。 <br /><br />　　<strong>损坏单个控制文件：</strong><br /><br />　　1. 确保数据库已经关闭，如果没有用下面的命令来关闭数据库： <br /><br />　　svrmgrl&gt;shutdown immediate; <br /><br />　　2. 查看初始化文件$ORACLE_BASE/admin/pfile/initORCL.ora,确定所有控制文件的路径。 <br />　<br />　　3. 用操作系统命令将其它正确的控制文件覆盖错误的控制文件。 <br /><br />　　4. 用下面的命令重新启动数据库：<br /><br />　　svrmgrl&gt;startup; <br /><br />　　5. 用适当的方法进行数据库全备份。 <br /><br />　　<strong>损坏所有的控制文件：</strong><br /><br />　　1. 确保数据库已经关闭，如果没有用下面的命令来关闭数据库： <br /><br />　　svrmgrl&gt;shutdown immediate; <br /><br />　　2. 从相应的备份结果集中恢复最近的控制文件。对于没有采用带库备份的点可以直接从磁带上将最近的控制文件备份恢复到相应目录；对于采用带库备份的点用相应的rman脚本来恢复最近的控制文件。 <br /><br />　　3. 用下面的命令来创建产生数据库控制文件的脚本： <br /><br />svrmgrl&gt;startup mount; <br /><br />svrmgrl&gt;alter database backup controlfile to trace noresetlogs; <br /><br />　　4. 修改第三步产生的trace文件，将其中关于创建控制文件的一部分语句拷贝出来并做些修改，使得它能够体现最新的数据库结构。假设产生的sql文件名字为createcontrol.sql. <br /><br />　　<strong>注意：</strong><br /><br />　　Trace文件的具体路径可以在执行完第3步操作后查看$ORACLE_BASE/admin/bdump/alert_ORCL.ora文件来确定。 <br /><br />　　5. 用下面命令重新创建控制文件： <br /><br />　　svrmgrl&gt;shutdown abort; <br /><br />　　svrmgrl&gt;startup nomount; <br /><br />　　svrmgrl&gt;@createcontrol.sql; <br /><br />　　6. 用适当的方法进行数据库全备份。 <br /><br />　　<strong>重做日志文件损坏： </strong><br /><br />　　数据库的所有增、删、改都会记录入重做日志。如果当前激活的重做日志文件损坏，会导致数据库异常关闭。非激活的重做日志最终也会因为日志切换变为激活的重做日志，所以损坏的非激活的重做日志最终也会导致数据库的异常终止。在ipas/mSwitch中每组重做日志只有一个成员，所以在下面的分析中只考虑重做日志组损坏的情况，而不考虑单个重做日志成员损坏的情况。 <br /><br />　　<strong>确定损坏的重做日志的位置及其状态：</strong><br /><br />　　1. 如果数据库处于可用状态： <br /><br />　　select * from v$logfile; <br /><br />　　svrmgrl&gt;select * from v$log; <br /><br />　　2. 如果数据库处于已经异常终止： <br /><br />　　svrmlgr&gt;startup mount; <br />　　svrmgrl&gt;select * from v$logfile; <br />　　svrmgrl&gt;select * from v$log; <br /><br />　　其中，logfile的状态为INVALID表示这组日志文件出现已经损坏；log状态为Inactive：表示重做日志文件处于非激活状态；Active： 表示重做日志文件处于激活状态；Current：表示是重做日志为当前正在使用的日志文件。 <br /><br />　　<strong>损坏的日志文件处于非激活状态：</strong><br /><br />　　1. 删除相应的日志组： <br /><br />　　svrmgrl&gt;alter database drop logfile group group_number; <br /><br />　　2. 重新创建相应的日志组： <br /><br />　　svrmgrl&gt;alter database add log file group group_number （’log_file_descritpion’，…） size log_file_size; <br /><br />　　<strong>损坏的日志文件处于激活状态且为非当前日志：</strong><br /><br />　　1. 清除相应的日志组： <br /><br />　　svrmgrl&gt;alter database clear unarchived logfile group group_number; <br /><br />　　损坏的日志文件为当前活动日志文件： <br /><br />　　用命令清除相应的日志组： <br /><br />　　svrmgrl&gt;alter database clear unarchived logfile group group_number; <br /><br />　　如果清除失败，则只能做基于时间点的不完全恢复。 <br /><br />　　打开数据库并且用适当的方法进行数据库全备份： <br /><br />　　svrmgrl&gt;alter database open; <br /><br />　　<strong>部分数据文件损坏：</strong><br /><br />　　若损坏的数据文件属于非system表空间，则数据库仍然可以处于打开状态可以进行操作，只是损坏的数据文件不能访问。这时在数据库打开状态下可以单独对损坏的数据文件进行恢复。若是system表空间的数据文件损坏则数据库系统会异常终止。这时数据库只能以Mount方式打开，然后再对数据文件进行恢复。可以通过查看数据库日志文件来判断当前损坏的数据文件到底是否属于system表空间。 <br /><br />　　<strong>非system表空间的数据文件损坏</strong><br /><br />　　1. 确定损坏的文件名字： <br /><br />　　svrmgrl&gt;select name from v$datafile where status=’INVALID’; <br /><br />　　2. 将损坏的数据文件处于offline状态： <br /><br />　　svrmgrl&gt;alter database datafile ‘datafile_name’ offline; <br /><br />　　3. 从相应的备份结果集中恢复关于这个数据文件的最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复；对于用带库备份的点用相应的rman脚本来恢复。 <br /><br />　　4. 恢复数据文件： <br /><br />　　svrmgrl&gt;alter database recover datafile ‘file_name’; <br /><br />　　5. 使数据库文件online： <br /><br />　　svrmgrl&gt;alter database datafile ‘datafile_name’ online; <br /><br />　　6. 用适当的方法进行数据库全备份。
<p>　　<strong>system表空间的数据文件损坏：</strong><br /><br />　　1. 以mount方式启动数据库 <br /><br />　　svrmgrl&gt;startup mount; <br /><br />　　2. 从相应的备份结果集中恢复关于这个数据文件的最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复；对于用带库备份的点用相应的rman脚本来恢复。 <br /><br />　　3. 恢复system表空间： <br /><br />　　svrmgrl&gt;alter database recover datafile ‘datafile_name’; <br />　<br />　　4. 打开数据库： <br /><br />　　svrmgrl&gt;alter database open; <br /><br />　　5. 用适当的方法进行数据库全备份。 <br /><br />　　<strong>表空间损坏：</strong><br /><br />　　若非system表空间已经损坏，则数据库仍然可以处于打开状态可以进行操作，只是损坏的表空间不能访问。这样在数据库打开状态下可以单独对损坏的表空间进行恢复。若是system表空间损坏则数据库系统会异常终止。这时数据库只能以Mount方式打开，然后再对表空间进行恢复。可以通过查看数据库日志文件来判断当前损坏的表空间是否是system表空间. <br /><br />　　<strong>非system表空间损坏：</strong><br /><br />　　1. 将损坏的表空间处于offline状态： <br />　<br />　　svrmgrl&gt;alter tablespace ‘tablespace_name’ offline; <br /><br />　　2. 从相应的备份结果集中恢复关于这个表空间最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复；对于用带库备份的点用相应的rman脚本来恢复。 <br /><br />　　3. 恢复表空间： <br /><br />　　svrmgrl&gt;alter database recover tablespace ‘tablespace_name’; <br /><br />　　4. 使表空间online： <br /><br />　　svrmgrl&gt;alter tablespace ‘tablespace_name’ online; <br /><br />　　5. 用适当的方法进行数据库全备份. <br /><br />　　<strong>system表空间损坏：</strong><br /><br />　　1. 以mount方式启动数据库 <br /><br />　　svrmgrl&gt;startup mount; <br /><br />　　2. 从相应的备份结果集中恢复system表空间最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复；对于用带库备份的点用相应的rman脚本来恢复。 <br /><br />　　3. 恢复system表空间： <br /><br />　　svrmgrl&gt;alter database recover tablespace system; <br /><br />　　4. 打开数据库： <br /><br />　　svrmgrl&gt;alter database open; <br /><br />　　5. 用适当的方法进行数据库全备份。 <br /><br />　　<strong>整个数据库的所有文件损坏：</strong><br /><br />　　整个数据库所有文件的损坏一般是在共享磁盘阵列发生无法恢复的灾难时才发生，这种情况下只能对数据库进行恢复。若数据库的归档目录也已经丢失，则数据库不可能做完全恢复，会有用户数据的丢失。 <br /><br />　　<strong>没采用带库备份的现场：</strong><br /><br />　　1. 将最近的备份从磁带上把各个文件解包到相应的目录下。 <br /><br />　　2. 以mount方式打开数据库： <br />　<br />　　svrmgrl&gt;startup mount; <br /><br />　　3. 恢复数据库： <br /><br />　　svrmgrl&gt;recover database until cancel; <br /><br />　　4. 打开数据库： <br /><br />　　svrmgrl&gt;alter database open resetlogs; <br /><br />　　5. 用适当的方法进行数据库全备份。 <br /><br />　　<strong>采用带库备份的现场：</strong><br /><br />　　1. 以nomount方式打开数据库： <br /><br />　　svrmgrl&gt;startup nomount; <br /><br />　　2. 通过相应的rman脚本进行数据库软恢复。 <br /><br />　　$rman cmdfile=hot_database_restore.rcv <br /><br />　　3. 打开数据库： <br /><br />　　svrmgrl&gt;alter database open resetlogs; <br /><br />　　4. 用适当的方法进行数据库全备份。 <br /><br />　　存在最近的数据库完整冷备份前提下的一些经典紧急情况的处理： <br /><br />　　数据文件，归档重作日志和控制文件同时丢失或损坏： <br /><br />　　<strong>无新增archives 时的状况：</strong><br />　<br />　　条件和假设：自上次镜像备份以来尚未生成新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的镜像（冷）拷贝 <br /><br />　　恢复步骤： <br /><br />　　1. 将镜像拷贝的datafile(s) 和control file(s) 抄送回原始地点: <br /><br />　　$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf <br /><br />　　$ cp /backup/control1.ctl /disk1/control1.ctl <br /><br />　　2. 以mount 选项启动数据库： <br /><br />　　$ svrmgrl <br />　<br />　　svrmgrl&gt; connect internal <br /><br />　　svrmgrl&gt; startup mount <br /><br />　　3. 以旧的control file 来恢复数据库： <br /><br />　　svrmgrl&gt; recover database using backup controlfile until cancel; <br /><br />　　*** 介质恢复完成 <br />　　<br />　　（必须马上cancel ） <br /><br />　　4. Reset the logfiles （对启动而言不可省略）： <br /><br />　　svrmgrl&gt; alter database open resetlogs; <br /><br />　　5. 关闭数据库并做一次全库冷备份。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:35 <a href="http://www.cppblog.com/stevennash/articles/13257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>清单：负载测试 SQL Server性能调整的魔法棒</title><link>http://www.cppblog.com/stevennash/articles/13256.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:34:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13256.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13256.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13256.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13256.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 清单：负载测试 SQL Server性能调整的魔法棒						      作者：Jeremy Kadlec（Edgewood Solutions公司）		      没有什么事情比这更糟了，采纳一个新的应用程序，而它的性能是如此的糟糕，导致业务在一片惊叫声中暂停。这并不是新出现的现象；这就是事实，我经常遇到这样的事实。我打赌你也曾经经历过。那么如何防止这些性能问题，有什么解决方案...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/13256.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/13256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:34 <a href="http://www.cppblog.com/stevennash/articles/13256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库管理人员的生存法则</title><link>http://www.cppblog.com/stevennash/articles/13255.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 10:25:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13255.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13255.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13255.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13255.html</trackback:ping><description><![CDATA[
		<a class="f20">数据库管理人员的生存法则</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p><font face="Verdana">      作为数据库技术人员，相信没有一个人愿意永远在底层编写程序或做简单的系统维护。经过一段时间的技术和经验的积累，很多人都向往更高层的职位，但如何能成为一个专业的数据库管理人才，并不是每一个人都清晰、明了。 <br />　　如果你真想成为一名成功、成熟的数据库专家，你需要不断地扩展你的技能与知识——有些知识领域可能对你很陌生，本文阐述了可以帮助你提高职业素质的重要能力。作为一名数据库专业人士，要想有一个成功的职业生涯并不是很容易的事情。你有可能每一种技术都懂一些，但又都不精通，也有可能是一名专才。无论如何，一旦你想成为数据库专家，想在你的游戏地盘里成为楚翘，你需要不断扩展的、跨领域的素质。但是，大部分的素质能力存在于传统数据库技能范畴之外，它们可能适用于其他的功能学科。我们与其他人的差异越来越小，这超出了我们的习惯思维，恐怕对很多想迅速成功的数据库专业人士也是一个不小的打击。</font></p><p><font face="Verdana">　　<strong>理解现有的和新兴的技术</strong></font></p><p><font face="Verdana">　　所有数据库专业人士需要的一个最基本的能力便是对他们的基本技术技能进行深度和广度的拓展。如果用马斯洛的需求层次来比喻，那么这种能力应该属于食物和水的层次，你必须有这些才能满足基本的生存。上课、阅读文章、研究产品，参加一个专业性质的组织，你需要掌握你正在使用的技术领域的所有信息，而且你还需要有实践机会去应用这些知识。</font></p><p><font face="Verdana">　　如果你参加一些技术资格或职称的考试，你应该经常提醒自己，你的目标并不单纯是为了在自己的名字后面加上许多的头衔，而是实现你所受教育的价值最大化。</font></p><p><font face="Verdana">　　西方有句谚语，赢得游戏胜利不仅仅需要你将眼睛盯在正在击打的球上，而且也要能预计到下一个球的方向。历史经验已经证明，任何系统的平均生命周期大约为16个月，因此为未来做好规划很有必要。当你充分了解你正在做的事情后，实施的效率会更高。</font></p><p><font face="Verdana">　　<strong>设计技术性架构</strong></font></p><p><font face="Verdana">　　任何自己修建的一个系统作为个体的功能都是自以为精妙和可执行的。但如果将它放进一个大一点的系统，它可能就会出现问题，也许你的技能还不是很高妙。无论你是负责全面的应用与网络设计，还是部分营建一个系统部件，支持一个企业架构，你都需要知道什么是良好的、扎实的架构设计法则。</font></p><p><font face="Verdana">　　一套有效率的技术性架构设计将零件拼接在一起，它应该就像一台容易操控、价格合理的机器一样。我已经发现，架构设计如果基于“奥卡姆剃刀原理”（Occam's Razor），那么它往往是最棒的，奥卡姆剃刀原理这个词语源于拉丁语，意为“如无必要，勿增实体”（Ent数据库ies should not be multiplied unnecessarily），即简单就是最好的。当考虑设计之时，要记住每个组织都有一些独特的程序，大部分的组织性程序都相当的普通，它们能够用可配置的通用解决方案来解决问题。很多架构可以利用购买以及将一些很小数量的部件组合在一起的方式来完成，而不是要重新发明一种结构。通过这种方法，你能够在很短的时间内，利用更少的成本，为你的客户提供一种优质、容易操控的产品。同样理念还适用于个体应用与架构的设计与开发。<br /><br />   </font></p></a>
		<a class="f1">
				<div class="guanggao">
						<span id="contentAdv">
						</span>
				</div>
				<p>
				</p>
				<p>
						<font face="Verdana">　　<strong>系统集成</strong></font>
				</p>
				<p>
						<font face="Verdana">　　技术为很多的目的服务，最重要的能力便是使程序的自动化。不是使用传统的供应商订单、库存管理以及产品市场推销手段，而是使用供应链程序，流程通过允许供应商和生产者来进行复杂地沟通控制，从而完成原材料进入生产流程到产品抵达消费者手中的整个过程。</font>
				</p>
				<p>
						<font face="Verdana">　　Sarbanes-Oxley和其他监管法则都要求企业达到内部控制的标准，它们在系统设计领域相当常见。随着产品和平台继续地增生扩散，随着企业日渐将自己的系统和其他的系统相连，高质量的协同工作能力是必须的。</font>
				</p>
				<p>
						<font face="Verdana">　　<strong>了解企业</strong></font>
				</p>
				<p>
						<font face="Verdana">　　企业实体是复杂的组织，没有哪个企业是与别的企业完全相同的，就像雪花一样，没有两片雪花是完全相同。这种推动特定业务运转的灵活性不太容易被掌握。很多时候，尤其是在大型企业当中，多种文化是并存的——有一个文化是企业层面的，而别的存在于部门层面。当你认为是安全下水的时候，你对企业运行的细微直觉会因为合并或者管理性质的巨变失去灵光，一切都发生了改变。</font>
				</p>
				<p>
						<font face="Verdana">　　当我们认为自己能够在企业文化的风浪当中驾轻就熟，而无需在乎浪潮或者风向之时，我们不可以自鸣得意。同样的，尽管企业灵活性的东西当中，很多是普通的，可以传授的知识，那种认为在一个企业环境当中取得成功的做法同样适用于另外一个企业的想法是愚蠢的。我们必须学习我们身处的每个新环境的特质。</font>
				</p>
				<p>
						<font face="Verdana">　　<strong>规划管理项目</strong></font>
				</p>
				<p>
						<font face="Verdana">　　Joe Torre被视为是一位非常优秀的经理。很难想像，如果他没有一套相当周全的比赛规划，这位纽约人能够在10次比赛中9次取得胜利，并且获得6个AL锦标赛以及4个世界性系列比赛的冠军。这种计划不是针对年度比赛的，而是每一场比赛。</font>
				</p>
				<p>
						<font face="Verdana">　　无论你是一位经理或者是一位选手，一名超级明星或者是一位业余玩家，你都要为自己近期和远期的比赛制定规划。你如何为今天进行规划？为这周？为今年？你如何完成这些目标？你应该问自己很多“做什么”以及“如何做”的问题。如果你是一名开发人员或者是一名网络管理员，你现在就需要培养自己的规划能力。如果你无法管理自己，你当然就会在管理别人或者复杂项目之时捉襟见肘。</font>
				</p>
				<p>
						<font face="Verdana">　　<strong>注重沟通与倾听</strong></font>
				</p>
				<p>
						<font face="Verdana">　　任何东西都可以平庸，除了一种能力你不能不做到完美：沟通。这是两个最重要能力当中的一种，沟通对数据库专业人士尤显重要。良好的沟通是双向性的事情，你来我往同等重要。数据库行业是锻炼你雅量的完美地方，因为这一行业需要沟通的时刻太多了。</font>
				</p>
				<p>
						<font face="Verdana">　　无论你怎样看待工作和生活，每个数据库专业人士实际上都是一名顾问。作为顾问，你有责任去为你的客户提供最大的价值。这样做意味着你至少了解你客户的业务，客户业务运转的情况，这意味着你要去倾听。你的客户有资格知道他们付给你的钱获得了怎样的回报，这意味着你必须主动的、有规律的让他们知道你正在为他们的利益而奔忙。</font>
				</p>
				<p>
						<font face="Verdana">　　这一点对传统的数据库人员来讲很难。我们大部分进入这一行业的人认为自己接触代码和电线的机会大于与人的接触。我们以为最好的方法便是坐在我们的桌子面前，埋头苦干。这些都是致命的错误，尽管沟通做起来很不容易，也或许会和我们的个性背道而驰，但你别无选择，只能培养这些能力。幸好人人都能够学习，经过一定时间的锻炼，沟通将会变得容易一些。</font>
				</p>
		</a>
		<div class="guanggao">
				<span id="contentAdv">
				</span>
		</div>
		<p>
		</p>
		<p>
				<font face="Verdana">　　<strong>专注结果</strong></font>
		</p>
		<p>
				<font face="Verdana">　　另外一个绝对重要的能力便是执行的能力。计划再棒，也只是空谈而已。归根结底，你需要用东西来证明你的努力。</font>
		</p>
		<p>
				<font face="Verdana">　　最好的方法是了解你客户的一些重要信息，比如他们是谁，他们想做什么？作为一名数据库专业运营顾问，你有责任向你的客户提供建议，这种建议建立在你的知识与经验之上。</font>
		</p>
		<p>
				<font face="Verdana">　　但别忘了，最终是你的老板或同事、团队领导、你工作的最终客户进行决策。有时候，这些决策并不是你推荐的。你需要认真思考其中的缘由，但不要让任何分析将你麻痹，也不要让自己陷入唐吉柯德式的盲动之中。80-20定律在这里起作用：80%的结果能够通过20%的努力来完成，超出这一范畴的多余价值经常不值得耗费成本。</font>
		</p>
		<p>
				<font face="Verdana">　　<strong>进行战略性的思考</strong></font>
		</p>
		<p>
				<font face="Verdana">　　这是一个竞争日渐激烈的世界，今天的数据库专业人士必须每天去证明，他们能够增加战术与战略价值；他们要在自己组织的任何一次会议上，成为受欢迎的人。在过去十几年的时间里，企业已经开始意识到数据库的战略重要性，企业认为数据库不仅仅是会计账目上的死水一潭，而是能够给企业带来价值的部门。</font>
		</p>
		<p>
				<font face="Verdana">　　大部分的数据库部门是被动式的进行工作，他们等待自己的业务客户。高性能、高度成功的数据库部门是积极的，在完成公司总体目标的过程当中，他们以咨询式的态度与自己的业务客户共事。</font>
		</p>
		<p>
				<font face="Verdana">　　<strong>影响和说服</strong></font>
		</p>
		<p>
				<font face="Verdana">　　上个世纪50年代那种命令式、军队式的组织管理模式已经让位于更加平行的组织管理模式。直接管理和影响管理已经相辅相成。我们不再命令别人做事情。我们会用说服、协商、沟通等等方式去解决问题。这是你训练沟通能力的好机会。有了沟通能力，其他的能力问题才能迎刃而解，像战略性思维、业绩挂钩等等。能够影响他人的数据库专业人士总是代表着高效、富有能力、受人尊敬的人士。不要错误地认为这只是经理们该具备的能力。影响和说服是推动协同性工作环境完成的重要技能。</font>
		</p>
		<p>
				<font face="Verdana">　　<strong>有适应能力</strong></font>
		</p>
		<p>
				<font face="Verdana">　　一名技术专业人士意味着具有某个特殊开发环境的专长或者有能力开发、支持一个网络，但是在现在，别以为你仍然能够靠这些东西过好日子，如果你和其他提供某一类数据库服务的专家一样，你就是一个没有优势的普通职员。你应该成为一个真正的数据库多面手，需要不断地进行技能扩展工作。这样才能在众多的技术人员当中显示出你的优秀。</font>
		</p>
		<p>
				<font face="Verdana">　　有些能力，比如技术技能与知识，相对来说比较容易掌握。但类似业务知识一类的知识，则需要你花更多的时间掌握。个人和团队的管理、领导艺术以及和同事、用户共事的能力，这些能力需要你调整自己的个人态度以及个性才能获得。</font>
		</p>
		<p>
				<font face="Verdana">　　如果你选择在数据库行业就业，你也选择了让自己成为变化的适应者。我们的专业变化很快也很深刻，我们必须认真地对待这种变化。无论你喜欢与否，都要尽快适应业务变化。竞争的压力、新手的进入、管理的变革、战略的调整、产品的开发，任何这些因素都会导致变化。现在，几乎没有一个行业没有被数据库技术所影响，作为一个可以信赖的专业人士，我们必须让我们的企业适应这种变化。</font>
		</p>
<img src ="http://www.cppblog.com/stevennash/aggbug/13255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 18:25 <a href="http://www.cppblog.com/stevennash/articles/13255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DBA的选择：几种流行的数据库系统</title><link>http://www.cppblog.com/stevennash/articles/13254.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13254.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13254.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13254.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13254.html</trackback:ping><description><![CDATA[
		<a class="f20">DBA的选择：几种流行的数据库系统</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><b>几种流行的数据库系统</b><br /><br /><b>最"容易"的数据库系统-Microsoft SQL Server</b><br /><br />　　如果你打算做一个DBA，建议你选择那些现在比较流行的数据库系统。这意味着你将有更多的就业机会、交流和培训机会，而且，流行自有流行的理由，你可以因此省心很多。当然，就业竞争压力也比较大。一般的入门者选择Microsoft SQL Server，这是非常适合中小型企业的数据库系统，熟悉Access的读者很容易就能初步使用Microsoft SQL Server，成为一个DBBS。 J<br />Microsoft SQL Server 7.0的报价，5用户版1399美金，增加用户时，127美金每用户。<br /><br /><b>最"难"的数据库-无冕之王Oracle</b><br /><br />　　如果你有机会接触到Oracle，那可是个好机会。Oracle是目前最看好的数据库厂商，由于其强大的功能和可配置、可管理能力，Oracle DBA的薪资一般比其他数据库管理员的薪资要高。而且，Oracle在大中型企业的关键应用也更加普遍了。Oracle可以运行在Windows NT、Sun Solaris、Linux等平台下。很多情况下要求你不仅仅熟悉NT，还要你熟悉Unix；而且Oracle不太友善的界面和成箱的Oracle产品资料可能也是一个障碍。<br />Oracle 8i标准版的报价，如果运行在Windows NT，附带JServer和interMedia，支持5个并发用户，报价是3925美金每CPU。增加并发用户时，785美金每用户。增加附加的命名用户时，392.5美金每用户。<br /><br /><b>数据库系统的贵族-IBM UDB/DB2</b><br /><br />　　作为30年数据库研究的成果，IBM DB2确实称得上"数据库系统的贵族"。不管是小型商业系统，还是大的银行系统，用DB2都是可以高枕无忧的。最近推出的新版DB2 6.1， 管理和调节工具更加卓越和便于使用。DB2 可以运行在Intel架构上，也可以运行在IBM的S/390大型计算机上。如果你所在的行业对IBM的机器特别地称道，建议你学习IBM DB2。<br /><br />DB2有两种版本：工作组版和企业版。工作组版999美元每服务器，外加249美元每个并发用户。而企业版是12500美元每个CPU，不限并发用户数量。 
<p><b>以Java为中心的数据库-Sybase Adaptive Server Enterprise(ASE) 12.0</b><br /><br />　　即将发布的Sybase ASE 12.0，直接面向Java 程序员。这种以Java为中心的数据库系统，为那些准备在Java 平台下构建企业应用的企业来说，将是最好的选择。但是ASE称不上一个数据库领域的领先者，尽管相对于它以前的版本已经改进很多，并支持多个CPU和更多的并发，还有很多的新的特性。但Sybase的风光似乎已经不再。<br /><br /><b>值得期盼的Informix Centaur</b><br /><br />　　有时候"第一"只是意味着你的对手需要等待更长的时间去赶上你。这正是1997年创立的Informix所面临的。Informix公司是率先将多媒体特性加入到关系数据库系统的大型数据库厂商之一。但是如今，IBM、Oracle、Sybase都已经跨越了这个概念。所以，Informix不得不寻求新的支撑来使自己区别于其他数据库厂商。这就是Informix Centaur的目标。Informix Centaur结合了Informix Dynamic Server 7.3的对象-关系数据库和Informix Universal Data Option 9.1，意在获得更好的适应性和多媒体支持。详情如何，我们拭目以待！<br /><br /><b>DBA的薪资</b><br /><br />有很多因素影响到你作为DBA的薪资：</p><ol><ol><li>你的经验和能力所决定的DBA等级 
</li><li>你所熟悉的数据库系统 
</li><li>你的个性特点和潜力 </li></ol></ol><p><br />　　下面的表说明了国内DBA人员的基本薪资状况，并说明了DAB等级和你所熟悉的数据库系统怎样影响到DBA的薪资。当然，这只是我个人掌握的情况，只能在一定程度上代表行业的平均水平。<br /></p><table cellspacing="1" cellpadding="0" width="100%" bgcolor="#003366" border="0"><tbody><tr align="middle"><td><font color="#ffffff">DBA等级数据库系统</font></td><td><font color="#ffffff">初级DBA年薪(万元)</font></td><td><font color="#ffffff">中级DBA年薪(万元)</font></td><td><font color="#ffffff">高级DBA年薪(万元)</font></td></tr><tr bgcolor="#ffffff"><td>Oracle</td><td>4 </td><td>8</td><td>11</td></tr><tr bgcolor="#ffffff"><td>Microsoft SQL Server</td><td>3</td><td>5</td><td>8</td></tr><tr bgcolor="#ffffff"><td>IBM DB2</td><td>4</td><td>8</td><td>10</td></tr><tr bgcolor="#ffffff"><td>Sybase</td><td>3.5</td><td>6</td><td>8</td></tr><tr bgcolor="#ffffff"><td>Informix</td><td>4</td><td>7</td><td>10</td></tr></tbody></table>注：每年按13个月计算。表内数字为平均年薪。</a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 17:30 <a href="http://www.cppblog.com/stevennash/articles/13254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MS SQL 2005 INSTEAD-OF触发器</title><link>http://www.cppblog.com/stevennash/articles/13250.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13250.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13250.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13250.html</trackback:ping><description><![CDATA[
		<a class="f20">使用MS SQL 2005 INSTEAD-OF触发器</a>
		<br />
		<br />
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p>　　触发器是类似于存储程序的数据库对象，它响应数据库环境下的某个请求。SQL Sever 2005包含3个触发器对象:AFTER，数据定义语言 (DDL)和INSTEAD-OF。</p><p>　　AFTER触发器是存储程序，它发生于数据操作语句作用之后，例如删除语句等。DDL是SQL Server 2005的新触发器，允许响应数据库引擎中对象定义水平事件(例如:DROP TABLE语句)。INSTEAD-OF触发器是对象，在数据库引擎中可以取代数据操作语句而执行。例如:将INSTEAD-OF INSERT触发器附加到表，告诉数据库执行此触发器。</p><p>　　使用INSTEAD-OF触发器的理由</p><p>　　INSTEAD-OF触发器是SQL Sever功能强大的对象，允许开发人员转移数据库引擎完成不同的工作，以满足开发要求。其中的一个例子是在数据库的表中添加INSTEAD-OF触发器，当不需要修改表时，可以对表的内容进行回滚。使用此方法时，必须格外小心，因为任何指定的表修改之前，INSTEAD-OF触发器必须处于激活状态。</p><p>　　使用INSTEAD-OF触发器一个更充分理由是视图处理。在视图中添加INSTEAD-OF触发器后，则可创建更新的视图。可更新视图允许完整地提取数据库大纲，因此可以用此方法设计系统，而不需要担心OLTP数据库大纲的问题，并且取代数据修改一组标准视图集。</p><p>　　范例 
</p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font style="BACKGROUND-COLOR: #ffffff" color="#990000"></font><strong>Listing A<br /></strong><font face="Verdana"> CREATE TABLE Products<br />(<br />      ProductID SMALLINT IDENTITY(1,1) PRIMARY KEY,<br />      Description VARCHAR(75),<br />      Price MONEY NOT NULL<br />)<br />GO<br />CREATE TABLE Purchases<br />(<br />      PurchaseID SMALLINT IDENTITY(1,1) PRIMARY KEY,<br />      ProductID SMALLINT REFERENCES Products(ProductID),<br />      PurchasePrice MONEY NOT NULL, <br />      PurchaseDate SMALLDATETIME DEFAULT(GETDATE())<br />) </font></td></tr></tbody></table><p>　　为了更好地说明可更新视图概念，我们提供一个示例。在本例中，我们设计一个产品表(记录产品)，一个购买表(记录购买)。Listing A包含了创建表的脚本，运行此脚本后则得到示例中所要用到的表。运行Listing B脚本向表中添加数据。 
</p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font style="BACKGROUND-COLOR: #ffffff" color="#990000"></font><strong>Listing B<br /></strong><font face="Verdana">INSERT INTO Products(Description, Price) VALUES('Television',500)<br />INSERT INTO Products(Description, Price) VALUES('VCR',100)<br />INSERT INTO Products(Description, Price) VALUES('DVD_Player',125)<br />INSERT INTO Products(Description, Price) VALUES('Alarm_Clock',40)<br />INSERT INTO Products(Description, Price) VALUES('Camera',325)<br />INSERT INTO Products(Description, Price) VALUES('Projector',1500)<br />INSERT INTO Products(Description, Price) VALUES('XBox',400)<br />GO<br />INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(1, 500)<br />INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(5, 325)<br />INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(1, 525)<br />GO</font></td></tr></tbody></table></a>
		<a class="f1">
				<div class="guanggao">
						<span id="contentAdv">
						</span>
				</div>
				<p>
				</p>
				<p>　　现在表中已经有数据了，我可以为这些表创建一些有意义的视图。请查看Listing C。 
</p>
				<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
						<tbody>
								<tr>
										<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
												<font style="BACKGROUND-COLOR: #ffffff" color="#990000">
												</font>
												<strong>Listing C</strong>
												<br />
												<font face="Verdana">CREATE VIEW vw_ProductPurchases<br />AS<br />      SELECT<br />            pr.ProductID, <br />            pr.Description, <br />            pr.Price AS ProductPrice, <br />            pu.PurchasePrice, <br />            pu.PurchaseDate   <br />      FROM<br />            Products pr<br />            INNER JOIN Purchases pu ON pr.ProductID = pu.ProductID<br />GO</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>　　这是个典型的产品水平的视图。它联合了数据库中的两个表，使得数据简单化了。但是，对于数据提取，使用视图则没有什么优势。在视图上附上INSTEAD-OF触发器后，则允许修改表，但是我不需要直接修改表中的数据。我使用Listing D中的代码在vw_ProductPurchases视图上创建一个INSTEAD-OF触发器。</p>
				<p>
				</p>
				<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
						<tbody>
								<tr>
										<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">
												<p>
														<font face="Verdana">
																<strong>Listing D</strong>
														</font>
												</p>
												<p>
														<font face="Verdana">CREATE TRIGGER tr_vwProductPurchases ON vw_ProductPurchases<br />INSTEAD OF INSERT<br />AS<br />BEGIN<br />      IF EXISTS<br />      (<br />            SELECT TOP 1 *<br />            FROM INSERTED<br />            WHERE <br />                  ProductID IS NOT NULL AND<br />                  ISNULL(COALESCE(PurchasePrice, ProductPrice),0)&gt;0<br />      )<br />      BEGIN<br />            INSERT INTO Purchases<br />            (<br />                  ProductID, PurchasePrice, PurchaseDate<br />            )<br />            SELECT<br />i.ProductID, COALESCE(PurchasePrice, ProductPrice), ISNULL(PurchaseDate, GETDATE())<br />            FROM INSERTED i   <br />      END<br />      ELSE<br />      BEGIN<br />            PRINT 'Adequate data not provided.'<br />      END<br />END</font>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>　　请注意此INSTEAD OF触发器的声明。SQL Server创建的默认的触发器为AFTER触发器，因此，必须在触发器定义中指定INSTEAD OF子句。</p>
				<p>　　触发器的第一条语句是“check”语句。本例中我使用此语句检测INSERTED表以确保显示ProductID字段，并且保证提供显示其他PurchasePrice 或 ProductPrice字段。</p>
				<p>　　如果必要的数据通过INSERT语句都插入到视图中，则触发器将插入指定的值到数据表。下面即是视图的INSERT语句。 
</p>
				<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
						<tbody>
								<tr>
										<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">INSERT INTO vw_ProductPurchases(ProductID, PurchasePrice) VALUES(1, 700)</td>
								</tr>
						</tbody>
				</table>
				<p>　　INSERT语句提供了有效的ProductID和PurchasePrice，这意味着新记录插入到Purchases表。</p>
				<p>　　结论</p>
				<p>　　INSTEAD-OF触发器具有强大的功能和灵活性。如果系统不大，使用视图系统提取数据大纲能够极大保护数据库程序。</p>
				<p>　　上面的例子很简单，系统中所用到的复杂的触发器需要考虑安全性问题、时间开销和其他限制。</p>
				<p>　　Tim Chapman是一个 SQL Server数据库管理员，他在Louisville， KY的一家银行工作，有7年的IT工作经验，通过了微软SQL Server 2000 和SQL Server 2005认证。</p>
		</a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 16:53 <a href="http://www.cppblog.com/stevennash/articles/13250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习-SQL查询连续号码段的巧妙解法</title><link>http://www.cppblog.com/stevennash/articles/13249.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13249.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13249.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13249.html</trackback:ping><description><![CDATA[
		<a class="f20">学习-SQL查询连续号码段的巧妙解法</a>
		<br />
		<br />
		<a class="f1">  
<div class="guanggao"><span id="contentAdv"></span></div><p>　　在ITPUB上有一则非常巧妙的SQL技巧，学习一下，记录在这里。</p><p>　　最初的问题是这样的:</p><p>　　我有一个表结构，<br /></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font face="Verdana">fphm,kshm<br />2014,00000001<br />2014,00000002<br />2014,00000003<br />2014,00000004<br />2014,00000005<br />2014,00000007<br />2014,00000008<br />2014,00000009<br />2013,00000120<br />2013,00000121<br />2013,00000122<br />2013,00000124<br />2013,00000125</font></td></tr></tbody></table><p>　　(第二个字段内可能是连续的数据，可能存在断点。)</p><p>　　怎样能查询出来这样的结果,查询出连续的记录来。</p><p>　　就像下面的这样? </p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font face="Verdana">2014,00000001,00000005<br />2014,00000009,00000007<br />2013,00000120,00000122<br />2013,00000124,00000125</font></td></tr></tbody></table><p>　　朋友给出了一个非常巧妙的答案: </p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">SQL&gt; SELECT b.fphm, MIN (b.kshm) Start_HM, MAX (b.kshm) End_HM<br />2 FROM (SELECT a.*, TO_NUMBER (a.kshm - ROWNUM) cc<br />3 FROM (SELECT *<br />4 FROM t<br />5 ORDER BY fphm, kshm) a) b<br />6 GROUP BY b.fphm, b.cc<br />7 /</font></p><p><font face="Verdana">FPHM START_HM END_HM<br />---------- -------- --------<br />2013 00000120 00000122<br />2013 00000124 00000125<br />2014 00000001 00000005<br />2014 00000007 00000009</font></p></td></tr></tbody></table><p>　　巧思妙想，就在一念之间。</p></a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 16:47 <a href="http://www.cppblog.com/stevennash/articles/13249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005 Express 安装详解</title><link>http://www.cppblog.com/stevennash/articles/13248.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13248.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13248.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13248.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13248.html</trackback:ping><description><![CDATA[
		<a class="f20">SQL Server 2005 Express 安装详解</a>
		<br />
		<br />
		<a class="f1">  
<div class="guanggao"><span id="contentAdv"></span></div><p>　　随着SQL Server 2005 Express Edition、SQL Server Management Studio Express以及Microsoft SQL Desktop Edition的发布，微软公司已经步入小型数据库市场领域。SQL Server Management Studio Express是一款拥有各种特征的管理工具，完全能够与SQL Server Enterprise Manager相媲美。特别是，它是非常适合于小程序、小Web站点使用的小型数据库软件。</p><p>　　以下是安装SQL Server 2005 Express Edition的详细过程:</p><p>　　第一步: 下载 SQL Server 2005 Express Edition</p><p>　　SQL Server 2005 Express Edition下载页面提供了3个独立的下载地址，你可从这3个地址中下载2005 Express版本。</p><p>　　表A – 确定安装需要的特征</p><p></p><table style="WIDTH: 499px; HEIGHT: 281px" bordercolor="#000000" cellspacing="0" cellpadding="0" width="499" bgcolor="#ffffff" border="1" heihgt=""><tbody><tr><td> 版本特征</td><td>  
<p align="center"><a href="http://go.microsoft.com/fwlink/?LinkId=65212" target="_blank"><font color="#002c99">SQL Server 2005 Express Edition SP1</font></a></p></td><td>  
<p align="center"><a href="http://go.microsoft.com/fwlink/?LinkId=65109" target="_blank"><font color="#002c99">SQL Server 2005 Express Edition with Advanced Services SP1</font></a></p></td><td>  
<p align="center"><a href="http://go.microsoft.com/fwlink/?LinkId=65111" target="_blank"><font color="#002c99">SQL Server 2005 Express Edition Toolkit SP1</font></a></p></td></tr><tr><td>  
<p>数据库引擎</p></td><td>  
<p align="center">X</p></td><td>  
<p align="center">X</p></td><td> </td></tr><tr><td>  
<p>客户软件</p></td><td>  
<p align="center">X</p></td><td>  
<p align="center">X</p></td><td>  
<p align="center">X</p></td></tr><tr><td>  
<p>全文本搜索</p></td><td> </td><td>  
<p align="center">X</p></td><td> </td></tr><tr><td>  
<p>报表服务</p></td><td> </td><td>  
<p align="center">X</p></td><td> </td></tr><tr><td>  
<p>Management Studio Express</p></td><td> </td><td>  
<p align="center">X</p></td><td>  
<p align="center">X</p></td></tr></tbody></table><p>　　第二步:确定系统要求</p><p>　　SQL Server 2005 Express Edition没有明显的系统要求，尤其在服务器功能非常强大的今天更是如此。其最低的系统要求如表B 所示:</p><p>　　表 B -- SQL Server 2005 Express Edition 的系统和软件要求</p><p></p><table style="WIDTH: 504px; HEIGHT: 554px" bordercolor="#000000" cellspacing="0" cellpadding="0" width="504" bgcolor="#ffffff" border="1" heihgt=""><tbody><tr><td>  
<p align="center"><strong>版本</strong><strong>特征</strong></p></td><td>  
<p>SQL Server 2005 Express Edition SP1</p></td><td>  
<p>SQL Server 2005 Express Edition with Advanced Services SP1</p></td><td><p>SQL Server 2005 Express Edition Toolkit SP1</p> </td></tr><tr><td>  
<p>RAM (最小)</p></td><td>  
<p>192 MB</p></td><td>  
<p>512 MB</p></td><td>  
<p>512 MB</p></td></tr><tr><td> RAM (推荐)</td><td>  
<p>512 MB</p></td><td>  
<p>1 GB</p></td><td>  
<p>1 GB</p></td></tr><tr><td>  
<p>Drive space</p></td><td colspan="3">  
<p>600 MB</p></td></tr><tr><td> Processor (最小)</td><td colspan="3">  
<p>600 MHz</p></td></tr><tr><td> Processor (推荐)</td><td colspan="3">  
<p>1 GHz</p></td></tr><tr><td> IIS 5 or 更高</td><td>  
<p>No</p></td><td>  
<p>Yes</p></td><td>  
<p>No</p></td></tr><tr><td>  
<p>操作系统支持</p></td><td colspan="3">  
<p>Windows Server 2003 SP1, Windows Server 2003 Enterprise Edition SP1, </p><p>Windows Server 2003 Datacenter Edition SP1, Windows Server 2003 Web Edition SP1, Windows Small Business Server 2003 Standard Edition SP1, Windows Small Business Server 2003 Premium Edition SP1, Windows XP Professional SP2, Windows XP Home Edition SP2, Windows XP Tablet Edition SP2, Windows XP Media Edition SP2, Windows 2000 Professional Edition SP4, Windows 2000 Server Edition SP4, Windows 2000 Advanced Edition SP4, Windows 2000 Datacenter Server Edition SP4</p></td></tr><tr><td>  
<p>软件条件</p></td><td colspan="3">  
<p>.NET Framework 2.0 &amp; MSXML 6</p></td></tr><tr><td> 其他要求</td><td colspan="3">  
<p>服务器连接到活动目录域</p></td></tr></tbody></table><p>　　强烈建议不要使用已有其它作用的服务器用于安装本软件。如果没有多余的硬件设备，可以考虑使用VMware Server或Virtual Server 2005 R2，并且创建一个虚拟机。这两个产品都是免费的，而且用于创建测试平台非常好。SQL Server 2005需要.NET Framework 2.0，它能暂停某些程序，以保持数据库分离。<br /><br /></p></a>
		<a class="f1"> 
<div class="guanggao"><span id="contentAdv"></span></div><p></p><p>　　第三步: 安装数据库软件的必要条件</p><p>　　在上面已经提到SQL Server 2005 Express Edition有很多软件要求。在安装数据库软件之前，必须准备好这些必要条件。</p><p>　　依次按照以下顺序安装相应的内容。</p><p>　　互联网信息服务器5或更高</p><p>　　如果Windows服务器没有安装IIS，请从“开始”|“控制面板”|“添加删除程序”|“添加删除Windows组件”进行安装。</p><p>　　.NET Framework 2.0</p><p>　　下载完成后，执行dotnetfx.exe文件，然后根据提示一步一步地操作，以下是我给出一些屏幕截图。</p><p>　　MSXML6</p><p>　　执行msxml6.msi，进行快速安装。</p><p>　　第四步: 创建 SQL Server service帐户</p><p>　　从安全方面考虑，最好是作为常规用户运行SQL Server。倘若有可能，不要在SQL Server上使用built-in服务帐户。</p><p>　　创建一个域帐户，命名为“SQLExpressUser”，如果连接到另一个域，则应该使用“活动目录用户”和“计算机”。如果仅仅进行本地测试，使用“计算机管理”添加帐户。并请为帐户指定合适的口令。</p><p>　　第五步: 安装SQL Server 2005 Express Edition</p><p>　　在本文中，我演示安装SQL Server 2005 Express Edition with Advanced Services SP1的过程。下载的文件名为“SQLEXPR_ADV.EXE”。双击文件开始安装。文件的内容将被解压缩并开始执行安装。</p><p>　　安装开始之后，在电脑屏幕给出安装之前必须准备的必要条件信息之前，必须同意端用户许可协议。安装程序将处理这些安装必要条件。点击“安装”按钮，则开始安装这些内容，并点击“下一步”。</p><p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/4ps6c480sgk5.jpg" border="1" /></p><p>　　图 A:需要安装新的本地客户端和设置支持文件。</p><p>　　如果必要条件满足，SQL Server安装向导将开始工作。图A显示必要条件的列表。在图B中，你可以看到在测试系统中有个关于最小硬件要求的警告信息。我将SQL Server 2005 Express Edition安装在基于VMware Server的虚拟机上，安装程序似乎不喜欢这样:因为我仅仅为虚拟机分配768M RAM，而SQL Server实际需要1GB 。但是这个警告信息并不会终止安装程序，所以我们可以继续安装。点击“下一步”继续。</p></a>
		<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/4077vw3nal3n.jpg" border="1" />
		<p>　　图 B 如果产生严重问题，请在继续安装前更正它们</p>
		<p>　　之后，需要提供用户名和计算机名。并且不要选中“隐藏高级配置选项”复选框，所以在安装的时候，可以看到这些可选内容。</p>
		<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/akkh83smd62q.jpg" border="1" /></p>
		<p>　　图 C:提供注册的详细信息</p>
		<p>　　下一步，将选择安装的特性与功能。虽然Express Edition是免费的，但它仍包含标准版和企业版的很多特征。请注意，我选择安装的是Management Studio Express，这是微软推出一款杰出的、可取代Query Analyzer和Enterprise Manager的软件。我强烈向大家推荐安装此版本。当前，我安装的默认路径为:C:\Program Files\Microsoft SQL Server。如果需要安装在其它路径，则点击“浏览”按钮并选择新路径即可。</p>
		<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/2ry15uoyn8q8.jpg" border="1" /></p>
		<p>　　图D:确定安装的特性</p>
		<a class="f1">
				<div class="guanggao">
						<span id="contentAdv">
						</span>
				</div>
				<p>
				</p>
				<p>　　SQL Server 2000安装可包含很多实例，并且可以从单个SQL Sever向多个数据库提供服务。SQL Server 2005 Express Edition支持多达16个指定的实例，而Enterprise Edition则支持更多，达到50个。我在服务器上安装SQL Server 2005 Express Edition作为默认的数据库实例。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/x1t6esxcpr67.jpg" border="1" /></p>
				<p>　　图 E:选择实例</p>
				<p>　　设置服务帐户的作用是:更好地保护SQL Server和网络的其他部分，尤其在出现安全问题的时候。如果在管理员帐户下运行SQL Server，则存在其他风险，将有可能危及服务器的安全。因此，一般在普通用户帐户下运行SQL Server 2005 Express Edition比较安全。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/985xz093yvu4.jpg" border="1" /></p>
				<p>　　图 F:使用以前创建的帐户作为SQL Sever2005的服务帐户</p>
				<p>　　SQL Server使用两种方法鉴定使用用户:1、直接依赖Active Directory(Windows鉴定模式);2、依赖其自身数据库(混合模式，同样支持Windows鉴定)。从安全角度考虑，Windows鉴定模式是首选。因为此时仅有一个单用户数据库。</p>
				<p>　　然而，Windows鉴定模式不一定都是合适的。有时候使用混合鉴定模式的SQL Sever则比Windows鉴定模式SQL Sever更加安全。如果选择了混合模式，则需要为SQL Sever 的“sa”用户提供一个密码。如果采用这种方法，请注意设置另外一个密码。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/hb59h597t87x.jpg" border="1" /></p>
				<p>　　图 G:选择SQL用户鉴定模式</p>
		</a>
		<a class="f1">
				<div class="guanggao">
						<span id="contentAdv">
						</span>
				</div>
				<p>
				</p>
				<p>　　下一步，则是选择校对方法。如果需要保持与以前老版本的SQL Sever的兼容性，则必须选择“SQL Collations”。如果不需要考虑兼容性问题，则可选择“Latin1_General”校对方法，此时可选择使用不同的语言。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/1fyb1s3d4b53.jpg" border="1" /></p>
				<p>　　图 H:选择校对方法</p>
				<p>　　SQL Server 2005 Express提供了一些新特征，比如在普通用户账户下运行产品实例。使用用户实例，则用户可具有SQL“sandbox”的SQL系统管理员权限，但是其他系统仍受保护，因为用户的初级账户没有权力作全局修改。数据库在用户实例下只支持单连接，高端特征如“复制”则不支持。</p>
				<p>　　如果在安装中需要支持用户实例，则应选中“Enable User Instances”复选框。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/sz5x9ohi3kh7.jpg" border="1" /></p>
				<p>　　图 I:选择是否支持用户实例</p>
				<p>　　“Reporting Services”是 SQL Server 2000的一个附带物，但是其加强版被包含在SQL Sever 2005 中。如果安装小型SQL Server 2005 Express Edition，我推荐安装这个特征，其默认的配置地址为http://{your server name}/ReportServer。Report Manager工具放置在http://{your server name}/Reports下。</p>
				<p>　　如果在开发过程中使用SQL Server 2005 和Reporting Services，请注意获得Reporting Services站点的SSL证书。SSL证书被收藏在IIS中。我将在另一篇“怎么办”文章中解释如何在IIS中安装证书。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/mft42dcd409m.jpg" border="1" /></p>
				<p>　　图J:Reporting Services是SQL Sever的一个很受欢迎的附属品</p>
		</a>
		<a class="f1">
				<div class="guanggao">
						<span id="contentAdv">
						</span>
				</div>
				<p>
				</p>
				<p>　　微软在其他应用中包含了一个令人惊奇的错误报告工具。这一特征也包含在SQL Server 2005 Express的可选项中。另外，微软欢迎你发送匿名的安装使用数据给他们，但这一选项不是默认激活的。从个人来说，我喜欢这个错误报告服务，但是我不喜欢发送使用信息。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/k2k9n9cnr2ad.jpg" border="1" /></p>
				<p>　　图 K:确定向微软发送的信息</p>
				<p>　　这些都是SQL Server 2005 Express Edition的可选项，选择这些选项以继续安装。</p>
				<p>　　<img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://searchdatabase.techtarget.com.cn/imagelist/06/39/2km7a1265z67.jpg" border="1" /></p>
				<p>　　图 L:安装进度</p>
				<p>　　在某些情况下，当出现SQL Native Client 和 SQL Server Database Services错误时，则导致安装失败。另外，工作站组件也会提示失败。如果发生这种情况，则有可能是电脑上存在相冲突的SQL Server 服务，并且以前安装的Native Client产生了问题。如果确实是这样，请参看下面的步骤进行修正:</p>
				<p>　　将工作目录转换到存放下载的SQL Server Express 2005 installer位置。</p>
				<p>　　释放安装程序中的内容到一个新的目录:SQLEXPR_ADV.EXE /x:c:\sqltmp。如果下载的文件没有包含这个高级服务，请使用下面的命令:SQLEXPR.EXE /x:c:\sqltmp进行代替。</p>
				<p>　　转换到C:\sqltmp\setup。</p>
				<p>　　运行“sqlncli.msi”。</p>
				<p>　　选择“卸载Uninstal”选项。</p>
				<p>　　重启服务器。</p>
				<p>　　再次运行SQL Server Express 2005 installer，安装应该会成功了。</p>
				<p>　　安装完毕</p>
				<p>　　此时，SQL Server 2005 Express Edition安装完毕，并且可以使用与数据库服务器一起安装的SQL Server Management Studio Express工具进行管理。可以通过“开始|所有程序| Microsoft SQL Server 2005 | SQL Server Management Studio Express”运行此工具。</p>
				<p>　　在下一篇文章中，我将演示如何使用Surface Area Configuration工具和Management Studio Express管理新安装的数据库。</p>
		</a>
		<a class="f1">
		</a>
<img src ="http://www.cppblog.com/stevennash/aggbug/13248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 16:46 <a href="http://www.cppblog.com/stevennash/articles/13248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>