﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-blog.Toby</title><link>http://www.blogjava.net/SIDNEY/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 24 Apr 2026 05:12:16 GMT</lastBuildDate><pubDate>Fri, 24 Apr 2026 05:12:16 GMT</pubDate><ttl>60</ttl><item><title>解析plugin-cfg.xml文件</title><link>http://www.blogjava.net/SIDNEY/archive/2010/12/31/342103.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Fri, 31 Dec 2010 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2010/12/31/342103.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/342103.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2010/12/31/342103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/342103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/342103.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;此元素启动 WebSphere HTTP 插件配置文件。它可以包含一个或多个下列元素和属性：IgnoreDNSFailures指定启动时插件是否忽略配置中的 DNS 故障。当设置为&nbsp;true&nbsp;时，如果每个 ServerCluster 中至少有一个服务器能够解析主机名，则插件忽略配置中的 DNS 故障并成功启动。任何主机名无法解析的服务器在配置期间...&nbsp;&nbsp;<a href='http://www.blogjava.net/SIDNEY/archive/2010/12/31/342103.html'>阅读全文</a><img src ="http://www.blogjava.net/SIDNEY/aggbug/342103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2010-12-31 22:47 <a href="http://www.blogjava.net/SIDNEY/archive/2010/12/31/342103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAP</title><link>http://www.blogjava.net/SIDNEY/archive/2009/09/03/293793.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Thu, 03 Sep 2009 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/09/03/293793.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/293793.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/09/03/293793.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/293793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/293793.html</trackback:ping><description><![CDATA[LDAP的英文全称是Lightweight Directory Access Protocol，一般都简称为LDAP。它是基于X.500标准的，但是简单多了并且可以根据需要定制。与X.500不同，LDAP支持TCP/IP，这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义，所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据：电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表，等等。通过把LDAP目录作为系统集成中的一个重要环节，可以简化员工在企业内部查询信息的步骤，甚至连主要的数据源都可以放在任何地方。&nbsp;<br />
<br />
&nbsp;<font color="#000099"><strong> LDAP目录的优势&nbsp;</strong></font><br />
<br />
&nbsp;&nbsp;&nbsp; 如果需要开发一种提供公共信息查询的系统一般的设计方法可能是采用基于WEB的数据库设计方式，即前端使用浏览器而后端使用WEB服务器加上关系数据库。后端在Windows的典型实现可能是Windows NT + IIS + Acess数据库或者是SQL服务器，IIS和数据库之间通过ASP技术使用ODBC进行连接，达到通过填写表单查询数据的功能；&nbsp;<br />
&nbsp;&nbsp;&nbsp; 后端在Linux系统的典型实现可能是Linux+ Apache + postgresql，Apache和数据库之间通过PHP3提供的函数进行连接。使用上述方法的缺点是后端关系数据库的引入导致系统整体的性能降低和系统的管理比较繁琐，因为需要不断的进行数据类型的验证和事务的完整性的确认；并且前端用户对数据的控制不够灵活，用户权限的设置一般只能是设置在表一级而不是设置在记录一级。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 目录服务的推出主要是解决上述数据库中存在的问题。目录与关系数据库相似，是指具有描述性的基于属性的记录集合，但它的数据类型主要是字符型，为了检索的需要添加了BIN（二进制数据）、CIS（忽略大小写）、CES（大小写敏感）、TEL（电话型）等语法（Syntax），而不是关系数据库提供的整数、浮点数、日期、货币等类型，同样也不提供象关系数据库中普遍包含的大量的函数，它主要面向数据的查询服务（查询和修改操作比一般是大于10:1），不提供事务的回滚（rollback）机制，它的数据修改使用简单的锁定机制实现All-or-Nothing，它的目标是快速响应和大容量查询并且提供多目录服务器的信息复制功能。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是：可以在任何计算机平台上，用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易定制应用程序为它加上LDAP的支持。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP协议是跨平台的和标准的协议，因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上，LDAP得到了业界的广泛认可，因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持，因为他们根本不用考虑另一端（客户端或服务端）是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器（或者还可能是具有LDAP界面的关系型数据库），因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。与LDAP不同的是，如果软件产商想在软件产品中集成对DBMS的支持，那么通常都要对每一个数据库服务器单独定制。不象很多商用的关系型数据库，你不必为LDAP的每一个客户端连接或许可协议付费 大多数的LDAP服务器安装起来很简单，也容易维护和优化。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP服务器可以用&#8220;推&#8221;或&#8220;拉&#8221;的方法复制部分或全部数据，例如：可以把数据&#8220;推&#8221;到远程的办公室，以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。如果要在DBMS中使用相同的复制功能，数据库产商就会要你支付额外的费用，而且也很难管理。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP允许你根据需要使用ACI（一般都称为ACL或者访问控制列表）控制对数据读和写的权限。例如，设备管理员可以有权改变员工的工作地点和办公室号码，但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的，所以不用担心在客户端的应用程序上是否要进行安全检查。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP（Lightweight Directory Acess Protocol）是目录服务在TCP/IP上的实现（RFC 1777 V2版和RFC 2251 V3版）。它是对X500的目录协议的移植，但是简化了实现方法，所以称为轻量级的目录服务。在LDAP中目录是按照树型结构组织，目录由条目（Entry）组成，条目相当于关系数据库中表的记录；条目是具有区别名DN（Distinguished Name）的属性（Attribute）集合，DN相当于关系数据库表中的关键字（Primary Key）；属性由类型（Type）和多个值（Values）组成，相当于关系数据库中的域（Field）由域名和数据类型组成，&nbsp;<br />
只是为了方便检索的需要，LDAP中的Type可以有多个Value，而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织，非常的直观。LDAP把数据存放在文件中，为提高效率可以使用基于索引的文件数据库，而不是关系数据库。LDAP协议集还规定了DN的命名方法、存取控制方法、搜索格式、复制方法、URL格式、开发接口等&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP对于这样存储这样的信息最为有用，也就是数据需要从不同的地点读取，但是不需要经常更新。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 例如，这些信息存储在LDAP目录中是十分有效的：&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;<font color="#000099"> l 公司员工的电话号码簿和组织结构图&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 客户的联系信息&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 计算机管理需要的信息，包括NIS映射、email假名，等等&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 软件包的配置信息&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 公用证书和安全密匙&nbsp;<br />
<br />
&nbsp; 什么时候该用LDAP存储数据&nbsp;</font><br />
<br />
&nbsp;&nbsp;&nbsp; 大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此，当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化，大多数的LDAP目录服务器并不适合存储需要需要经常改变的数据。例如，用LDAP服务器来存储电话号码是一个很好的选择，但是它不能作为电子商务站点的数据库服务器。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 如果下面每一个问题的答案都是&#8220;是&#8221;，那么把数据存在LDAP中就是一个好主意。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;<font color="#000099"> l 需要在任何平台上都能读取数据吗？&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 每一个单独的记录项是不是每一天都只有很少的改变？&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 可以把数据存在平面数据库（flat database）而不是关系型数据库中吗？换句话来说，也就是不管什么范式不式的，把所有东西都存在一个记录中（差不多只要满足第一范式）。&nbsp;</font><br />
<br />
&nbsp;&nbsp;&nbsp; 最后一个问题可能会唬住一些人，其实用平面数据库去存储一些关系型的数据也是很一般的。例如，一条公司员工的记录就可以包含经理的登录名。用LDAP来存储这类信息是很方便的。一个简单的判断方法：如果可以把保数据存在一张张的卡片里，就可以很容易地把它存在LDAP目录里。&nbsp;<br />
<br />
<br />
&nbsp;<font color="#000099"><strong> 安全和访问控制&nbsp;</strong></font><br />
<br />
&nbsp;&nbsp;&nbsp; LDAP提供很复杂的不同层次的访问控制或者ACI。因这些访问可以在服务器端控制，这比用客户端的软件保证数据的安全可安全多了。&nbsp;<br />
<br />
用LDAP的ACI，可以完成：&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 给予用户改变他们自己的电话号码和家庭地址的权限，但是限制他们对其它数据（如，职务名称，经理的登录名，&nbsp;<br />
等等）只有&#8220;只读&#8221;权限。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 给予&#8220;HR-admins"组中的所有人权限以改变下面这些用户的信息：经理、工作名称、员工号、部门名称和部门号。&nbsp;<br />
但是对其它域没有写权限。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 禁止任何人查询LDAP服务器上的用户口令，但是可以允许用户改变他或她自己的口令。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 给予经理访问他们上级的家庭电话的只读权限，但是禁止其他人有这个权限。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 给予&#8220;host-admins"组中的任何人创建、删除和编辑所有保存在LDAP服务器中的与计算机主机有关的信息&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 通过Web，允许&#8220;foobar-sales"组中的成员有选择地给予或禁止他们自己读取一部分客户联系数据的读权限。这将允许他们把客户联系信息下载到本地的笔记本电脑或个人数字助理（PDA）上。（如果销售人员的软件都支持LDAP，这将非常有用）&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 通过Web，允许组的所有者删除或添加他们拥有的组的成员。例如：可以允许销售经理给予或禁止销售人员改变Web页的权限。也可以允许邮件假名（mail aliase）的所有者不经过IT技术人员就直接从邮件假名中删除或添加用户。&#8220;公用&#8221;的邮件列表应该允许用户从邮件假名中添加或删除自己（但是只能是自己）。也可以对IP地址或主机名加以限制。例如，某些域只允许用户IP地址以192.168.200.*开头的有读的权限，或者用户反向查找DNS得到的主机名必须为*.foobar.com。&nbsp;<br />
<br />
&nbsp; <font color="#000099"><strong>LDAP目录树的结构&nbsp;<br />
</strong></font><br />
&nbsp;&nbsp;&nbsp; LDAP目录以树状的层次结构来存储数据。如果你对自顶向下的DNS树或UNIX文件的目录树比较熟悉，也就很容易掌握LDAP目录树这个概念了。就象DNS的主机名那样，LDAP目录记录的标识名（Distinguished Name，简称DN）是用来读取单个记录，以及回溯到树的顶部。后面会做详细地介绍。&nbsp;<br />
<br />
&nbsp;&nbsp; 为什么要用层次结构来组织数据呢？原因是多方面的。下面是可能遇到的一些情况：&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 如果你想把所有的美国客户的联系信息都&#8220;推&#8221;到位于到西雅图办公室（负责营销）的LDAP服务器上，但是你不想把公司的资产管理信息&#8220;推&#8221;到那里。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 你可能想根据目录树的结构给予不同的员工组不同的权限。在下面的例子里，资产管理组对&#8220;asset-mgmt"部分有完全的访问权限，但是不能访问其它地方。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 把LDAP存储和复制功能结合起来，可以定制目录树的结构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每分钟更新的美国销售状况的信息，但是欧洲的销售情况就只要每小时更新一次就行了。&nbsp;<br />
<br />
&nbsp; <font color="#000099"><strong>刨根问底：基准DN&nbsp;</strong></font><br />
<br />
&nbsp;&nbsp;&nbsp; LDAP目录树的最顶部就是根，也就是所谓的&#8220;基准DN"。基准DN通常使用下面列出的三种格式之一。假定我在名为FooBar的电子商务公司工作，这家公司在Internet上的名字是foobar.com。 o="FooBar, Inc.", c=US （以X.500格式表示的基准DN） 在这个例子中o=FooBar, Inc. 表示组织名，在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前，一般都用这种方式来表示基准DN。但是事物总是在不断变化的，现在所有的公司都已经（或计划）上Internet上。随着&nbsp;<br />
Internet的全球化，在基准DN中使用国家代码很容易让人产生混淆。现在，X.500格式发展成下面列出的两种格式。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; o=foobar.com&nbsp;<br />
<br />
（用公司的Internet地址表示的基准DN）&nbsp;<br />
<br />
这种格式很直观，用公司的域名作为基准DN。这也是现在最常用的格式。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; dc=foobar, dc=com&nbsp;<br />
<br />
（用DNS域名的不同部分组成的基准DN）&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 就象上面那一种格式，这种格式也是以DNS域名为基础的，但是上面那种格式不改变域名（也就更易读），而这种格式把域名：foobar.com分成两部分 dc=foobar, dc=com。在理论上，这种格式可能会更灵活一点，但是对于最终用户来说也更难记忆一点。考虑一下foobar.com这个例子。当foobar.com和gizmo.com合并之后，可以简单的把&#8220;dc=com"当作基准DN。把新的记录放到已经存在的dc=gizmo, dc=com目录下，这样就简化了很多工作（当然，如果foobar.com和wocket.edu合并，这个方法就不能用了）。如果LDAP服务器是新安装的，我建议你使用这种格式。再请注意一下，如果你打算使用活动目录（Actrive Directory），Microsoft已经限制你必须使用这种格式。&nbsp;<br />
<br />
更上一层楼：在目录树中怎么组织数据&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 在UNIX文件系统中，最顶层是根目录（root）。在根目录的下面有很多的文件和目录。象上面介绍的那样，LDAP目录也是用同样的方法组织起来的。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 在根目录下，要把数据从逻辑上区分开。因为历史上（X.500）的原因，大多数LDAP目录用OU从逻辑上把数据分开来。OU&nbsp;<br />
表示&#8220;Organization Unit"，在X.500协议中是用来表示公司内部的机构：销售部、财务部，等等。现在LDAP还保留ou=这样的命名规则，但是扩展了分类的范围，可以分类为：ou=people, ou=groups, ou=devices，等等。更低一级的OU有时用来做更细的归类。例如：LDAP目录树（不包括单独的记录）可能会是这样的：&nbsp;<br />
<br />
dc=foobar, dc=com&nbsp;<br />
<br />
ou=customers&nbsp;<br />
<br />
ou=asia&nbsp;<br />
<br />
ou=europe&nbsp;<br />
<br />
ou=usa&nbsp;<br />
<br />
ou=employees&nbsp;<br />
<br />
ou=rooms&nbsp;<br />
<br />
ou=groups&nbsp;<br />
<br />
ou=assets-mgmt&nbsp;<br />
<br />
ou=nisgroups&nbsp;<br />
<br />
ou=recipes&nbsp;<br />
<br />
单独的LDAP记录&nbsp;<br />
<br />
&nbsp; <strong><font color="#000099">DN是LDAP记录项的名字&nbsp;</font></strong><br />
<br />
&nbsp;&nbsp;&nbsp; 在LDAP目录中的所有记录项都有一个唯一的&#8220;Distinguished Name"，也就是DN。每一个LDAP记录项的DN是由两个部分组成的：相对DN（RDN）和记录在LDAP目录中的位置。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字，这个名字通常存在cn（Common Name）这个属性里。因为几乎所有的东西都有一个名字，在LDAP中存储的对象都用它们的cn值作为RDN的基础。如果我把最喜欢的吃燕麦粥食谱存为一个记录，我就会用cn=Oatmeal Deluxe作为记录项的RDN。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 我的LDAP目录的基准DN是dc=foobar,dc=com&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 我把自己的食谱作为LDAP的记录项存在ou=recipes&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 我的LDAP记录项的RDN设为cn=Oatmeal Deluxe&nbsp;<br />
<br />
上面这些构成了燕麦粥食谱的LDAP记录的完整DN。记住，DN的读法和DNS主机名类似。下面就是完整的DN：&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com&nbsp;<br />
<br />
举一个实际的例子来说明DN&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 现在为公司的员工设置一个DN。可以用基于cn或uid（User ID），作为典型的用户帐号。例如，FooBar的员工Fran Smith （登录名：fsmith）的DN可以为下面两种格式：&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; uid=fsmith,ou=employees,dc=foobar,dc=com&nbsp;<br />
<br />
（基于登录名）&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP（以及X.500）用uid表示&#8220;User ID"，不要把它和UNIX的uid号混淆了。大多数公司都会给每一个员工唯一的登录名，因此用这个办法可以很好地保存员工的信息。你不用担心以后还会有一个叫Fran Smith的加入公司，如果Fran改变了她的名字（结婚？离婚？或宗教原因？），也用不着改变LDAP记录项的DN。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; cn=Fran Smith,ou=employees,dc=foobar,dc=com&nbsp;<br />
<br />
（基于姓名）&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 可以看到这种格式使用了Common Name（CN）。可以把Common Name当成一个人的全名。这种格式有一个很明显的缺点就是：如果名字改变了，LDAP的记录就要从一个DN转移到另一个DN。但是，我们应该尽可能地避免改变一个记录项的DN。&nbsp;<br />
<br />
&nbsp; <font color="#000099"><strong>定制目录的对象类型&nbsp;</strong></font><br />
<br />
你可以用LDAP存储各种类型的数据对象，只要这些对象可以用属性来表示，下面这些是可以在LDAP中存储的一些信息：&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; l 员工信息：员工的姓名、登录名、口令、员工号、他的经理的登录名，邮件服务器，等等。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; l 物品跟踪信息：计算机名、IP地址、标签、型号、所在位置，等等。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; l 客户联系列表：客户的公司名、主要联系人的电话、传真和电子邮件，等等。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; l 会议厅信息：会议厅的名字、位置、可以坐多少人、电话号码、是否有投影机。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; l 食谱信息：菜的名字、配料、烹调方法以及准备方法。&nbsp;<br />
<br />
因为LDAP目录可以定制成存储任何文本或二进制数据，到底存什么要由你自己决定。LDAP目录用对象类型（object classes）的概念来定义运行哪一类的对象使用什么属性。在几乎所有的LDAP服务器中，你都要根据自己的需要扩展基本的LDAP目录的功能，创建新的对象类型或者扩展现存的对象类型。&nbsp;<br />
<br />
LDAP目录以一系列&#8220;属性对&#8221;的形式来存储记录项，每一个记录项包括属性类型和属性值（这与关系型数据库用行和列来存取数据有根本的不同）。下面是我存在LDAP目录中的一部分食谱记录：&nbsp;<br />
<br />
dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com&nbsp;<br />
<br />
cn: Instant Oatmeal Deluxe&nbsp;<br />
<br />
recipeCuisine: breakfast&nbsp;<br />
<br />
recipeIngredient: 1 packet instant oatmeal&nbsp;<br />
<br />
recipeIngredient: 1 cup water&nbsp;<br />
<br />
recipeIngredient: 1 pinch salt&nbsp;<br />
<br />
recipeIngredient: 1 tsp brown sugar&nbsp;<br />
<br />
recipeIngredient: 1/4 apple, any type&nbsp;<br />
<br />
请注意上面每一种配料都作为属性recipeIngredient值。LDAP目录被设计成象上面那样为一个属性保存多个值的，而不是在每一个属性的后面用逗号把一系列值分开。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 因为用这样的方式存储数据，所以数据库就有很大的灵活性，不必为加入一些新的数据就重新创建表和索引。更重要的是，LDAP目录不必花费内存或硬盘空间处理&#8220;空&#8221;域，也就是说，实际上不使用可选择的域也不会花费你任何资源。&nbsp;<br />
<br />
&nbsp; <strong><font color="#000099">作为例子的一个单独的数据项&nbsp;<br />
</font></strong><br />
让我们看看下面这个例子。我们用Foobar, Inc.的员工Fran Smith的LDAP记录。这个记录项的格式是LDIF，用来导入和导出LDAP目录的记录项。&nbsp;<br />
<br />
dn: uid=fsmith, ou=employees, dc=foobar, dc=com&nbsp;<br />
<br />
objectclass: person&nbsp;<br />
<br />
objectclass: organizationalPerson&nbsp;<br />
<br />
objectclass: inetOrgPerson&nbsp;<br />
<br />
objectclass: foobarPerson&nbsp;<br />
<br />
uid: fsmith&nbsp;<br />
<br />
givenname: Fran&nbsp;<br />
<br />
sn: Smith&nbsp;<br />
<br />
cn: Fran Smith&nbsp;<br />
<br />
cn: Frances Smith&nbsp;<br />
<br />
telephonenumber: 510-555-1234&nbsp;<br />
<br />
roomnumber: 122G&nbsp;<br />
<br />
o: Foobar, Inc.&nbsp;<br />
<br />
mailRoutingAddress: fsmith@foobar.com&nbsp;<br />
<br />
mailhost: mail.foobar.com&nbsp;<br />
<br />
userpassword: {crypt}3x1231v76T89N&nbsp;<br />
<br />
uidnumber: 1234&nbsp;<br />
<br />
gidnumber: 1200&nbsp;<br />
<br />
homedirectory: /home/fsmith&nbsp;<br />
<br />
loginshell: /usr/local/bin/bash&nbsp;<br />
<br />
属性的值在保存的时候是保留大小写的，但是在默认情况下搜索的时候是不区分大小写的。某些特殊的属性（例如，password）在搜索的时候需要区分大小写。&nbsp;<br />
<br />
让我们一点一点地分析上面的记录项。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; dn: uid=fsmith, ou=employees, dc=foobar, dc=com&nbsp;<br />
<br />
这是Fran的LDAP记录项的完整DN，包括在目录树中的完整路径。LDAP（和X.500）使用uid（User ID），不要把它和UNIX的uid号混淆了。&nbsp;<br />
<br />
objectclass: person&nbsp;<br />
<br />
objectclass: organizationalPerson&nbsp;<br />
<br />
objectclass: inetOrgPerson&nbsp;<br />
<br />
objectclass: foobarPerson&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 可以为任何一个对象根据需要分配多个对象类型。person对象类型要求cn（common name）和sn（surname）这两个域不能为空。persion对象类型允许有其它的可选域，包括givenname、telephonenumber，等等。organizational Person给person加入更多的可选域，inetOrgPerson又加入更多的可选域（包括电子邮件信息）。最后，foobarPerson是为Foobar定制的对象类型，加入了很多定制的属性。&nbsp;<br />
<br />
uid: fsmith&nbsp;<br />
<br />
givenname: Fran&nbsp;<br />
<br />
sn: Smith&nbsp;<br />
<br />
cn: Fran Smith&nbsp;<br />
<br />
cn: Frances Smith&nbsp;<br />
<br />
telephonenumber: 510-555-1234&nbsp;<br />
<br />
roomnumber: 122G&nbsp;<br />
<br />
o: Foobar, Inc.&nbsp;<br />
<br />
以前说过了，uid表示User ID。当看到uid的时候，就在脑袋里想一想&#8220;login"。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 请注意CN有多个值。就象上面介绍的，LDAP允许某些属性有多个值。为什么允许有多个值呢？假定你在用公司的LDAP服务器查找Fran的电话号码。你可能只知道她的名字叫Fran，但是对人力资源处的人来说她的正式名字叫做Frances。因为保存了她的两个名字，所以用任何一个名字检索都可以找到Fran的电话号码、电子邮件和办公房间号，等等。&nbsp;<br />
<br />
mailRoutingAddress: fsmith@foobar.com&nbsp;<br />
<br />
mailhost: mail.foobar.com&nbsp;<br />
<br />
就象现在大多数的公司都上网了，Foobar用Sendmail发送邮件和处理外部邮件路由信息。Foobar把所有用户的邮件信息都存在LDAP中。最新版本的Sendmail支持这项功能。&nbsp;<br />
<br />
Userpassword: {crypt}3x1231v76T89N&nbsp;<br />
<br />
uidnumber: 1234&nbsp;<br />
<br />
gidnumber: 1200&nbsp;<br />
<br />
gecos: Frances Smith&nbsp;<br />
<br />
homedirectory: /home/fsmith&nbsp;<br />
<br />
loginshell: /usr/local/bin/bash&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 注意，Foobar的系统管理员把所有用户的口令映射信息也都存在LDAP中。FoobarPerson类型的对象具有这种能力。再注意一下，用户口令是用UNIX的口令加密格式存储的。UNIX的uid在这里为uidnumber。提醒你一下，关于如何在LDAP中保存NIS信息，有完整的一份RFC。在以后的文章中我会谈一谈NIS的集成。&nbsp;<br />
<br />
LDAP复制&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; LDAP服务器可以使用基于&#8220;推&#8221;或者&#8220;拉&#8221;的技术，用简单或基于安全证书的安全验证，复制一部分或者所有的数据。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 例如，Foobar有一个&#8220;公用的&#8221;LDAP服务器，地址为ldap.foobar.com，端口为389。Netscape Communicator的电子邮件查询功能、UNIX的&#8220;ph"命令要用到这个服务器，用户也可以在任何地方查询这个服务器上的员工和客户联系信息。公司的主LDAP服务器运行在相同的计算机上，不过端口号是1389。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 你可能即不想让员工查询资产管理或食谱的信息，又不想让信息技术人员看到整个公司的LDAP目录。为了解决这个问题，Foobar有选择地把子目录树从主LDAP服务器复制到&#8220;公用&#8221;LDAP服务器上，不复制需要隐藏的信息。为了保持数据始终是最新的，主目录服务器被设置成即时&#8220;推&#8221;同步。这些种方法主要是为了方便，而不是安全，因为如果有权限的用户想查询所有的数据，可以用另一个LDAP端口。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 假定Foobar通过从奥克兰到欧洲的低带宽数据的连接用LDAP管理客户联系信息。可以建立从ldap.foobar.com:1389到munich-ldap.foobar.com:389的数据复制，象下面这样：&nbsp;<br />
<br />
periodic pull: ou=asia,ou=customers,o=sendmail.com&nbsp;<br />
<br />
periodic pull: ou=us,ou=customers,o=sendmail.com&nbsp;<br />
<br />
immediate push: ou=europe,ou=customers,o=sendmail.com&nbsp;<br />
<br />
&#8220;拉&#8221;连接每15分钟同步一次，在上面假定的情况下足够了。&#8220;推&#8221;连接保证任何欧洲的联系信息发生了变化就&nbsp;<br />
立即被&#8220;推&#8221;到Munich。&nbsp;<br />
用上面的复制模式，用户为了访问数据需要连接到哪一台服务器呢？在Munich的用户可以简单地连接到本地服务&nbsp;<br />
器。如果他们改变了数据，本地的LDAP服务器就会把这些变化传到主LDAP服务器。然后，主LDAP服务器把这些变化&nbsp;<br />
&#8220;推&#8221;回本地的&#8220;公用&#8221;LDAP服务器保持数据的同步。这对本地的用户有很大的好处，因为所有的查询（大多数是读）都在本地的服务器上进行，速度非常快。当需要改变信息的时候，最终用户不需要重新配置客户端的软件，因为LDAP目录服务器为他们完成了所有的数据交换工作。 
<img src ="http://www.blogjava.net/SIDNEY/aggbug/293793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-09-03 21:29 <a href="http://www.blogjava.net/SIDNEY/archive/2009/09/03/293793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cognos 安装文档</title><link>http://www.blogjava.net/SIDNEY/archive/2009/09/02/293612.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 02 Sep 2009 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/09/02/293612.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/293612.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/09/02/293612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/293612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/293612.html</trackback:ping><description><![CDATA[<p>本节主要介绍Cognos系统的安装，建议按照本手册的具体步骤安装，如果没有分别写序号，则是指那些组件可以一次安装。<br />
2．1 Netscape Directory Server的安装和配置<br />
2．1．1 Netscape Directory Server 4.12 的安装<br />
插入&#8220;PowerPlay Enterprise Server Supplementary Software&#8221;安装盘，运行光盘上的Netscape\Directory Server\NT\d412eiu.exe。<br />
如果在安装过程中提示域名错误，则需要按照以下步骤纠正此错误。具体操作步骤如下：用右键单击&#8220;我的电脑&#8221;，单击&#8220;属性&#8221;，单击&#8220;网络标识&#8221;标签，单击&#8220;属性&#8221;，单击&#8220;其它&#8221;，添加&#8220;此计算机的主DNS后缀&#8221;。<br />
详见《PowerPlay Enterprise Server Installation and Configuration Guide》page 153。<br />
2．1．2 Netscape Directory Server 的配置<br />
插入&#8220;PowerPlay Enterprise Server&#8221;安装盘，在AutoRun的安装选择对话框中选择&#8220;Configure a Directory Server&#8221;进行安装。<br />
在Directory Server类型中，选择&#8220;Netscape 3.X/4&#8221;；<br />
在Directory Server配置对话框中，输入&#8220;Directory Server Computer&#8221;，&#8220;Password&#8221;，&#8220;Base Distinguished Name(DN)&#8221;和&#8220;Organization&#8221;的信息，其余可用缺省信息。其中，在&#8220;Directory Server Computer&#8221;中，输入LDAP服务器（本机）的机器名，在&#8220;Base Distinguished Name(DN)&#8221;中可输入&#8220;o=gdb&#8221;，在&#8220;Organization&#8221;中可输入&#8220;gdb&#8221;。<br />
详见《PowerPlay Enterprise Server Installation and Configuration Guide》page 60。<br />
2．2 Impromptu Web Reports 6.0的安装和配置<br />
插入&#8220;Impromptu Web Reports&#8221;安装盘，在AutoRun的安装选择对话框中选择&#8220;Install Cognos Impromptu Web Reports&#8221;完成安装。<br />
2．2．1 Data Store 的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;Data Store&#8221;进行安装；<br />
在创建data store存放位置的画面，单击&#8220;+&#8221;创建一个新的共享名，建议在&#8220;share name&#8221;中输入&#8220;iwr_db&#8221;，在&#8220;path&#8221;中输入&#8220;&lt;drive letter&gt;:\program files\cognos\cer1\database&#8221;。<br />
详见《Impromptu Web Reports Installation and Configuration》page 43。<br />
2．2．2 Impromptu Web Reports Server 的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;Server&#8221;进行安装。<br />
详见《Impromptu Web Reports Installation and Configuration》page 46。<br />
备注：安装过程会提示输入windows系统中安装此产品的用户的密码。此时，输入登陆windows用户密码。需要注意的是：以后如果管理员更改该用户的密码后，必须也在服务&#8220;管理工具－&gt;服务&#8221;中修改两项服务：Cognos Communication Service (cer1)和Impromptu Web Service Manager (CER1)中的登陆用户的密码，否则服务将无法启动。<br />
2．2．3 GateWay 的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装部件选择对话框中选择&#8220;GateWay&#8221;进行安装。<br />
详见《Impromptu Web Reports Installation and Configuration》page 51。<br />
2．2．4 Impromptu Web Reports Administration、IWR Samples、IWR Online Books的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;IWR Administration&#8221;、&#8220;IWR Samples&#8221;、&#8220;IWR Online Books&#8221;进行安装。<br />
详见《Impromptu Web Reports Installation and Configuration》page 31、page 57。<br />
2．3 PowerPlay Enterprise Server 6.6的安装<br />
插入&#8220;PowerPlay Enterprise Server&#8221;安装盘，在AutoRun的安装选择对话框中选择&#8220;Install Cognos PowerPlay Enterprise Server 6.6&#8221;完成安装。<br />
2．3．1 Access Manager Admin Tools、Access Manager Trusted Signon SDK、Common Logon Server 、Ticket Server的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;Access Manager Admin Tools&#8221;（不选择&#8220;Configure a Directory Server&#8221;）、&#8220;Access Manager Trusted Signon SDK&#8221;、&#8220;Common Logon Server&#8221; 、&#8220;Ticket Server&#8221;进行安装。<br />
2．3．2 配置Access Manager Administration<br />
按照以下步骤，完成Access Manager Administration的配置。<br />
1) 启动Access Manager Administration；<br />
2) 在&#8220;Authentication Information&#8221;面板中，单击&#8220;Directory Servers&#8221;文件夹；<br />
3) 从&#8220;Action&#8221;菜单中，单击&#8220;Add Connection&#8221;；<br />
4) 在&#8220;General&#8221;标签中，输入&#8220;Host&#8221;和&#8220;Base Distinguished Name&#8221;的内容，其余的输入项用缺省值。在&#8220;Host&#8221;输入项中输入LDAP服务器的机器名，在&#8220;Base Distinguished Name&#8221;中输入LDAP服务器中的配置，例如o=gdb,c=cn，单击&#8220;Test&#8221;，如果出现&#8220;the directory server is responding&#8221;的信息，则表明测试正确；<br />
5) 单击&#8220;Runtime Credentials&#8221;标签，在&#8220;Runtime Administrator Distinguished Name(DN)&#8221;中，输入登陆到目录服务器的用户名，例如Directory Manager，在&#8220;Runtime Administrator Password&#8221;中，输入用户的密码，单击&#8220;Log On&#8221;，再单击&#8220;Test&#8221;，如果出现&#8220;the credentials are valid&#8221;的信息，则表明测试正确；<br />
6) 单击&#8220;Ticket Server&#8221;标签，单击&#8220;Test&#8221;，如果出现&#8220;the ticket server is responding&#8221;的信息，则表明测试正确。<br />
详见《Impromptu Web Reports Installation and Configuration》page 41。<br />
2．3．3 配置Access Manager Configuration<br />
按照以下步骤，完成Access Manager Configuration的配置。<br />
1) 启动Access Manager Configuration Wizard；<br />
2) 在第一个窗口单击&#8220;下一步&#8221;；<br />
3) 单击&#8220;Custom&#8221;，再单击&#8220;下一步&#8221;；<br />
4) 选择&#8220;Directory Server Configuration&#8221;，再单击&#8220;下一步&#8221;；<br />
5) 在对话框中输入以下信息：<br />
Host：输入LDAP服务器的机器名字<br />
Base Distinguished Name(DN)：输入LDAP服务器中的配置，例如o=gdb,c=cn<br />
假如在对话框的底部出现&#8220;directory server is responding&#8221;的信息，则表明配置正确；<br />
6) 单击&#8220;下一步&#8221;；<br />
7) 选择&#8220;(Use the Directory Server Default Namespace)&#8221;，在单击&#8220;下一步&#8221;；<br />
8) 选择&#8220;Directory Server&#8221;，作为缺省的验证源，在单击&#8220;下一步&#8221;；<br />
9) 选择&#8220;Accept The Setting&#8221;，再单击&#8220;完成&#8221;；<br />
10) 关闭Access Manager Configuration Wizard。<br />
详见《Impromptu Web Reports Installation and Configuration》page 49。<br />
2．3．4 PowerPlay Enterprise Server、PowerPlay Enterprise Server Administration 的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;PowerPlay Enterprise Server&#8221;、&#8220;PowerPlay Enterprise Server Administration&#8221;进行安装。</p>
<p>2．3．5 配置Web Server<br />
建立Web Server 中&#8220;cognos&#8221;、&#8220;cognos/cgi-bin&#8221;、&#8220;cognos/help&#8221;、&#8220;cognos/ppwb&#8221; 4个虚拟目录，一般情况下，&#8220;cognos&#8221;、&#8220;cognos/cgi-bin&#8221;、&#8220;cognos/help&#8221;这3个虚拟目录已经在安装过程中建立，实际上，系统管理员只需要手工建立&#8220;cognos/ppwb&#8221;这个虚拟目录。<br />
建立&#8220;cognos/ppwb&#8221;虚拟目录的步骤如下：<br />
1) 在Windows 2000中，单击&#8220;开始&#8221;、&#8220;设置&#8221;、&#8220;控制面板&#8221;，双击&#8220;管理工具&#8221;，双击&#8220;Internet服务管理器&#8221;；<br />
2) 在左边面板中，展开&#8220;Internet信息服务&#8221;，再展开以本服务器的机器名为名字的文件夹；<br />
3) 展开&#8220;默认web站点&#8221;，再展开&#8220;cognos&#8221;文件夹；<br />
4) 用右键单击&#8220;cognos&#8221;，单击&#8220;新建&#8221;，再单击&#8220;虚拟目录&#8221;；<br />
5) 单击&#8220;下一步&#8221;；<br />
6) 输入虚拟目录别名&#8220;ppwb&#8221;，单击&#8220;下一步&#8221;；<br />
7) 在目录中输入&#8220;&lt;driver letter&gt;:\program files\cognos\cer1\webcontent\ppwb&#8221;，单击&#8220;下一步&#8221;；<br />
8) 只选取&#8220;读取&#8221;权限，单击&#8220;下一步&#8221;；<br />
9) 单击&#8220;完成&#8221;。<br />
其余三个虚拟目录的设置列表如下：<br />
虚拟目录别名 目录 权限<br />
cognos \program files\cognos\cer1\webcontent 读<br />
cognos/cgi-bin \program files\cognos\cer1\cgi-bin 执行<br />
cognos/help \program files\cognos\cer1\documentation\html 读<br />
详见《PowerPlay Enterprise Server Installation and Configuration Guide》page 110。<br />
2．3．6 Upfront、Upfront Server Administration 的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;Upfront&#8221;、&#8220;Upfront Server Administration&#8221;进行安装。<br />
2．4 mpromptu 6.0 Admin Edtion的安装<br />
插入&#8220;Impromptu 6.0 Administrator Edition&#8221;的安装盘，在AutoRun的安装选择对话框中选择&#8220;Install Impromptu 6.0 Administrator Edition&#8221;完成安装。<br />
Impromptu Administratior、User Define Functions、PowerPrompts 的安装<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件选择对话框中选择&#8220;Impromptu Administrator&#8221;、&#8220;User Define Functions&#8221;、&#8220;PowerPrompts&#8221;进行安装。<br />
2．5 Cognos Distribute Shuttle Builder的安装<br />
插入&#8220;Impromptu 6.0 Administrator Edition&#8221;的安装盘，在AutoRun的安装选择对话框中选择&#8220;Cognos Distribute Shuttle Builder&#8221;进行安装。<br />
详见《Impromptu Web Reports Installation and Configuration》page 23。<br />
2．6 PowerPlay Transformer Server 6.61的安装<br />
插入&#8220;PowerPlay Transformer Server 6.6&#8221;的安装盘，在AutoRun的安装选择对话框中选择&#8220;PowerPlay Transformer Server 6.61&#8221;进行安装。<br />
在安装方式中选择&#8220;custom&#8221;安装，在安装组件对话框中选择&#8220;PowerPlay for Windows&#8221;、&#8220;PowerPlay for Excle、PowerPlay Transformer&#8221;、&#8220;Schedule&#8221;、&#8220;CognosScript Editor&#8221;进行安装。<br />
2．7 Adobe Acrobat Reader 的安装</p>
<p>2．7．1 Adobe Acrobat Reader 4.05的安装<br />
插入&#8220;Impromptu Web Reports&#8221;的安装盘，运行光盘中的&#8220;\Adobe\ar405eng.exe&#8221;。<br />
详见《Impromptu Web Reports Installation and Configuration》page 24。</p>
<p>2．7．2 Adobe Acrobat Reader 简体汉字的安装<br />
插入&#8220;Impromptu Web Reports&#8221;的安装盘，运行光盘中的&#8220;\Adobe\chsfont.exe&#8221;。<br />
2．8 激活Impromptu Web Reports 的Report Server<br />
启动Server Administration，展开&#8220;Report Servers&#8221;，单击要激活的服务器，从&#8220;Actions&#8221;菜单中选择&#8220;Enable&#8221;，激活相应的 Report Server。<br />
2．9 在Upfront中添加server<br />
启动Upfront Server Administration，从&#8220;Server&#8221;菜单中选择&#8220;Add Server&#8221;，输入服务器的名字，单击&#8220;ok&#8221;。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/s_sword/archive/2007/05/18/1614796.aspx</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/293612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-09-02 16:21 <a href="http://www.blogjava.net/SIDNEY/archive/2009/09/02/293612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 文件内容查看工具介绍 [转]</title><link>http://www.blogjava.net/SIDNEY/archive/2009/08/04/289874.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 04 Aug 2009 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/08/04/289874.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/289874.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/08/04/289874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/289874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/289874.html</trackback:ping><description><![CDATA[<p class="g_p_center g_t_wrap g_t_left g_t_20 g_c_pdin c07" id="blogtitle_fks_082070087081084067082095094095080084080074093086085071" style="margin: 20px auto 10px">&nbsp;</p>
<div class="g_p_center g_t_right g_c_pdin g_h_20 c08" style="margin-bottom: 15px">
<div class="g_p_left"><a class="c05" id="aBelongClsfks_082070087081084067082095094095080084080074093086085071" onclick="NEBlog.gPermaLinkPage.updownMenu.openSameClass('fks_080067083081088074083082074071086087088074084085082', 'linux');" href="http://shuiranyue.blog.163.com/blog/static/421990342009622114356505/#">linux</a> &nbsp;&nbsp;<span class="g_t_12 c08">2009-07-22 11:43</span> <span class="c08">&nbsp;&nbsp;阅读<nobr id="accessCount_fks_082070087081084067082095094095080084080074093086085071">1</nobr>&nbsp;&nbsp;&nbsp;评论<nobr id="comCount_fks_082070087081084067082095094095080084080074093086085071">0</nobr></span> <span class="c08">&nbsp;</span> </div>
<div>字号： <a class="g_c_ul c05" id="bigfont" style="font-size: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.changeFont('blogtext_fks_082070087081084067082095094095080084080074093086085071', 1);return false;" href="http://shuiranyue.blog.163.com/blog/static/421990342009622114356505/#">大</a><span class="g_t_bold c07" id="bigfont_off" style="display: none">大</span>&nbsp; <a class="g_c_ul c05" id="middlefont" style="font-size: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.changeFont('blogtext_fks_082070087081084067082095094095080084080074093086085071', 2);return false;" href="http://shuiranyue.blog.163.com/blog/static/421990342009622114356505/#">中</a><span class="g_t_bold c07" id="middlefont_off" style="display: none">中</span>&nbsp; <a class="g_c_ul c05" id="smallfont" style="display: none; font-size: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.changeFont('blogtext_fks_082070087081084067082095094095080084080074093086085071', 3);return false;" href="http://shuiranyue.blog.163.com/blog/static/421990342009622114356505/#">小</a><span class="g_t_bold c07" id="smallfont_off" style="display: inline">小</span> </div>
</div>
<div class="g_blog_list">
<div class="g_t_center g_c_pdin g_p_center c07 content" id="blogtext_fks_082070087081084067082095094095080084080074093086085071">
<div class="ns_content"><span style="font-size: 9pt">&nbsp;
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 13.5pt">1</span></strong><strong><span style="font-size: 13.5pt">、</span></strong><strong><span style="font-size: 13.5pt">cat </span></strong><strong><span style="font-size: 13.5pt">显示文件连接文件内容的工具；</span></strong></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">cat </span><span style="font-size: 9pt">是一个文本文件查看和连接工具。查看一个文件的内容，用</span><span style="font-size: 9pt">cat</span><span style="font-size: 9pt">比较简单，</span></div>
</span>
<p><span style="font-size: 9pt">比如：<br />
</span><span style="font-size: 9pt"><font style="background-color: rgb(192,192,192)">[root@localhost ~]# cat /etc/fstab</font></span></p>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span><strong>为了便于新手弟兄灵活掌握这个工具，我们多说一点常用的参数；<br />
</strong></span></div>
<p><strong>1.0 cat </strong><span><strong>语法结构；<br />
</strong><font style="background-color: rgb(192,192,192)">cat [</font></span><span style="font-size: 9pt"><font style="background-color: rgb(192,192,192)">选项] [文件]...<br />
</font></span><font style="background-color: rgb(192,192,192)"><strong><span style="font-size: 8pt">选项<br />
</span></strong><span style="font-size: 8pt">-A, --show-all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">等价于 -vET<br />
</span><span style="font-size: 8pt">-b, --number-nonblank&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">对非空输出行编号<br />
</span><span style="font-size: 8pt">-e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">等价于 -vE<br />
</span><span style="font-size: 8pt">-E, --show-ends&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">在每行结束处显示 $<br />
</span><span style="font-size: 8pt">-n, --number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">对输出的所有行编号<br />
</span><span style="font-size: 8pt">-s, --squeeze-blank&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">不输出多行空行<br />
</span><span style="font-size: 8pt">-t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">与 -vT 等价<br />
</span><span style="font-size: 8pt">-T, --show-tabs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">将跳格字符显示为 ^I<br />
</span><span style="font-size: 8pt">-u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">被忽略)<br />
</span><span style="font-size: 8pt">-v, --show-nonprinting&nbsp;&nbsp; </span></font><font style="background-color: rgb(192,192,192)"><span style="font-size: 8pt">使用 ^ 和 M- 引用，除了 LFD 和 TAB 之外<br />
</span><span style="font-size: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --help&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">显示此帮助信息并离开</span></font><strong><span style="font-size: 12pt"><br />
1.1 cat </span></strong><strong><span style="font-size: 12pt">查看文件内容实例；</span></strong></p>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat /etc/profile </span><span style="font-size: 9pt">注：查看/etc/目录下的pro<wbr>file文件内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat -b /etc/fstab </span><span style="font-size: 9pt">注：查看/etc/目录下的pro<wbr>file内容，并且对非空白行进行编号，行号从1开始；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat -n /etc/profile </span><span style="font-size: 9pt">注：对/etc目录中的pro<wbr>file的所有的行(包括空白行）进行编号输出显示；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat -E /etc/profile </span><span style="font-size: 9pt">注：查看/etc/下的pro<wbr>file内容，并且在每行的结尾处附加$符号；</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">cat </span><span style="font-size: 9pt">加参数</span><span style="font-size: 9pt">-n </span><span style="font-size: 9pt">和</span><span style="font-size: 9pt">nl</span><span style="font-size: 9pt">工具差不多，文件内容输出的同时，都会在每行前面加上行号；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat -n /etc/profile</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# nl /etc/profile</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">cat </span><span style="font-size: 9pt">可以同时显示多个文件的内容，比如我们可以在一个</span><span style="font-size: 9pt">cat</span><span style="font-size: 9pt">命令上同时显示两个文件的内容；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat /etc/fstab /etc/profile</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">cat </span><span style="font-size: 9pt">对于内容极大的文件来说，可以通过管道</span><span style="font-size: 9pt">|</span><span style="font-size: 9pt">传送到</span><span style="font-size: 9pt">more </span><span style="font-size: 9pt">工具，然后一页一页的查看；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat /etc/fstab /etc/profile | more</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 12pt"><br />
1.2 cat </span></strong><strong><span style="font-size: 12pt">的创建、连接文件功能实例；</span></strong><strong><span style="font-size: 9pt"><br />
cat </span></strong><strong><span style="font-size: 9pt">有创建文件的功能，创建文件后，要以</span></strong><strong><span style="font-size: 9pt">EOF</span></strong><strong><span style="font-size: 9pt">或</span></strong><strong><span style="font-size: 9pt">STOP</span></strong><strong><span style="font-size: 9pt">结束；</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat &gt; linuxsir.org.txt &lt;&lt; EOF </span><span style="font-size: 9pt">注：创建linuxsir.org.txt文件；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; </span><span style="font-size: 9pt">我来测试 cat 创建文件，并且为文件输入内容； 注：这是为linuxsir.org.txt文件输入内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; </span><span style="font-size: 9pt">北南南北 测试； 注：这是为linuxsir.org.txt文件输入内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; EOF </span><span style="font-size: 9pt">注：退出编辑状态；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat linuxsir.org.txt </span><span style="font-size: 9pt">注：我们查看一下linuxsir.org.txt文件的内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">我来测试 cat 创建文件，并且为文件输入内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">北南南北 测试；</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 9pt">cat </span></strong><strong><span style="font-size: 9pt">还有向已存在的文件追加内容的功能；</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat linuxsir.txt </span><span style="font-size: 9pt">注：查看已存在的文件linuxsir.txt 内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">I am BeiNanNanBei From LinuxSir.Org . </span><span style="font-size: 9pt">注：内容行</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">我正在为cat命令写文档</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat &gt;&gt; linuxsir.txt &lt;&lt; EOF </span><span style="font-size: 9pt">注：我们向linuxsir.txt文件追加内容；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; </span><span style="font-size: 9pt">我来测试cat向文档追加内容的功能； 注：这是追回的内容</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; OK</span><span style="font-size: 9pt">？</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; OK</span><span style="font-size: 9pt">～</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; </span><span style="font-size: 9pt">北南 呈上</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">&gt; EOF </span><span style="font-size: 9pt">注：以EOF退出；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat linuxsir.txt </span><span style="font-size: 9pt">注：查看文件内容，看是否追回成功。</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">I am BeiNanNanBei From LinuxSir.Org .</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">我正在为cat命令写文档</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">我来测试cat向文档追加内容的功能；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">OK</span><span style="font-size: 9pt">？</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">OK</span><span style="font-size: 9pt">～</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">北南 呈上</span></div>
<div style="line-height: 15.6pt" align="left"><span style="font-size: 9pt"><strong>cat </strong></span><strong><span style="font-size: 9pt">连接多个文件的内容并且输出到一个新文件中；</span></strong></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">假设我们有</span><span style="font-size: 9pt">sir01.txt</span><span style="font-size: 9pt">、</span><span style="font-size: 9pt">sir02.tx</span><span style="font-size: 9pt">和</span><span style="font-size: 9pt">sir03.txt </span><span style="font-size: 9pt">，并且内容如下；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat sir01.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">123456</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">i am testing</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat sir02.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">56789</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">BeiNan Tested</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat sir03.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">09876</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">linuxsir.org testing</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">我想通过</span><span style="font-size: 9pt">cat </span><span style="font-size: 9pt">把</span><span style="font-size: 9pt">sir01.txt</span><span style="font-size: 9pt">、</span><span style="font-size: 9pt">sir02.txt</span><span style="font-size: 9pt">及</span><span style="font-size: 9pt">sir03.txt </span><span style="font-size: 9pt">三个文件连接在一起（也就是说把这三个文件的内容都接在一起）并输出到一个新的文件</span><span style="font-size: 9pt">sir04.txt </span><span style="font-size: 9pt">中。<br />
</span><strong><span style="font-size: 9pt">注意：</span></strong><span style="font-size: 9pt">其原理是把三个文件的内容连接起来，然后创建</span><span style="font-size: 9pt">sir04.txt</span><span style="font-size: 9pt">文件，并且把几个文件的内容同时写入</span><span style="font-size: 9pt">sir04.txt</span><span style="font-size: 9pt">中。特别值得一提的是，如果您输入到一个已经存在的</span><span style="font-size: 9pt">sir04.txt </span><span style="font-size: 9pt">文件，会把</span><span style="font-size: 9pt">sir04.txt</span><span style="font-size: 9pt">内容清空。</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt &gt; sir04.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# more sir04.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">123456</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">i am testing</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">56789</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">BeiNan Tested</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">09876</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">linuxsir.org testing</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 9pt">cat </span></strong><strong><span style="font-size: 9pt">把一个或多个已存在的文件内容，追加到一个已存在的文件中</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# cat sir00.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">linuxsir.org forever</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt &gt;&gt; sir00.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# cat sir00.txt</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">linuxsir.org forever</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">123456</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">i am testing</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">56789</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">BeiNan Tested</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">09876</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">linuxsir.org testing</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 9pt; color: red">警告：我们要知道</span></strong><strong><span style="font-size: 9pt; color: red">&gt;</span></strong><strong><span style="font-size: 9pt; color: red">意思是创建，</span></strong><strong><span style="font-size: 9pt; color: red">&gt;&gt;</span></strong><strong><span style="font-size: 9pt; color: red">是追加。千万不要弄混了。造成失误可不是闹着玩的；</span></strong><strong><span style="font-size: 13.5pt"><br />
2</span></strong><strong><span style="font-size: 13.5pt">、</span></strong><strong><span style="font-size: 13.5pt">more </span></strong><strong><span style="font-size: 13.5pt">文件内容或输出查看工具；</span></strong><strong><span style="font-size: 9pt"><br />
more </span></strong><strong><span style="font-size: 9pt">是我们最常用的工具之一，最常用的就是显示输出的内容，然后根据窗口的大小进行分页显示，然后还能提示文件的百分比；</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# more /etc/profile</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 12pt"><br />
2.1 more </span></strong><strong><span style="font-size: 12pt">的语法、参数和命令；</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">more [</span><span style="font-size: 9pt">参数选项] [文件]</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><strong><span style="font-size: 8pt">参数如下：</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">+num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">从第num行开始显示；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">定义屏幕大小，为num行；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">+/pattern&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">从pattern 前两行开始显示；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">从顶部清屏然后显示；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">提示Press space to continue, 'q' to quit.（按空格键继续，按q键退出），禁用响铃功能； </span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-l &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">忽略Ctrl+l （换页）字符；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-p &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">通过清除窗口而不是滚屏来对文件进行换页。和-c参数有点相似； </span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">把连续的多个空行显示为一行；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">-u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">把文件内容中的下划线去掉</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 9pt">退出</span></strong><strong><span style="font-size: 9pt">more</span></strong><strong><span style="font-size: 9pt">的动作指令是</span></strong><strong><span style="font-size: 9pt">q </span></strong><strong><span style="font-size: 12pt"><br />
2.2 more </span></strong><strong><span style="font-size: 12pt">的参数应用举例；</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# more -dc /etc/profile </span><span style="font-size: 9pt">注：显示提示，并从终端或控制台顶部显示；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# more +4 /etc/profile </span><span style="font-size: 9pt">注：从pro<wbr>file的第4行开始显示；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# more -4 /etc/profile </span><span style="font-size: 9pt">注：每屏显示4行；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">[root@localhost ~]# more +/MAIL /etc/profile </span><span style="font-size: 9pt">注：从pro<wbr>file中的第一个MAIL单词的前两行开始显示；</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 12pt"><br />
2.3 more </span></strong><strong><span style="font-size: 12pt">的动作指令；<br />
</span></strong><span style="font-size: 9pt">我们查看一个内容较大的文件时，要用到</span><span style="font-size: 9pt">more</span><span style="font-size: 9pt">的动作指令，比如</span><span style="font-size: 9pt">ctrl+f</span><span style="font-size: 9pt">（或空格键）</span><span style="font-size: 9pt">是向下显示一屏，</span><span style="font-size: 9pt">ctrl+b</span><span style="font-size: 9pt">是返回上一屏；</span><span style="font-size: 9pt"> Enter</span><span style="font-size: 9pt">键可以向下滚动显示</span><span style="font-size: 9pt">n</span><span style="font-size: 9pt">行，要通过定，默认为</span><span style="font-size: 9pt">1</span><span style="font-size: 9pt">行；<br />
</span><span style="font-size: 9pt">我们只说几个常用的；</span><span style="font-size: 9pt">自己尝试一下就知道了；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">Enter&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span><span style="font-size: 8pt">向下n行，需要定义，默认为1行；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">Ctrl+f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">向下滚动一屏；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">空格键<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>向下滚动一屏；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">Ctrl+b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">返回上一屏；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">输出当前行的行号；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">:f &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">输出文件名和当前行的行号；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">调用vi编辑器；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">! </span><span style="font-size: 8pt">命令<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>调用Shell，并执行命令；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; text-align: left; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 8pt">q &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 8pt">退出more </span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">当我们查看某一文件时，想调用</span><span style="font-size: 9pt">vi</span><span style="font-size: 9pt">来编辑它，不要忘记了</span><span style="font-size: 9pt">v</span><span style="font-size: 9pt">动作指令，这是比较方便的；</span><strong><span style="font-size: 12pt"><br />
2.4 </span></strong><strong><span style="font-size: 12pt">其它命令通过管道和</span></strong><strong><span style="font-size: 12pt">more</span></strong><strong><span style="font-size: 12pt">结合的运用例子；<br />
</span></strong><span style="font-size: 9pt">比如我们列一个目录下的文件，由于内容太多，我们应该学会用</span><span style="font-size: 9pt">more</span><span style="font-size: 9pt">来分页显示。这得和管道</span><span style="font-size: 9pt"> | </span><span style="font-size: 9pt">结合起来，比如：</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# ls -l /etc |more</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 13.5pt"><br />
3</span></strong><strong><span style="font-size: 13.5pt">、</span></strong><strong><span style="font-size: 13.5pt">less </span></strong><strong><span style="font-size: 13.5pt">查看文件内容</span></strong><strong><span style="font-size: 13.5pt">工具；<br />
</span></strong><span style="font-size: 9pt">less </span><span style="font-size: 9pt">工具也是对文件或其它输出进行分页显示的工具，应该说是</span><span style="font-size: 9pt">linux</span><span style="font-size: 9pt">正统查看文件内容的工具，功能极其强大；您是初学者，我建议您用</span><span style="font-size: 9pt">less</span><span style="font-size: 9pt">。由于</span><span style="font-size: 9pt">less</span><span style="font-size: 9pt">的内容太多，我们把最常用的介绍一下；</span><strong><span style="font-size: 12pt"><br />
3.1 less</span></strong><strong><span style="font-size: 12pt">的语法格式；</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">less [</span><span style="font-size: 9pt">参数] 文件</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 9pt">常用参数</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">-c </span><span style="font-size: 9pt">从顶部（从上到下）刷新屏幕，并显示文件内容。而不是通过底部滚动完成刷新；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-f </span><span style="font-size: 9pt">强制打开文件，二进制文件显示时，不提示警告；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-i </span><span style="font-size: 9pt">搜索时忽略大小写；除非搜索串中包含大写字母；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-I </span><span style="font-size: 9pt">搜索时忽略大小写，除非搜索串中包含小写字母；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-m </span><span style="font-size: 9pt">显示读取文件的百分比；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-M </span><span style="font-size: 9pt">显法读取文件的百分比、行号及总行数；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-N </span><span style="font-size: 9pt">在每行前输出行号；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-p pattern </span><span style="font-size: 9pt">搜索pattern；比如在/etc/profile搜索单词MAIL，就用 less -p MAIL /etc/profile</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-s </span><span style="font-size: 9pt">把连续多个空白行作为一个空白行显示；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">-Q </span><span style="font-size: 9pt">在终端下不响铃；</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">比如：我们在显示</span><span style="font-size: 9pt">/etc/profile</span><span style="font-size: 9pt">的内容时，让其显示行号；</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# less -N /etc/profile</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 12pt"><br />
3.2 less</span></strong><strong><span style="font-size: 12pt">的动作命令；<br />
</span></strong><span style="font-size: 9pt">进入</span><span style="font-size: 9pt">less</span><span style="font-size: 9pt">后，我们得学几个动作，这样更方便</span><span style="font-size: 9pt">我们查阅文件内容；最应该记住的命令就是</span><span style="font-size: 9pt">q</span><span style="font-size: 9pt">，这个能让</span><span style="font-size: 9pt">less</span><span style="font-size: 9pt">终止查看文件退出；<br />
</span><strong><span style="font-size: 9pt">动作</span></strong></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">回车键 向下移动一行；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">y </span><span style="font-size: 9pt">向上移动一行；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">空格键 向下滚动一屏；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">b </span><span style="font-size: 9pt">向上滚动一屏；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">d </span><span style="font-size: 9pt">向下滚动半屏；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">h less</span><span style="font-size: 9pt">的帮助；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">u </span><span style="font-size: 9pt">向上洋动半屏；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">w </span><span style="font-size: 9pt">可以指定显示哪行开始显示，是从指定数字的下一行显示；比如指定的是6，那就从第7行显示；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">g </span><span style="font-size: 9pt">跳到第一行；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">G </span><span style="font-size: 9pt">跳到最后一行；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">p n% </span><span style="font-size: 9pt">跳到n%，比如 10%，也就是说比整个文件内容的10%处开始显示；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">/pattern </span><span style="font-size: 9pt">搜索pattern ，比如 /MAIL表示在文件中搜索MAIL单词；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">v </span><span style="font-size: 9pt">调用vi编辑器；</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">q </span><span style="font-size: 9pt">退出less</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">!command </span><span style="font-size: 9pt">调用SHELL，可以运行命令；比如!ls 显示当前列当前目录下的所有文件；</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">就</span><span style="font-size: 9pt">less</span><span style="font-size: 9pt">的动作来说，内容太多了，用的时候查一查</span><span style="font-size: 9pt">man less</span><span style="font-size: 9pt">是最好的。在这里就不举例子了；</span><strong><span style="font-size: 13.5pt"><br />
4</span></strong><strong><span style="font-size: 13.5pt">、</span></strong><strong><span style="font-size: 13.5pt">head </span></strong><strong><span style="font-size: 13.5pt">工具，显示文件内容的前几行；</span></strong><span style="font-size: 9pt"><br />
head </span><span style="font-size: 9pt">是显示一个文件的内容的前多少行；<br />
</span><span style="font-size: 9pt">用法比较简单；<br />
</span><font style="background-color: rgb(192,192,192)"><span style="font-size: 9pt">head -n </span><span style="font-size: 9pt">行数值 文件名；</span></font></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><span style="font-size: 9pt">比如我们显示</span><span style="font-size: 9pt">/etc/profile</span><span style="font-size: 9pt">的前</span><span style="font-size: 9pt">10</span><span style="font-size: 9pt">行内容，应该是：</span></div>
<div style="background: rgb(238,238,238); line-height: 15.6pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" align="left"><span style="font-size: 9pt">[root@localhost ~]# head -n 10 /etc/profile</span></div>
<div style="margin: 0cm 12pt 12pt 0cm; line-height: 15.6pt" align="left"><strong><span style="font-size: 13.5pt"><br />
5</span></strong><strong><span style="font-size: 13.5pt">、</span></strong><strong><span style="font-size: 13.5pt">tail </span></strong><strong><span style="font-size: 13.5pt">工具，显示文件内容的最后几行；<br />
</span></strong><span style="font-size: 9pt">tail </span><span style="font-size: 9pt">是显示一个文件的内容的前多少行；<br />
</span><span style="font-size: 9pt">用法比较简单；<br />
</span><font style="background-color: rgb(192,192,192)"><span style="font-size: 9pt">tail -n </span><span style="font-size: 9pt">行数值 文件名；<br />
</span></font><span style="font-size: 9pt">比如我们显示</span><span style="font-size: 9pt">/etc/profile</span><span style="font-size: 9pt">的最后</span><span style="font-size: 9pt">5</span><span style="font-size: 9pt">行内容，应该是：<br />
</span><span style="font-size: 9pt"><font style="background-color: rgb(192,192,192)">[root@localhost ~]# tail -n 5 /etc/profile</font></span></div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/289874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-08-04 21:53 <a href="http://www.blogjava.net/SIDNEY/archive/2009/08/04/289874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NET开发人员必知的八个网站(转)</title><link>http://www.blogjava.net/SIDNEY/archive/2009/06/29/284553.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 29 Jun 2009 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/06/29/284553.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/284553.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/06/29/284553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/284553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/284553.html</trackback:ping><description><![CDATA[<h1><a title=".Net" href="http://tag.csdn.net/.Net/"><img alt=".Net" onerror="this.src='http://tougao.csdn.net/tagimg/blank.gif';" src="http://tougao.csdn.net/tagimg/blank.gif" /></a>独家：.NET开发人员必知的八个网站</h1>
<h3>本文发表于 2009-06-24 15:55 | <script language="javascript" src="http://tougao.csdn.net/count.php?id=212160"></script>20244次阅读 | 共有评论(<span id="remark_count1" style="display: inline">89</span>)条 <a href="http://news.csdn.net/a/20090624/212160.html#postcomment" target="_self">发表评论</a></h3>
<h4>关键词：<a href="http://tag.csdn.net/.Net/">.Net</a> &nbsp;|&nbsp;感谢<a href="http://hi.csdn.net/ydj9931">ydj9931</a>的提供&nbsp;|&nbsp;<cite><a class="fav_csdnstylebykimi" title="收藏到我的网摘中，并分享给我的朋友" href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏这篇新闻</a></cite></h4>
<div class="newscon">
<div>
<div id="controladsty"><!-- <script type="text/javascript">show_ads_zone(13);</script>  --><!-- <div id="csdn_tag_adstyle"></div>   --></div>
<div id="vogate_ad_area">
<p><img style="border-right: black 1px solid; border-top: black 1px solid; vertical-align: middle; border-left: black 1px solid; border-bottom: black 1px solid" height="77" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-154441-pic1.jpg" width="181" /></p>
<p>当前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一，或者想要成为其中之一的话，我下面将要列出的每一个站点都应该是你的最爱，都应该收藏到书签中去。</p>
<p>对于不熟悉.NET技术的朋友，需要说明一下，.NET提供了一个平台和一些相应的工具，编程人员可以使用它们来在开发Windows桌面，互联网，甚至是手持移动设备上构建极富交互性的应用。很有可能你最喜欢的网站之一就是用微软的ASP.NET技术构建的。</p>
<p><strong><a href="http://www.codeproject.com/" target="_blank">1.CodeProject</a></strong></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" height="92" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-154526-pic1.jpg" width="225" /><br />
<br />
这些年来我在这个站点下载了数不清的代码。该站点中的快速有效的文章都是由真正的开发人员撰写的，他们可以给你关于特定编程问题的直接帮助，而文章中总是会包含一个代码下载的链接。</p>
<p>提交文章和代码的开发人员不会得到任何报酬，他们只是为了得到社区的认同。这个站点不仅包含.NET和Windows平台的内容，所以对于想要扩展自己的技术视野的开发人员来说，这儿也是个很好的去处。</p>
<p><strong><a href="http://www.dotnetnuke.com/" target="_blank">2.DotNetNuke</a></strong></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" height="85" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-154636-pic1.jpg" width="337" /><br />
<br />
DotNetNuke是一个开源的框架，开发人员可以下载它并用它来构建自己的ASP.NET网络应用。如果你是一个.NET开发人员而你还没有下载过这些代码来读一读的话，你真的需要马上去下载它了。</p>
<p>此软件最近几年已经经过了数次迭代并被证实其中含有很多最有效率的编码最佳实践。尽管此站点有一个收费的专业版，但是仍然有一个可以免费下载的社区版本，而在该站点免费注册来获得下载途径也是非常值得的。</p>
<p><strong><a href="http://4guysfromrolla.com/" target="_blank">3.4GuysFromRolla</a></strong></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; vertical-align: middle; border-left: black 1px solid; border-bottom: black 1px solid" height="89" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-154728-pic1.jpg" width="377" /></p>
<p>如果你是一名web开发人员的话，老实说，多数.NET开发人员都是，那么这个站点你一定要访问。此站点包含有你需要了解的关于ASP.NET的各方面的文章，甚至还包含有很多针对ASP开发者的信息（信不信由你，仍然有很多开发人员在使用ASP）。</p>
<p>多年来，我已经通过阅读此站点的论坛的帖子解决了无数的问题。</p>
<p><strong><a href="http://www.devsource.com/" target="_blank">4.DevSource</a></strong></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" height="105" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-154929-pic1.jpg" width="340" /><br />
<br />
你从上图就可以看出来，这个在线开发杂志是由微软提供的，不过请别因此而心怀成见。我强烈建议订阅此站点的免费每周新闻时讯，它可以让你最快速的了解到从微软传出来的大事小情。</p>
<p>你也应该访问一下<a title="DevLife" href="http://blogs.devsource.com/devlife/" target="_blank">DevLife</a> 论坛。</p>
<p><strong><a href="http://www.devx.com/" target="_blank">5.DevX</a></strong></p>
<p>这是另一个在线开发杂志，它并不仅仅关注于微软的技术，它倾向于展示一些很有趣的非主流的技术。</p>
<p>我本人曾经给他们写过几篇文章，因为他们是为数不多的几家需要关于机器人学和演讲技术的网站之一。此站点每天的文章覆盖了从传统的.NET到VB开发的所有内容。</p>
<p><strong><a href="http://msdn.microsoft.com/en-us/magazine/default.aspx" target="_blank">6.MSDN Magazine</a></strong></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" height="128" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-155045-pic1.jpg" width="255" /><br />
<br />
MSDN Magazine之于开发人员就相当于《自然》杂志之于科学家。它包含了所有开发人员都应该遵守的标准。他们非常严格地选取内容。它所包含的文章比我上面提到的站点的文章都要长而且通常更有深度。你可以在打印之前很肯定的知道这些文章都是经过了精挑细选的。</p>
<p><strong><a href="http://channel9.msdn.com/" target="_blank">7.Channel9</a></strong></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" height="116" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-155135-pic1.jpg" width="189" /><br />
<br />
喜欢看很酷的技术的视频的朋友们一定要看看这个微软资源的站点。Channel 9的团队经常在微软园区中采访很多开发团队并会时常透露一些最新的软件和技术的讯息。</p>
<p>不仅仅是采访微软的工作人员，Channel 9也会和微软之外的行业权威对话。</p>
<p><a href="http://weblogs.asp.net/scottgu/" target="_blank">8.Scott Guthrie的博客</a></p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" height="186" alt="" src="http://news.csdn.net/a/uploads/2009/06/24/20090624-155257-pic1.jpg" width="314" /><br />
<br />
Scott Guthrie是微软的开发工具的企业副总裁，他的博客经常更新，上面会有一些别处看不到的公告。</p>
<p>Scott的博客内容覆盖从.NET基础类库到Silverlight的所有内容。如果你想要让你朋友惊讶于你似乎和微软有某些内线联系的话，那就访问这个博客吧。</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/284553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-06-29 10:38 <a href="http://www.blogjava.net/SIDNEY/archive/2009/06/29/284553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>维模式</title><link>http://www.blogjava.net/SIDNEY/archive/2009/06/28/284479.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Sun, 28 Jun 2009 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/06/28/284479.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/284479.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/06/28/284479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/284479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/284479.html</trackback:ping><description><![CDATA[<h2 id="sii-cubeschema-26850">维模式</h2>
<p>数据库由一个或多个表组成，数据库中所有表之间的关系统称为数据库<span class="italic">模式</span>。虽然有许多不同的模式设计，但是用于查询历史数据的数据库通常被设置为具有维模式设计（通常是星型模式或雪花模式）。采用维模式既有许多历史方面的原因也有许多实践方面的原因，但是，它们在决策支持关系数据库方面的应用的增长是由两项主要的益处推动的：</p>
<ul>
    <li>能够形成用来应答业务问题的查询。通常，查询根据若干个业务维计算某些业绩量度。
    <li>在大部分 RDBMS 供应商使用的 SQL 语言中形成这些查询必需维模式。</li>
</ul>
<p>维模式在物理上将用于量化业务的量度（也称为<span class="italic">事实</span>）与用于描述业务和对业务进行分类的描述性元素（也称为<span class="italic">维</span>）分隔开。DB2 Alphablox 多维体要求底层数据库使用维模式；即，在物理上必须将事实数据与维数据分隔开（至少位于不同的列中）。通常，维模式具有星型模式形式、雪花模式形式或者这两种模式的某种混合形式。尽管不是常见的情况，但维模式也可以具有单个表的形式，即事实和维仅仅是位于表的不同的列中。</p>
<a name="wq27"></a>
<div class="notetitle" id="wq27">注:</div>
<div class="notebody">如果数据库不符合维模式，则可以在数据库中创建视图以创建一个&#8220;虚拟的&#8221;维模式以便与 DB2 Alphablox 多维体配合使用。</div>
<p>本节描述星型模式和雪花模式以及在这些模式中表示业务层次结构的方式。包括下列各节：</p>
<ul>
    <li><a href="http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cube13.htm#sii-cubeschema-32488">星型模式和雪花模式</a>
    <li><a href="http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cube13.htm#sii-cubeschema-16694">层次结构</a></li>
</ul>
<p>要彻底了解维模式设计及其所有分支的背景信息，请阅读由 Ralph Kimball 编著并由 John Wiley and Sons, Inc. 出版的 <cite>The Data Warehouse Toolkit</cite>。</p>
<a id="idx23" name="idx23"></a><a id="idx24" name="idx24"></a><a id="idx25" name="idx25"></a><a id="idx26" name="idx26"></a><a name="sii-cubeschema-32488"></a>
<h3 id="sii-cubeschema-32488">星型模式和雪花模式</h3>
<p>星型模式和雪花模式设计是用来将事实和维分隔到不同的表中的机制。雪花模式将层次结构的不同级别进一步分隔到不同的表中。在任何一种模式设计中，每个表都通过<span class="italic">主键／外键关系</span>与另一表相关。在关系数据库中，使用主键／外键关系来定义各个表之间的多对一关系。</p>
<a id="idx27" name="idx27"></a><a id="idx28" name="idx28"></a><a name="wq28"></a>
<h4 id="wq28">主键</h4>
<p><span class="italic">主键</span>是表中的一个列或一组列，它们的值唯一地标识表中的一行。关系数据库设计成通过仅允许表中的一行具有给定的主键值来强制实施主键的唯一性。</p>
<a id="idx29" name="idx29"></a><a id="idx30" name="idx30"></a><a name="wq29"></a>
<h4 id="wq29">外键</h4>
<p><span class="italic">外键</span>是表中的一个列或一组列，它们的值与另一个表中的主键值相对应。为了添加具有给定外键值的行，在相关的表中必须存在具有相同主键值的行。</p>
<p>在星型模式或雪花模式中，表之间的主键／外键关系（有时称为多对一关系）表示 RDBMS 中将相关的表连接到一起的路径。这些连接路径是形成对历史数据执行的查询的基础。要了解有关多对一关系的更多信息，请参阅<a href="http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cube13.htm#sii-cubeschema-29251">多对一关系</a>。</p>
<a id="idx31" name="idx31"></a><a id="idx32" name="idx32"></a><a name="sii-cubeschema-17151"></a>
<h4 id="sii-cubeschema-17151">事实表</h4>
<p><span class="italic">事实表</span>是星型模式或雪花模式中的一个表，它存储用于量度业务（如销售量、商品成本或利润）的事实。事实表还包含指向维表的外键。这些外键使事实表中的每个数据行与其对应的维和级别相关。</p>
<a id="idx33" name="idx33"></a><a id="idx34" name="idx34"></a><a name="wq30"></a>
<h4 id="wq30">维表</h4>
<p><span class="italic">维表</span>是星型模式或雪花模式中的一个表，它存储用来描述维的各个方面的属性。例如，时间表存储时间的各个方面，如年份、季度、月份和天。事实表的外键引用多对一关系中的维表的主键。</p>
<a name="wq31"></a>
<h4 id="wq31">星型模式</h4>
<p>下图显示了具有单个事实表和 4 个维表的星型模式。星型模式可以具有任意数目的维表。用于连接表的链接末尾的分叉指示了事实表与每个维表之间的多对一关系。</p>
<a name="wq32"></a>
<div class="fignone" id="wq32">
<div class="mmobjcenter"><img alt="此图显示了一个星型模式，在此模式的中央有单个事实表，该事实表带有指向周围的多个维表的链接。从事实表到维表的链接末尾的分叉指示多对一关系。" src="http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cubeschemaa_v2.gif" /></div>
</div>
<a name="wq33"></a>
<h4 id="wq33">雪花模式</h4>
<p>下图显示了具有两个维的雪花模式，其中，每个维都具有 3 个级别。雪花模式可以具有任意数目的维，并且每个维可以具有任意数目的级别。</p>
<a name="wq34"></a>
<div class="fignone" id="wq34">
<div class="mmobjcenter"><img alt="" src="http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cubeschemaa3_v2.gif" /></div>
</div>
<p>要了解有关维的不同级别如何形成层次结构的详细信息，请参阅<a href="http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cube13.htm#sii-cubeschema-16694">层次结构</a>。</p>
<a id="idx35" name="idx35"></a><a id="idx36" name="idx36"></a><a name="sii-cubeschema-16694"></a>
<h3 id="sii-cubeschema-16694">层次结构</h3>
<p>层次结构是一组相互之间具有多对一关系的级别，并且这一组级别共同构成维。在关系数据库中，层次结构的不同级别既可以存储在单个表中（如在星型模式中），也可以存储在不同的表中（如在雪花模式中）。</p>
<a id="idx37" name="idx37"></a><a name="sii-cubeschema-29251"></a>
<h4 id="sii-cubeschema-29251">多对一关系</h4>
<p>多对一关系是指一个实体（通常是一个列或一组列）包含的值引用另一个具有唯一值的实体（一个列或一组列）。在关系数据库中，这些多对一关系通常是由外键／主键关系强制实施的，并且，这些关系通常是事实表与维表之间以及层次结构中的级别之间的关系。此关系通常用来描述分类或分组。例如，在具有表 <span class="italic">Region</span>、<span class="italic">State</span> 和 <span class="italic">City</span> 的地理模式中，在给定的地区有许多州，但没有任何州同时位于两个地区。同样，对于城市，一座城市仅位于一个州（同名但位于多个州的城市的处理方式必须略有不同）。关键在于每座城市都刚好位于一个州，但一个州可以有许多城市，因而符合&#8220;多对一&#8221;这个术语。</p>
<p>层次结构的不同元素（即级别）在子代级别与父代级别之间必须具有多对一关系，而无论该层次结构在物理上是以星型模式还是以雪花模式表示的；即，数据必须遵守这些关系。强制实施多对一关系所需的干净数据是维模式的一项重要特征。此外，这些关系使得有可能根据关系数据创建 DB2 Alphablox 多维体。<br />
<br />
http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cube13.htm<br />
</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/284479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-06-28 15:09 <a href="http://www.blogjava.net/SIDNEY/archive/2009/06/28/284479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server的安全机制及DBA如何管理 </title><link>http://www.blogjava.net/SIDNEY/archive/2009/06/09/280807.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 09 Jun 2009 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/06/09/280807.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/280807.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/06/09/280807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/280807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/280807.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed" cellspacing="0" cellpadding="5" width="100%" align="center" border="0">
    <tbody>
        <tr>
            <td class="arttitle">SQL Server的安全机制及DBA如何管理</td>
        </tr>
        <tr>
            <td class="artinfo">作者/<a href="http://h4cker.it.com.cn/">j14n</a>　时间/2006-11-16 11:26:00　类别/黑客攻防 </td>
        </tr>
        <tr>
            <td align="right"><a href="http://fav.it.com.cn/SaveFavorite.aspx?title=SQL Server的安全机制及DBA如何管理&amp;url=http://h4cker.it.com.cn/articles/193663.htm&amp;description=SQL Server的安全机制及DBA如何管理_j14n的数字家园_黑客攻防_时间/2006-11-16 11:26:00" target="_top"></a>　</td>
        </tr>
        <tr>
            <td class="arttag">标签：</td>
        </tr>
        <tr>
            <td class="artcontent">一&nbsp;安全体系<br />
            登录、安全账户（用户）、角色和组是&nbsp;Microsoft?&nbsp;SQL&nbsp;Server?&nbsp;2000&nbsp;安全机制的基础。连接到&nbsp;SQL&nbsp;Server&nbsp;的用户必须使用特定的登录标识符&nbsp;(ID)&nbsp;标识自己。因此，用户只能查看经授权可以查看的表和视图，并且只能执行经授权可以执行的存储过程和管理功能。在SQL&nbsp;Server中，login（登录）是用于进入服务器时进行身份识别的，每个user和login相关联，保证能进入服务器，每个user属于各个role，拥有相应的数据库权限，整个体系如图：&nbsp;<br />
            <br />
            二&nbsp;系统存储过程和命令<br />
            1、存储过程：<br />
            &nbsp;&nbsp;登录：&nbsp;&nbsp;sp_grantlogin,&nbsp;sp_revokelogin,&nbsp;sp_denylogin&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_addlogin,&nbsp;sp_droplogin&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_helplogins&nbsp;<br />
            &nbsp;&nbsp;用户：&nbsp;&nbsp;sp_grantdbaccess,&nbsp;sp_revokedbaccess&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_adduser,&nbsp;sp_dropuser&nbsp;(这两个SP是为了向后兼容，请使用前2个代替)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_helpuser&nbsp;<br />
            &nbsp;&nbsp;角色：&nbsp;&nbsp;<br />
            &nbsp;&nbsp;服务器角色&nbsp;&nbsp;sp_addsrvrolemember,&nbsp;sp_dropsrvrolemember&nbsp;<br />
            &nbsp;&nbsp;数据库角色&nbsp;&nbsp;sp_addrole,&nbsp;sp_droprole&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_addapprole,&nbsp;sp_dropapprole&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_helprole&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_addrolemember,&nbsp;sp_droprolemember&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_helprolemember&nbsp;&nbsp;<br />
            2、命令：grant,&nbsp;revoke,&nbsp;deny<br />
            三&nbsp;固定角色<br />
            1、固定服务器角色：<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <br />
            固定服务器角色<br />
            描述<br />
            <br />
            sysadmin&nbsp;可以在&nbsp;SQL&nbsp;Server&nbsp;中执行任何活动&nbsp;<br />
            serveradmin&nbsp;可以设置服务器范围的配置选项，关闭服务器&nbsp;<br />
            setupadmin&nbsp;可以管理链接服务器和启动过程&nbsp;<br />
            securityadmin&nbsp;可以管理登录和&nbsp;CREATE&nbsp;DATABASE&nbsp;权限，还可以读取错误日志和更改密码&nbsp;<br />
            processadmin&nbsp;可以管理在&nbsp;SQL&nbsp;Server&nbsp;中运行的进程&nbsp;<br />
            dbcreator&nbsp;可以创建、更改和除去数据库&nbsp;<br />
            diskadmin&nbsp;可以管理磁盘文件&nbsp;<br />
            bulkadmin&nbsp;可以执行&nbsp;BULK&nbsp;INSERT&nbsp;语句&nbsp;<br />
            <br />
            <br />
            <br />
            2、固定数据库角色：<br />
            <br />
            <br />
            固定数据库角色<br />
            描述<br />
            <br />
            db_owner&nbsp;在数据库中有全部权限&nbsp;<br />
            db_accessadmin&nbsp;可以添加或删除用户&nbsp;ID&nbsp;<br />
            db_securityadmin&nbsp;可以管理全部权限、对象所有权、角色和角色成员资格&nbsp;<br />
            db_ddladmin&nbsp;可以发出&nbsp;ALL&nbsp;DDL，但不能发出&nbsp;GRANT、REVOKE&nbsp;或&nbsp;DENY&nbsp;语句&nbsp;<br />
            db_backupoperator&nbsp;可以发出&nbsp;DBCC、CHECKPOINT&nbsp;和&nbsp;BACKUP&nbsp;语句&nbsp;<br />
            db_datareader&nbsp;可以选择数据库内任何用户表中的所有数据&nbsp;<br />
            db_datawriter&nbsp;可以更改数据库内任何用户表中的所有数据&nbsp;<br />
            db_denydatareader&nbsp;不能选择数据库内任何用户表中的任何数据&nbsp;<br />
            db_denydatawriter&nbsp;不能更改数据库内任何用户表中的任何数据&nbsp;<br />
            <br />
            <br />
            <br />
            四&nbsp;权限<br />
            包括两种类型的权限，即对象权限和语句权限：<br />
            <br />
            <br />
            对象操作权限总结<br />
            <br />
            表&nbsp;SELECT,&nbsp;INSERT,&nbsp;UPDATE,&nbsp;DELETE,&nbsp;REFERENCE&nbsp;<br />
            视图&nbsp;SELECT,&nbsp;UPDATE,&nbsp;INSERT,&nbsp;DELETE&nbsp;<br />
            存储过程&nbsp;EXECUTE&nbsp;<br />
            函数&nbsp;表值函数&nbsp;SELECT,&nbsp;INSERT,&nbsp;UPDATE,&nbsp;DELETE,&nbsp;REFERENCE&nbsp;<br />
            标量值函数&nbsp;EXECUTE&nbsp;和&nbsp;REFERENCES&nbsp;<br />
            内嵌表函数&nbsp;EXECUTE&nbsp;和&nbsp;REFERENCES&nbsp;<br />
            列&nbsp;SELECT,&nbsp;UPDATE&nbsp;&nbsp;<br />
            <br />
            <br />
            注意：REFERENCE充许在GRANT、DENY、REVOKE语句中向有外键参照表中插入一行数据。<br />
            <br />
            <br />
            语句权限总结<br />
            <br />
            CREATE&nbsp;DATABASE&nbsp;创建数据库&nbsp;<br />
            CREATE&nbsp;TABLE&nbsp;创建表&nbsp;<br />
            CREATE&nbsp;VIEW&nbsp;创建视图&nbsp;<br />
            CREATE&nbsp;RULE&nbsp;创建规则&nbsp;<br />
            CREATE&nbsp;DEFAULT&nbsp;创建缺省&nbsp;<br />
            CREATE&nbsp;PROCEDURE&nbsp;创建存储过程&nbsp;<br />
            BACKUP&nbsp;DATABASE&nbsp;备份数据库&nbsp;<br />
            BACKUP&nbsp;LOG&nbsp;备份事务日志&nbsp;<br />
            <br />
            <br />
            <br />
            五&nbsp;实用脚本<br />
            在sql&nbsp;server中，登录到某数据库必须有两个条件：&nbsp;<br />
            1、为SQL&nbsp;Server建立一个login；<br />
            2、为该login在数据库中建立user，给该用户关联role<br />
            /*&nbsp;DBA&nbsp;的新增登录授权脚本*/&nbsp;<br />
            USE&nbsp;my_database<br />
            GO<br />
            --1.&nbsp;新建登录<br />
            IF&nbsp;NOT&nbsp;EXISTS(SELECT&nbsp;1&nbsp;FROM&nbsp;master.dbo.syslogins&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;'wh_login'&nbsp;AND&nbsp;loginname&nbsp;=&nbsp;N'wh_login')<br />
            EXEC&nbsp;sp_addlogin&nbsp;'wh_login',&nbsp;'123',&nbsp;'plm25'<br />
            GO<br />
            --2.&nbsp;新建用户<br />
            IF&nbsp;NOT&nbsp;EXISTS(SELECT&nbsp;*&nbsp;FROM&nbsp;sysusers&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;N'lewis_user')<br />
            EXEC&nbsp;sp_grantdbaccess&nbsp;'wh_login',&nbsp;'lewis_user'<br />
            GO<br />
            --3.&nbsp;分配权限<br />
            --语句权限<br />
            GRANT&nbsp;CREATE&nbsp;TABLE&nbsp;TO&nbsp;lewis_user<br />
            --对象权限<br />
            GRANT&nbsp;SELECT&nbsp;ON&nbsp;fb_app_module&nbsp;TO&nbsp;lewis_user<br />
            --授予所有权限<br />
            GRANT&nbsp;ALL&nbsp;TO&nbsp;lewis_user<br />
            --4.&nbsp;授予角色<br />
            EXEC&nbsp;sp_addrolemember&nbsp;N'db_datareader',&nbsp;N'lewis_user'&nbsp;<br />
            EXEC&nbsp;sp_addrolemember&nbsp;N'db_datawriter',&nbsp;N'lewis_user'&nbsp;<br />
            EXEC&nbsp;sp_addrolemember&nbsp;N'db_accessadmin',&nbsp;N'lewis_user'&nbsp;<br />
            EXEC&nbsp;sp_addrolemember&nbsp;N'db_ddladmin',&nbsp;N'lewis_user'&nbsp;&nbsp;&nbsp;--建立存储过程权限<br />
            --5.&nbsp;更改登录的默认数据库<br />
            EXEC&nbsp;sp_defaultdb&nbsp;@loginame&nbsp;=&nbsp;N'login',&nbsp;&nbsp;@defdb&nbsp;=&nbsp;N'default_DB_name'<br />
            --6.&nbsp;更改登录的默认语言<br />
            EXEC&nbsp;sp_defaultlanguage&nbsp;@loginame&nbsp;=&nbsp;N'login',&nbsp;&nbsp;@language&nbsp;=&nbsp;N'&nbsp;french'&nbsp;<br />
            <br />
            /*DBA&nbsp;的删除登录授权脚本*/<br />
            --1.&nbsp;拒绝授权<br />
            REVOKE&nbsp;SELECT&nbsp;&nbsp;ON&nbsp;[dbo].[fb_app_module]&nbsp;TO&nbsp;[lewis_user]&nbsp;CASCADE<br />
            REVOKE&nbsp;CREATE&nbsp;TABLE&nbsp;TO&nbsp;lewis_user<br />
            EXEC&nbsp;sp_droprolemember&nbsp;N'db_datareader',&nbsp;N'lewis_user'&nbsp;<br />
            --不能更改&nbsp;public&nbsp;角色的成员资格。也不需要移除。<br />
            --2.&nbsp;删除用户<br />
            IF&nbsp;EXISTS(SELECT&nbsp;*&nbsp;FROM&nbsp;sysusers&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;N'lewis')<br />
            EXEC&nbsp;sp_revokedbaccess&nbsp;'lewis_user'<br />
            GO<br />
            --3.&nbsp;删除登录<br />
            IF&nbsp;EXISTS(SELECT&nbsp;1&nbsp;FROM&nbsp;master.dbo.syslogins&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;'wh_login'&nbsp;AND&nbsp;loginname&nbsp;=&nbsp;N'wh_login')<br />
            EXEC&nbsp;sp_droplogin&nbsp;'wh_login'<br />
            GO<br />
            /*DBA&nbsp;的查看授权脚本*/<br />
            --1、查看服务器的登录<br />
            sp_helplogins&nbsp;查看login和user<br />
            SELECT&nbsp;*&nbsp;FROM&nbsp;master.dbo.syslogins&nbsp;WHERE&nbsp;loginname&nbsp;=&nbsp;@login_name<br />
            --2、查看数据库的用户<br />
            sp_helpuser<br />
            <br />
            SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;where&nbsp;issqlrole&nbsp;=&nbsp;1&nbsp;/*数据库角色*/<br />
            SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;where&nbsp;islogin&nbsp;=&nbsp;1&nbsp;&nbsp;/*登录*/<br />
            SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;where&nbsp;issqluser&nbsp;=&nbsp;1&nbsp;/*SQL&nbsp;Server用户*/<br />
            SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;where&nbsp;isntname&nbsp;=&nbsp;1&nbsp;/*NT用户*/<br />
            SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;where&nbsp;isapprole&nbsp;=&nbsp;1&nbsp;/*服务器角色*/<br />
            --3、查看用户有什么权限和角色????<br />
            sp_helprolemember&nbsp;'db_datareader'<br />
            --4、用户拥有的数据库中的对象????<br />
            --5、查看用户、登录、角色等综合信息<br />
            select&nbsp;DISTINCT&nbsp;username&nbsp;=&nbsp;o.name,&nbsp;<br />
            loginname&nbsp;=&nbsp;(case&nbsp;when&nbsp;(o.sid&nbsp;=&nbsp;0x00)&nbsp;then&nbsp;NULL&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;l.loginname&nbsp;end),&nbsp;<br />
            rolegroup&nbsp;=&nbsp;user_name(o.gid),&nbsp;<br />
            userID&nbsp;=&nbsp;o.uid,&nbsp;<br />
            o.hasdbaccess,&nbsp;<br />
            o.uid<br />
            from&nbsp;dbo.sysusers&nbsp;o&nbsp;left&nbsp;join&nbsp;master.dbo.syslogins&nbsp;l&nbsp;on&nbsp;l.sid&nbsp;=&nbsp;o.sid&nbsp;<br />
            where&nbsp;((o.issqlrole&nbsp;!=&nbsp;1&nbsp;and&nbsp;o.isapprole&nbsp;!=&nbsp;1)&nbsp;or&nbsp;(o.sid&nbsp;=&nbsp;0x00)&nbsp;and&nbsp;o.hasdbaccess&nbsp;=&nbsp;1)<br />
            and&nbsp;o.isaliased&nbsp;!=&nbsp;1&nbsp;&nbsp;and&nbsp;(o.name&nbsp;=&nbsp;N'@your_user_name')<br />
            六&nbsp;示例<br />
            --&nbsp;===================================================<br />
            --&nbsp;Procedure&nbsp;Name:&nbsp;fb_plm_access_control<br />
            --&nbsp;Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;set&nbsp;PLM&nbsp;Suite&nbsp;application&nbsp;user<br />
            --&nbsp;Failure&nbsp;return:&nbsp;1<br />
            --&nbsp;Success&nbsp;return:&nbsp;0<br />
            --<br />
            --&nbsp;Parameters&nbsp;&nbsp;&nbsp;&nbsp;:<br />
            --&nbsp;@login_name&nbsp;&nbsp;&nbsp;:&nbsp;application&nbsp;user&nbsp;name,&nbsp;create&nbsp;a&nbsp;account&nbsp;if&nbsp;the&nbsp;user&nbsp;does&nbsp;not&nbsp;exists,&nbsp;otherwise&nbsp;remain&nbsp;it.<br />
            --&nbsp;@password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;for&nbsp;the&nbsp;exists&nbsp;user,&nbsp;if&nbsp;the&nbsp;password&nbsp;is&nbsp;null,&nbsp;then&nbsp;remain&nbsp;its&nbsp;old&nbsp;password,<br />
            --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;for&nbsp;the&nbsp;new&nbsp;user,&nbsp;it&nbsp;can&nbsp;not&nbsp;be&nbsp;null.<br />
            --&nbsp;@db_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PLM&nbsp;Suite&nbsp;database&nbsp;name<br />
            --&nbsp;===================================================<br />
            IF&nbsp;EXISTS&nbsp;(select&nbsp;*&nbsp;from&nbsp;sysobjects&nbsp;where&nbsp;id&nbsp;=&nbsp;object_id(N'fb_plm_access_control')&nbsp;and&nbsp;OBJECTPROPERTY(id,&nbsp;N'IsProcedure')&nbsp;=&nbsp;1)<br />
            DROP&nbsp;PROCEDURE&nbsp;fb_plm_access_control<br />
            GO<br />
            <br />
            CREATE&nbsp;PROCEDURE&nbsp;fb_plm_access_control<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@login_name&nbsp;NVARCHAR(100),<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@password&nbsp;NVARCHAR(100)&nbsp;=&nbsp;null,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@db_name&nbsp;NVARCHAR(100)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
            --WITH&nbsp;ENCRYPTION<br />
            AS<br />
            DECLARE&nbsp;@result&nbsp;&nbsp;&nbsp;INT<br />
            DECLARE&nbsp;@user_exists&nbsp;&nbsp;INT<br />
            DECLARE&nbsp;@execute_sp_role&nbsp;NVARCHAR(100)<br />
            DECLARE&nbsp;@create_table_role&nbsp;NVARCHAR(100)<br />
            DECLARE&nbsp;@object_name&nbsp;&nbsp;NVARCHAR(120)<br />
            DECLARE&nbsp;@object_type&nbsp;&nbsp;NVARCHAR(10)<br />
            DECLARE&nbsp;@sql&nbsp;&nbsp;&nbsp;VARCHAR(200)<br />
            DECLARE&nbsp;@error_msg&nbsp;&nbsp;VARCHAR(100)<br />
            BEGIN<br />
            --&nbsp;check&nbsp;input&nbsp;paramters.<br />
            IF&nbsp;(@login_name&nbsp;IS&nbsp;NULL)&nbsp;OR&nbsp;(LTRIM(@login_name)&nbsp;=&nbsp;'')&nbsp;OR&nbsp;(lower(@login_name)&nbsp;=&nbsp;'sa')<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;RAISERROR&nbsp;('The&nbsp;login_name&nbsp;can&nbsp;not&nbsp;be&nbsp;null&nbsp;or&nbsp;sa.'&nbsp;,&nbsp;16,&nbsp;1)&nbsp;WITH&nbsp;NOWAIT<br />
            &nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;END<br />
            IF&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;name&nbsp;FROM&nbsp;master.dbo.sysdatabases&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;@db_name)<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;SET&nbsp;@error_msg&nbsp;=&nbsp;'The&nbsp;database&nbsp;'&nbsp;+&nbsp;@db_name&nbsp;+&nbsp;'&nbsp;does&nbsp;not&nbsp;exits.'<br />
            &nbsp;&nbsp;&nbsp;RAISERROR&nbsp;(@error_msg,&nbsp;16,&nbsp;1)&nbsp;WITH&nbsp;NOWAIT<br />
            &nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;END<br />
            <br />
            --&nbsp;if&nbsp;user&nbsp;does&nbsp;not&nbsp;exits,&nbsp;create&nbsp;it<br />
            IF&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;*&nbsp;FROM&nbsp;master.dbo.syslogins&nbsp;WHERE&nbsp;loginname&nbsp;=&nbsp;@login_name)<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;SET&nbsp;@user_exists&nbsp;=&nbsp;0<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;(@password&nbsp;IS&nbsp;NULL)&nbsp;OR&nbsp;(@password&nbsp;=&nbsp;'')<br />
            &nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAISERROR&nbsp;('For&nbsp;new&nbsp;application&nbsp;user,&nbsp;the&nbsp;password&nbsp;can&nbsp;not&nbsp;be&nbsp;null.'&nbsp;,&nbsp;16,&nbsp;1)&nbsp;WITH&nbsp;NOWAIT<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;&nbsp;&nbsp;END<br />
            &nbsp;&nbsp;&nbsp;EXEC&nbsp;sp_addlogin&nbsp;@loginame&nbsp;=&nbsp;@login_name,&nbsp;@passwd&nbsp;=&nbsp;@password,&nbsp;@defdb&nbsp;=&nbsp;@db_name,&nbsp;@deflanguage&nbsp;=&nbsp;@@language<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;END<br />
            ELSE<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;SET&nbsp;@user_exists&nbsp;=&nbsp;1<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;(@password&nbsp;IS&nbsp;NOT&nbsp;NULL)&nbsp;AND&nbsp;(LTRIM(@password)&lt;&gt;'')<br />
            &nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXEC&nbsp;sp_password&nbsp;@old&nbsp;=&nbsp;null,&nbsp;@new&nbsp;=&nbsp;@password,&nbsp;@loginame&nbsp;=&nbsp;@login_name<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;&nbsp;&nbsp;END<br />
            &nbsp;&nbsp;END<br />
            &nbsp;&nbsp;<br />
            --&nbsp;create&nbsp;the&nbsp;execute&nbsp;sp&nbsp;role&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;exists<br />
            SET&nbsp;@execute_sp_role&nbsp;=&nbsp;N'db_procexecutor'<br />
            IF&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;@execute_sp_role&nbsp;AND&nbsp;issqlrole&nbsp;=&nbsp;1)<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;EXEC&nbsp;sp_addrole&nbsp;&nbsp;@rolename&nbsp;=&nbsp;@execute_sp_role&nbsp;<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;END<br />
            &nbsp;&nbsp;<br />
            --&nbsp;create&nbsp;the&nbsp;create&nbsp;table&nbsp;role&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;exists<br />
            SET&nbsp;@create_table_role&nbsp;=&nbsp;N'db_createtable'<br />
            IF&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;*&nbsp;FROM&nbsp;dbo.sysusers&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;@create_table_role&nbsp;AND&nbsp;issqlrole&nbsp;=&nbsp;1)<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;EXEC&nbsp;sp_addrole&nbsp;&nbsp;@rolename&nbsp;=&nbsp;@create_table_role&nbsp;<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;&nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;END<br />
            <br />
            --&nbsp;grant&nbsp;privilege&nbsp;to&nbsp;the&nbsp;role<br />
            DECLARE&nbsp;cur_sp_fun&nbsp;CURSOR&nbsp;<br />
            &nbsp;&nbsp;FAST_FORWARD&nbsp;<br />
            &nbsp;&nbsp;FOR&nbsp;<br />
            &nbsp;&nbsp;SELECT&nbsp;name,&nbsp;xtype<br />
            &nbsp;&nbsp;FROM&nbsp;&nbsp;&nbsp;sysobjects&nbsp;<br />
            &nbsp;&nbsp;WHERE&nbsp;&nbsp;xtype&nbsp;in&nbsp;(N'P',&nbsp;N'FN',&nbsp;N'IF',&nbsp;N'TF')<br />
            &nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;uid&nbsp;=&nbsp;(select&nbsp;uid&nbsp;from&nbsp;sysusers&nbsp;where&nbsp;name&nbsp;=&nbsp;USER_NAME())&nbsp;<br />
            OPEN&nbsp;cur_sp_fun<br />
            FETCH&nbsp;NEXT&nbsp;FROM&nbsp;cur_sp_fun&nbsp;INTO&nbsp;@object_name,&nbsp;@object_type<br />
            WHILE&nbsp;@@FETCH_STATUS&nbsp;=&nbsp;0<br />
            &nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@object_type&nbsp;=&nbsp;N'P'<br />
            &nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;@sql='GRANT&nbsp;EXECUTE&nbsp;ON&nbsp;'+@object_name+'&nbsp;TO&nbsp;'+@execute_sp_role<br />
            &nbsp;&nbsp;&nbsp;&nbsp;END<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@object_type&nbsp;=&nbsp;N'FN'<br />
            &nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;@sql='GRANT&nbsp;REFENENCES&nbsp;ON&nbsp;'+@object_name+'&nbsp;TO&nbsp;'+@execute_sp_role<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;@sql='&nbsp;GRANT&nbsp;EXECUTE&nbsp;ON&nbsp;'+@object_name+'&nbsp;TO&nbsp;'+@execute_sp_role<br />
            &nbsp;&nbsp;&nbsp;&nbsp;END<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@object_type&nbsp;IN&nbsp;(N'IF',N'TF')<br />
            &nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;@sql='GRANT&nbsp;SELECT&nbsp;ON&nbsp;'+@object_name+'&nbsp;TO&nbsp;'+@execute_sp_role<br />
            &nbsp;&nbsp;&nbsp;&nbsp;END<br />
            &nbsp;&nbsp;&nbsp;EXEC&nbsp;(@sql)<br />
            &nbsp;&nbsp;&nbsp;IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;@result&nbsp;=&nbsp;1<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BREAK<br />
            &nbsp;&nbsp;&nbsp;&nbsp;END<br />
            &nbsp;&nbsp;&nbsp;FETCH&nbsp;NEXT&nbsp;FROM&nbsp;cur_sp_fun&nbsp;INTO&nbsp;@object_name,&nbsp;@object_type<br />
            &nbsp;&nbsp;END<br />
            CLOSE&nbsp;cur_sp_fun<br />
            DEALLOCATE&nbsp;cur_sp_fun<br />
            IF&nbsp;@result&nbsp;=&nbsp;1<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;<br />
            SET&nbsp;@sql&nbsp;=&nbsp;'GRANT&nbsp;CREATE&nbsp;TABLE&nbsp;TO&nbsp;'&nbsp;+&nbsp;@create_table_role<br />
            EXEC&nbsp;(@sql)<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            <br />
            --&nbsp;grant&nbsp;access&nbsp;database&nbsp;privilege&nbsp;to&nbsp;application&nbsp;user<br />
            IF&nbsp;@user_exists&nbsp;=&nbsp;1<br />
            &nbsp;&nbsp;EXEC&nbsp;sp_revokedbaccess&nbsp;@name_in_db&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            <br />
            EXEC&nbsp;sp_grantdbaccess&nbsp;@loginame&nbsp;=&nbsp;@login_name,&nbsp;@name_in_db&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            --&nbsp;grant&nbsp;role&nbsp;to&nbsp;application&nbsp;user<br />
            EXEC&nbsp;sp_addrolemember&nbsp;@rolename&nbsp;=&nbsp;N'db_datareader',&nbsp;@membername&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            <br />
            EXEC&nbsp;sp_addrolemember&nbsp;@rolename&nbsp;=&nbsp;N'db_datawriter',&nbsp;@membername&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            &nbsp;&nbsp;<br />
            EXEC&nbsp;sp_addrolemember&nbsp;@rolename&nbsp;=&nbsp;N'db_datawriter',&nbsp;@membername&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            <br />
            EXEC&nbsp;sp_addrolemember&nbsp;@rolename&nbsp;=&nbsp;@create_table_role,&nbsp;@membername&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            <br />
            EXEC&nbsp;sp_addrolemember&nbsp;@rolename&nbsp;=&nbsp;@execute_sp_role,&nbsp;@membername&nbsp;=&nbsp;@login_name<br />
            IF&nbsp;@@ERROR&nbsp;&lt;&gt;&nbsp;0<br />
            &nbsp;&nbsp;RETURN&nbsp;1<br />
            <br />
            RETURN&nbsp;0<br />
            END<br />
            GO </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/280807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-06-09 11:03 <a href="http://www.blogjava.net/SIDNEY/archive/2009/06/09/280807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL SERVER事务处理（转）</title><link>http://www.blogjava.net/SIDNEY/archive/2009/05/19/271599.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 19 May 2009 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/05/19/271599.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/271599.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/05/19/271599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/271599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/271599.html</trackback:ping><description><![CDATA[<div style="float: right" align="right"><a title="评分 0" href="http://www.itpub.net/misc.php?action=viewratings&amp;tid=426449&amp;pid=3023632"></a></div>
<br />
<br />
<div class="t_msgfont" id="message3023632">SQL SERVER事务处理<br />
<br />
出自：<br />
<a href="http://blog.itpub.net/category/793/14560" target="_blank">http://blog.itpub.net/category/793/14560</a><br />
<br />
事务定义：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;事务是单个的工作单元。如果某一事务成功，则在该事务中进行的所有数据更改均会<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;提交，成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚，则所有<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;数据更改均被清除。<br />
<br />
事务三种运行模式：<br />
&nbsp; &nbsp;&nbsp;&nbsp;自动提交事务<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;每条单独的语句都是一个事务。<br />
&nbsp; &nbsp;&nbsp;&nbsp;显式事务<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;每个事务均以 BEGIN TRANSACTION 语句显式开始，<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;以 COMMIT 或 ROLLBACK 语句显式结束。<br />
&nbsp; &nbsp;&nbsp;&nbsp;隐性事务<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在前一个事务完成时新事务隐式启动，但每个事务仍以 COMMIT 或 ROLLBACK 语句<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;显式完成。<br />
<br />
事务操作的语法：<br />
&nbsp; &nbsp; BEGIN TRANSACTION<br />
&nbsp; &nbsp; BEGIN DISTRIBUTED TRANSACTION<br />
&nbsp; &nbsp; COMMIT TRANSACTION<br />
&nbsp; &nbsp; COMMIT WORK<br />
&nbsp; &nbsp; ROLLBACK WORK<br />
&nbsp; &nbsp; SAVE TRANSACTION<br />
&nbsp; &nbsp; BEGIN TRANSACTION<br />
<br />
BEGIN TRANSACTION<br />
&nbsp; &nbsp;标记一个显式本地事务的起始点。<br />
<br />
&nbsp; &nbsp;BEGIN TRANSACTION将 @@TRANCOUNT 加 1。<br />
<br />
&nbsp; &nbsp;BEGIN TRANSACTION 代表一点，由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误，在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚，以将数据返回到已知的一致状态 。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动，或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动<br />
<br />
语法<br />
BEGIN TRAN [ SACTION ] [ transaction_name |&nbsp; &nbsp;@tran_name_variable&nbsp; &nbsp;&nbsp;&nbsp;[ WITH MARK [ 'description' ] ] ]<br />
<br />
<br />
例子：<br />
&nbsp;&nbsp;BEGIN TRAN T1<br />
&nbsp; &nbsp;&nbsp; &nbsp;UPDATE table1 ...<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; --nest transaction M2<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; BEGIN TRAN M2 WITH MARK<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;UPDATE table2 ...<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SELECT * from table1<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; COMMIT TRAN M2<br />
&nbsp; &nbsp;&nbsp; &nbsp;UPDATE table3 ...<br />
&nbsp;&nbsp;COMMIT TRAN T1<br />
<br />
<br />
<br />
BEGIN DISTRIBUTED TRANSACTION<br />
&nbsp; &nbsp; 指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。<br />
<br />
&nbsp; &nbsp; 语法<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;BEGIN DISTRIBUTED TRAN [ SACTION ]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;[ transaction_name | @tran_name_variable ]<br />
<br />
&nbsp; &nbsp; 参数<br />
&nbsp; &nbsp;&nbsp; &nbsp;transaction_name<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;是用户定义的事务名，用于跟踪 MS DTC 实用工具中的分布式事务。&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; transaction_name 必须符合标识符规则，但是仅使用头 32 个字符<br />
<br />
@tran_name_variable<br />
&nbsp; &nbsp; 是用户定义的一个变量名，它含有一个事务名，该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。<br />
<br />
注释<br />
&nbsp; &nbsp;执行BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人，并且控制事务的完成<br />
<br />
当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时，<br />
主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。<br />
有两个方法可将远程 SQL 服务器登记在一个分布式事务中： <br />
<br />
分布式事务中已登记的连接执行一个远程存储过程调用，该调用引用一个远程服务器。 <br />
分布式事务中已登记的连接执行一个分布式查询，该查询引用一个远程服务器。 <br />
<br />
示例<br />
&nbsp;&nbsp;本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。 <br />
<br />
说明 <br />
&nbsp; &nbsp;当前的SQL Server 上必须安装 MS DTC. <br />
<br />
USE pubs<br />
GO<br />
BEGIN DISTRIBUTED TRANSACTION<br />
UPDATE authors<br />
&nbsp; &nbsp;SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'<br />
EXECUTE link_Server_T.pubs.dbo.changeauth_lname '409-56-7008','McDonald'<br />
COMMIT TRAN<br />
GO<br />
Note:<br />
&nbsp; &nbsp; 如果需要连接远程DB,如果是linkServer 方式连接的话，一定要修该linkServer的 RPC 选项置为 True。<br />
<br />
SET XACT_ABORT<br />
&nbsp; &nbsp; 指定当 Transact-SQL 语句产生运行时错误时，Microsoft? SQL Server? 是否自动回滚当前事务。<br />
<br />
(&nbsp;&nbsp;可以比较简单的理解，如果中间有任何一句SQL 出错，所有SQL全部回滚.特别适用于 Procedure 中间调用Procedure ，如果第一个Procedure Ok，被调用的Procedure 中间有错误，如果SET XACT_ABORT=false，则出错的部分回滚，其他部分提交，当然外部Procedure 也提交。）.<br />
<br />
---在分布式Trans中一定要注意设置下面参数(XACT_ABORT)<br />
<br />
语法<br />
SET XACT_ABORT { ON | OFF }<br />
<br />
注释<br />
&nbsp; &nbsp; 当 SET XACT_ABORT 为 ON 时，如果 Transact-SQL 语句产生运行时错误，整个事务将终止并回滚。为 OFF 时，只回滚产生错误的Transact-SQL 语句，而事务将继续进行处理。编译错误（如语法错误）不受 SET XACT_ABORT 的影响。<br />
<br />
&nbsp; &nbsp;对于大多数 OLE DB 提供程序（包括 SQL Server），隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。<br />
<br />
SET XACT_ABORT 的设置是在执行或运行时设置，而不是在分析时设置。<br />
<br />
示例<br />
下例导致在含有其它 Transact-SQL 语句的事务中发生违反外键错误。在第一个语句集中产生错误，但其它语句均成功执行且事务成功<br />
提交。在第二个语句集中，SET XACT_ABORT 设置为 ON。这导致语句错误使批处理终止，并使事务回滚。 <br />
<br />
&nbsp;&nbsp;CREATE TABLE t1 (a int PRIMARY KEY)<br />
&nbsp;&nbsp;CREATE TABLE t2 (a int REFERENCES t1(a))<br />
&nbsp;&nbsp;GO<br />
&nbsp;&nbsp;INSERT INTO t1 VALUES (1)<br />
&nbsp;&nbsp;INSERT INTO t1 VALUES (3)<br />
&nbsp;&nbsp;INSERT INTO t1 VALUES (4)<br />
&nbsp;&nbsp;INSERT INTO t1 VALUES (6)<br />
&nbsp;&nbsp;GO<br />
&nbsp;&nbsp;SET XACT_ABORT OFF<br />
&nbsp;&nbsp;GO<br />
&nbsp;&nbsp;BEGIN TRAN<br />
&nbsp;&nbsp;INSERT INTO t2 VALUES (1)<br />
&nbsp;&nbsp;INSERT INTO t2 VALUES (2) /* Foreign key error */<br />
&nbsp;&nbsp;INSERT INTO t2 VALUES (3)<br />
&nbsp;&nbsp;COMMIT TRAN<br />
&nbsp;&nbsp;GO<br />
&nbsp; &nbsp;<br />
&nbsp;&nbsp;SET XACT_ABORT ON<br />
&nbsp;&nbsp;GO<br />
&nbsp; &nbsp;<br />
&nbsp;&nbsp;BEGIN TRAN<br />
&nbsp;&nbsp;INSERT INTO t2 VALUES (4)<br />
&nbsp;&nbsp;INSERT INTO t2 VALUES (5) /* Foreign key error */<br />
&nbsp;&nbsp;INSERT INTO t2 VALUES (6)<br />
&nbsp;&nbsp;COMMIT TRAN<br />
&nbsp;&nbsp;GO<br />
<br />
<br />
<br />
SAVE TRANSACTION<br />
在事务内设置保存点。<br />
<br />
语法<br />
&nbsp; &nbsp;&nbsp;&nbsp;SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }<br />
参数<br />
&nbsp;&nbsp;savepoint_name<br />
&nbsp; &nbsp; 是指派给保存点的名称。保存点名称必须符合标识符规则，但只使用前 32 个字符。<br />
&nbsp;&nbsp;@savepoint_variable<br />
&nbsp; &nbsp;&nbsp; &nbsp;是用户定义的、含有有效保存点名称的变量的名称。<br />
&nbsp; &nbsp;&nbsp; &nbsp;必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。<br />
注释<br />
&nbsp; &nbsp;&nbsp; &nbsp;用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分，事&nbsp;&nbsp;务可以返回的位置。如果将事务回滚到保存点，则必须（如果需要，使用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句）继续完成事务，或者必须（通过将事务回滚到其起始点）完全取消事务。若要取消整个事务，请使用 ROLLBACK TRANSACTION transaction_name 格式。这将撤消事务的所&nbsp;&nbsp;有语句和过程。<br />
<br />
Note：1： 在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中，不支持 SAVE TRANSACTION。<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;2：当事务开始时，将一直控制事务中所使用的资源直到事务完成（也就是锁定）。当将事务的一部分回滚到保存点时，将继续控制资源直到事务完成（或者回滚全部事务）。<br />
<br />
例子：<br />
begin transaction<br />
&nbsp; &nbsp; save transaction A<br />
&nbsp; &nbsp;&nbsp;&nbsp;insert into demo values('BB','B term')<br />
&nbsp; &nbsp; rollback TRANSACTION A<br />
&nbsp; &nbsp; create table demo2(name varchar(10),age int)<br />
&nbsp; &nbsp; insert into demo2(name,age) values('lis',1)<br />
commit transaction<br />
<br />
<br />
<br />
<br />
<br />
ROLLBACK TRANSACTION<br />
<br />
将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。<br />
语法<br />
ROLLBACK [ TRAN [ SACTION ]<br />
&nbsp; &nbsp;&nbsp;&nbsp;[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]<br />
<br />
参数<br />
transaction_name<br />
&nbsp;&nbsp;是给 BEGIN TRANSACTION 上的事务指派的名称。transaction_name 必须符合标识符规则，但只使用事务名称的前 32 个字符。嵌套<br />
&nbsp;&nbsp;事务时，transaction_name 必须是来自最远的 BEGIN TRANSACTION 语句的名称。<br />
@tran_name_variable<br />
&nbsp;&nbsp;是用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。<br />
savepoint_name<br />
&nbsp;&nbsp;是来自 SAVE TRANSACTION 语句的 savepoint_name。savepoint_name 必须符合标识符规则。当条件回滚只影响事务的一部分时使&nbsp;&nbsp;用 savepoint_name。<br />
@savepoint_variable<br />
&nbsp;&nbsp;是用户定义的、含有有效保存点名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。<br />
<br />
注释<br />
ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。ROLLBACK 还释放由事务控制的资源。<br />
不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滚到事务的起点。嵌套事务时，该语句将所有内层事务回滚到 最远的 BEGIN TRANSACTION 语句。在这两种情况下，ROLLBACK TRANSACTION 均将 @@TRANCOUNT 系统函数减为 0。ROLLBACK&nbsp;&nbsp;<br />
TRANSACTION savepoint_name 不减少 @@TRANCOUNT。<br />
<br />
Note: <br />
&nbsp;&nbsp;ROLLBACK TRANSACTION 语句若指定 savepoint_name 则不释放任何锁。<br />
&nbsp;&nbsp;在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中，ROLLBACK TRANSACTION 不能<br />
&nbsp;&nbsp;引用savepoint_name。在执行 COMMIT TRANSACTION 语句后不能回滚事务。<br />
<br />
&nbsp;&nbsp;在事务内允许有重复的保存点名称，但 ROLLBACK TRANSACTION 若使用重复的保存点名称，则只回滚到最近的使用该保存点名称的SAVE TRANSACTION。<br />
<br />
&nbsp;&nbsp;在存储过程中，不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 语句将所有语句回滚到最远的 BEGINTRANSACTION。在存储过程中，ROLLBACK TRANSACTION 语句使 @@TRANCOUNT 在触发器完成时的值不同于调用该存储过程时的@@TRANCOUNT 值，并且生成一个信息。该信息不影响后面的处理。<br />
<br />
如果在触发器中发出 ROLLBACK TRANSACTION：将回滚对当前事务中的那一点所做的所有数据修改，包括触发器所做的修改。 <br />
触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据，则不回滚这些修改。执行其余的语句不会激发嵌套触发器。在批处理中，不执行所有位于激发触发器的语句之后的语句。每次进入触发器，@@TRANCOUNT 就增加 1，即使在自动提交模式下也是如此。（系统将触发器视作隐性嵌套事务。）<br />
<br />
在存储过程中，ROLLBACK TRANSACTION 语句不影响调用该过程的批处理中的后续语句；<br />
将执行批处理中的后续语句。在触发器中，ROLLBACK TRANSACTION 语句终止含有激发触发器的语句的批处理；<br />
不执行批处理中的后续语句。<br />
<br />
ROLLBACK TRANSACTION 语句不生成显示给用户的信息。如果在存储过程或触发器中需要警告，请使用 RAISERROR 或 PRINT 语句。RAISERROR 是用于指出错误的首选语句。<br />
<br />
ROLLBACK 对游标的影响由下面三个规则定义： <br />
&nbsp; &nbsp;当 CURSOR_CLOSE_ON_COMMIT 设置为 ON 时，ROLLBACK 关闭但不释放所有打开的游标。 <br />
&nbsp; &nbsp;当 CURSOR_CLOSE_ON_COMMIT 设置为 OFF 时，ROLLBACK 不影响任何打开的同步 STATIC 或 INSENSITIVE 游标不影响已完全填充 的异步 STATIC 游标。将关闭但不释放任何其它类型的打开的游标。 <br />
对于导致终止批处理并生成内部回滚的错误，将释放在含有该错误语句的批处理内声明的所有游标。<br />
不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设置，所有游标均将被释放，其中包括在该错误批处理所调用的存储过程内声明的游标。在该错误批处理之前的批处理内声明的游标以规则 1 和 2 为准。死锁错误就属于这类错误。在触发器中发出的 ROLLBACK 语句也 自动生成这类错误。 <br />
<br />
<br />
权限<br />
ROLLBACK TRANSACTION 权限默认授予任何有效用户。<br />
例子：<br />
<br />
begin transaction<br />
&nbsp; &nbsp; save transaction A<br />
&nbsp; &nbsp;&nbsp;&nbsp;insert into demo values('BB','B term')<br />
&nbsp; &nbsp; rollback TRANSACTION A<br />
<br />
--&nbsp; &nbsp; select * into demo2 from demo1<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;create table demo2(name varchar(10),age int)<br />
&nbsp; &nbsp;&nbsp;&nbsp;insert into demo2(name,age) values('lis',1)<br />
rollback transaction<br />
<br />
<br />
<br />
&nbsp; &nbsp; COMMIT TRANSACTION<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;标志一个成功的隐性事务或用户定义事务的结束。如果 @@TRANCOUNT 为 1，COMMIT <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;TRANSACTION 使得自从事务开始以来所执行的 所有数据修改成为数据库的永久部分，释放连接<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;占用的资源，并将 @@TRANCOUNT 减少到 0。如果@@TRANCOUNT 大于 1，则COMMIT <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; TRANSACTION 使 @@TRANCOUNT 按 1 递减。<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;只有当事务所引用的所有数据的逻辑都正确时，发出 COMMIT TRANSACTION 命令。<br />
&nbsp; &nbsp; COMMIT WORK<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;标志事务的结束。<br />
&nbsp; &nbsp; 语法<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;COMMIT [ WORK ]<br />
<br />
&nbsp; &nbsp; 注释<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;此语句的功能与 COMMIT TRANSACTION 相同，但 COMMIT TRANSACTION 接受用户定义的事务<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;名称。这个指定或没有指定可选关键字WORK 的 COMMIT 语法与 SQL-92 兼容<br />
<br />
&nbsp; &nbsp; 例子：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin transaction a<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;insert into demo values('BB','B term')<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;commit TRANSACTION A<br />
<br />
<br />
<br />
<br />
隐性事务<br />
&nbsp; &nbsp; 当连接以隐性事务模式进行操作时，SQL Server将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始，只需提交或<br />
&nbsp; &nbsp; 回滚每个事务。隐性事务模式生成连续的事务链。<br />
<br />
&nbsp; &nbsp; 在为连接将隐性事务模式设置为打开之后，当 SQL Server 首次执行下列任何语句时，都会自动启动一个事务：<br />
ALTER TABLE INSERT <br />
CREATE OPEN <br />
DELETE REVOKE <br />
DROP SELECT <br />
FETCH TRUNCATE TABLE <br />
GRANT UPDATE <br />
<br />
<br />
&nbsp; &nbsp; 在发出 COMMIT 或 ROLLBACK 语句之前，该事务将一直保持有效。在第一个事务被提交或回滚之后，下次当连接执行这些语句<br />
&nbsp; &nbsp; 中的任何语句时，SQL Server 都将自动启动一个新事务。SQL Server 将不断地生成一个隐性事务链，<br />
&nbsp; &nbsp; 直到隐性事务模式关闭为止<br />
<br />
&nbsp; &nbsp; 例子：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin transaction <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;save transaction A<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; insert into demo values('BB','B term')<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;rollback TRANSACTION A<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;create table demo2(name varchar(10),age int)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;insert into demo2(name,age) values('lis',1)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;rollback transaction<br />
&nbsp; &nbsp; -- 在 Create table demo2 时 SQL Server 已经隐式创建一个Trans,知道提交或回滚<br />
<br />
<br />
<br />
<br />
嵌套事务处理:<br />
<br />
&nbsp;&nbsp;1： Trans 嵌套，将内部的trans 合并到外部并形成一个Trans.<br />
<br />
&nbsp; &nbsp; begin tran t1 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;----In the first trans .<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Insert into demo2(name,age) values('lis',1)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;---Second Trans<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin transaction t2&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;insert into demo values('BB','B term')<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;commit transaction t2<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;----In the first trans .<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Insert into demo2(name,age) values('lis',2)<br />
&nbsp; &nbsp;&nbsp;&nbsp;rollback transaction t1<br />
<br />
&nbsp; &nbsp;Note:<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个（最外部的）事务名。回滚<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;到其它任何名字（有效的保存点名除外）都会产生错误。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;事实上，任何在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会进行回滚。<br />
<br />
<br />
&nbsp; &nbsp; 例：内部事务回滚SQL server 报错。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin tran t1 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Insert into demo2(name,age) values('lis',1)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;---Second Trans <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;--Server: Msg 6401, Level 16, State 1, Line 6<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;---Cannot roll back t2. No transaction or savepoint of that name was found.<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;begin transaction t2&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; insert into demo values('BB','B term')<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;rollback transaction t2<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;----In the first trans .<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Insert into demo2(name,age) values('lis',2)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;commit transaction t1<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;例： 内部事务提交SQL server 不会报错。 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin tran t1 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Insert into demo2(name,age) values('lis',1)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ---Second Trans no error<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;begin transaction t2&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; insert into demo values('BB','B term')<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;commit transaction t2<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;----In the first trans .<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Insert into demo2(name,age) values('lis',2)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;commit transaction t1<br />
<br />
<br />
SQL Server 的隔离级别：<br />
<br />
<br />
1: 设置TimeOut 参数<br />
<br />
&nbsp; &nbsp; Set Lock_TimeOut 5000<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;被锁超时5秒将自动解锁<br />
<br />
&nbsp; &nbsp; Set Lock_TimeOut 0<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;产立即解锁，返回Error 默认为-1，无限等待<br />
<br />
&nbsp; &nbsp;2：<br />
&nbsp; &nbsp; (SET TRANSACTION ISOLATION LEVEL<br />
&nbsp; &nbsp;&nbsp; &nbsp;{ READ COMMITTED<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| READ UNCOMMITTED<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| REPEATABLE READ<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| SERIALIZABLE}）<br />
<br />
<br />
<br />
&nbsp; &nbsp; READ COMMITTED<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;指定在读取数据时控制共享锁以避免脏读，但数据可在事务结束前更改，从而产生不可重复读取或<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;幻像数据。该选项是SQL Server 的默认值。<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;避免脏读，并在其他session 在事务中不能对已有数据进行修改。共享锁。<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp; &nbsp;<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;READ UNCOMMITTED<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;执行脏读或 0 级隔离锁定，这表示不发出共享锁，也不接受排它锁。当设置该选项时，可以对数<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;据执行未提交读或脏读；在事务结束前可以更改数据内的数值，行也可以出现在数据集中或从数据<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;限制最小的级别。<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp; <br />
<br />
<br />
<br />
&nbsp; &nbsp; REPEATABLE READ<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;锁定查询中使用的所有数据以防止其他用户更新数据，但是其他用户可以将新的幻像行插入数据<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;集，且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别，所以应只在必要时才使<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;用该选项。<br />
<br />
<br />
<br />
<br />
<br />
&nbsp; &nbsp; SERIALIZABLE<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在数据集上放置一个范围锁，以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;是四个隔离级别中限制最大的级别。因为并发级别较低，所以应只在必要时才使用该选项。该选项<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。<br />
<br />
<br />
<br />
出自：<br />
<a href="http://blog.itpub.net/category/793/14560" target="_blank">http://blog.itpub.net/category/793/14560</a><br />
<br />
希望能给大家有所帮助。<br />
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/271599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-05-19 22:12 <a href="http://www.blogjava.net/SIDNEY/archive/2009/05/19/271599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈数据库索引(转)</title><link>http://www.blogjava.net/SIDNEY/archive/2009/03/30/262988.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 30 Mar 2009 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/03/30/262988.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/262988.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/03/30/262988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/262988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/262988.html</trackback:ping><description><![CDATA[&nbsp;数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念，认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下：
<p>&nbsp;&nbsp;&nbsp;&nbsp;首先明白为什么索引会增加速度，DB在执行一条Sql语句的时候，默认的方式是根据搜索条件进行全表扫描，遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引，查询时就会先去索引列表中一次定位到特定值的行数，大大减少遍历匹配的行数，所以能明显增加查询的速度。那么在任何时候都应该加索引么？这里有几个反例：1、如果每次都需要取到所有表记录，无论如何都必须进行全表扫描了，那么是否加索引也没有意义了。2、对非唯一的字段，例如&#8220;性别&#8221;这种大量重复值的字段，增加索引也没有什么意义。3、对于记录比较少的表，增加索引不会带来速度的优化反而浪费了存储空间，因为索引是需要存储空间的，而且有个致命缺点是对于update/insert/delete的每次执行，字段的索引都必须重新计算更新。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;那么在什么时候适合加上索引呢？我们看一个Mysql手册中举的例子，这里有一条sql语句：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees &gt;= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = 'Executive')</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;这条语句涉及3个表的联接，并且包括了许多搜索条件比如大小比较，Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后，扫描的行数只需要134行。在Mysql中可以通过Explain Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下，索引带来的性能提升远比它所占据的磁盘空间要重要得多。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;那么索引是如何实现的呢？大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的：一棵m(m&gt;=3)阶的B树是满足下列条件的m叉树：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;1、每个结点包括如下作用域(j, p0, k1, p1, k2, p2, ... ki, pi) 其中j是关键字个数，p是孩子指针</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;2、所有叶子结点在同一层上，层数等于树高h</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;3、每个非根结点包含的关键字个数满足[m/2-1]&lt;=j&lt;=m-1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;4、若树非空，则根至少有1个关键字，若根非叶子，则至少有2棵子树，至多有m棵子树</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;看一个B树的例子，针对26个英文字母的B树可以这样构造：</p>
<p align="left"><img height="253" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/Ant_Yan/EntryImages/20080915/BTree633570747327310000.jpg" width="599" /></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;可以看到在这棵B树搜索英文字母复杂度只为o(m)，在数据量比较大的情况下，这样的结构可以大大增加查询速度。然而有另外一种数据结构查询的虚度比B树更快——散列表。Hash表的定义是这样的：设所有可能出现的关键字集合为u，实际发生存储的关键字记为k，而|k|比|u|小很多。散列方法是通过散列函数h将u映射到表T[0,m-1]的下标上，这样u中的关键字为变量，以h为函数运算结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找。<br />
&nbsp;&nbsp;&nbsp;&nbsp;然而散列表有一个缺陷，那就是散列冲突，即两个关键字通过散列函数计算出了相同的结果。设m和n分别表示散列表的长度和填满的结点数，n/m为散列表的填装因子，因子越大，表示散列冲突的机会越大。<br />
&nbsp;&nbsp;&nbsp;&nbsp;因为有这样的缺陷，所以数据库不会使用散列表来做为索引的默认实现，Mysql宣称会根据执行查询格式尝试将基于磁盘的B树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略，毕竟在数据库战场上，搜索速度和管理安全一样是非常重要的竞争点。<br />
<br />
http://blog.csdn.net/Ant_Yan/archive/2008/09/15/2932068.aspx</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/262988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-03-30 21:26 <a href="http://www.blogjava.net/SIDNEY/archive/2009/03/30/262988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 UDF</title><link>http://www.blogjava.net/SIDNEY/archive/2009/03/04/257883.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 04 Mar 2009 13:25:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2009/03/04/257883.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/257883.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2009/03/04/257883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/257883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/257883.html</trackback:ping><description><![CDATA[<div class="postText">MOSS的Excel Services相信大家都听说过.我们可以创建一个引用了外部数据的Excel文件,然后发布到Excel Services中,然后就可以让用户在网页上看到数据库中的数据的实时的状态.<br />
<br />
我们会有这样的设想,我在Excel中设计一个计算逻辑,然后从数据库中取一些值出来,填到Excel中,然后让Excel 自动去计算,然后我们可以把计算分析后的结果呈现给拥护.恩,这个设想很好!我们要实现这个想法需要做三件事情: <br />
<br />
1)我们要能从数据库中取出特定的数,可能需要取到某一个数 <br />
2)我们需要Excel Services能支持我们直接查数据库<br />
3)我们把设计好的Excel发布出去<br />
<br />
第一件事情我们自然想到了SQL语句比如"Select&nbsp;value &nbsp;From table..."之类.<br />
很遗憾,Excel Services不支持直接查询数据库,只支持SQL Server Analysis Services等间接的方式,可能是处于安全或者其他考虑,对于不了解SQL Server Analysis Services的兄弟来说就很难了&nbsp; : (<br />
<br />
这么一个好的设想，难道就实现不了吗？庆幸的是，Excel Services支持Udf用户自定义函数,我们可以通过用户自定义函数开发一个直接查数据库的Udf,使用我们熟悉的SQL语句.<br />
<br />
Udf的开发过程:<br />
1)VS2005新建一个类工程,应用经典目录下 12/ISAPI/Microsoft.Office.Excel.Server.Udf.dll<br />
2)编写自定义的函数<br />
3)注册Udf<br />
<br />
关于Udf中的支持的返回值类型等可以参考: <a href="http://officeblogs.net/excel/UDFs%20for%20Excel%20client%20and%20server.doc">http://officeblogs.net/excel/UDFs%20for%20Excel%20client%20and%20server.doc</a><br />
<br />
SQLExcuteUdf是为实现了一个方法取数据库中的某个值而设计的:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Microsoft.Office.Excel.Server.Udf;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data.SqlClient;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;SQLExcuteUdf<br />
<img id="Codehighlighter1_180_1201_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_1201_Open_Text.style.display='none'; Codehighlighter1_180_1201_Closed_Image.style.display='inline'; Codehighlighter1_180_1201_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_180_1201_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_180_1201_Closed_Text.style.display='none'; Codehighlighter1_180_1201_Open_Image.style.display='inline'; Codehighlighter1_180_1201_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_180_1201_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_180_1201_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;[UdfClass]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SQLExcute<br />
<img id="Codehighlighter1_228_1199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_228_1199_Open_Text.style.display='none'; Codehighlighter1_228_1199_Closed_Image.style.display='inline'; Codehighlighter1_228_1199_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_228_1199_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_228_1199_Closed_Text.style.display='none'; Codehighlighter1_228_1199_Open_Image.style.display='inline'; Codehighlighter1_228_1199_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_228_1199_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_228_1199_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_238_432_Open_Image" onclick="this.style.display='none'; Codehighlighter1_238_432_Open_Text.style.display='none'; Codehighlighter1_238_432_Closed_Image.style.display='inline'; Codehighlighter1_238_432_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_238_432_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_238_432_Closed_Text.style.display='none'; Codehighlighter1_238_432_Open_Image.style.display='inline'; Codehighlighter1_238_432_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_238_432_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_238_432_Open_Text"><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;取SQL&nbsp;Server数据库中的单个值<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="constr"&gt;</span><span style="color: #008000">数据库链接</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="comstr"&gt;</span><span style="color: #008000">SQl语句</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;&lt;/returns&gt;</span></span><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[UdfMethod]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;GetSingleDataFromSQL(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;constr,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;comstr)<br />
<img id="Codehighlighter1_534_1193_Open_Image" onclick="this.style.display='none'; Codehighlighter1_534_1193_Open_Text.style.display='none'; Codehighlighter1_534_1193_Closed_Image.style.display='inline'; Codehighlighter1_534_1193_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_534_1193_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_534_1193_Closed_Text.style.display='none'; Codehighlighter1_534_1193_Open_Image.style.display='inline'; Codehighlighter1_534_1193_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_534_1193_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_534_1193_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_565_1076_Open_Image" onclick="this.style.display='none'; Codehighlighter1_565_1076_Open_Text.style.display='none'; Codehighlighter1_565_1076_Closed_Image.style.display='inline'; Codehighlighter1_565_1076_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_565_1076_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_565_1076_Closed_Text.style.display='none'; Codehighlighter1_565_1076_Open_Image.style.display='inline'; Codehighlighter1_565_1076_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_565_1076_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_565_1076_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;tempstring&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">无数据</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlConnection&nbsp;mycon&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SqlConnection(constr);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mycon.Open();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlCommand&nbsp;mycom&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SqlCommand(comstr,&nbsp;mycon);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDataReader&nbsp;myreader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mycom.ExecuteReader();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(myreader.Read())<br />
<img id="Codehighlighter1_888_963_Open_Image" onclick="this.style.display='none'; Codehighlighter1_888_963_Open_Text.style.display='none'; Codehighlighter1_888_963_Closed_Image.style.display='inline'; Codehighlighter1_888_963_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_888_963_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_888_963_Closed_Text.style.display='none'; Codehighlighter1_888_963_Open_Image.style.display='inline'; Codehighlighter1_888_963_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_888_963_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_888_963_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempstring&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;myreader[</span><span style="color: #000000">0</span><span style="color: #000000">].ToString();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mycon.Close();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mycon.Dispose();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tempstring;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)<br />
<img id="Codehighlighter1_1123_1183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1123_1183_Open_Text.style.display='none'; Codehighlighter1_1123_1183_Closed_Image.style.display='inline'; Codehighlighter1_1123_1183_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1123_1183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1123_1183_Closed_Text.style.display='none'; Codehighlighter1_1123_1183_Open_Image.style.display='inline'; Codehighlighter1_1123_1183_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1123_1183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1123_1183_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">运行错误,错误:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ex.Message;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
编译把dll进行注册<br />
<img alt="" src="http://images.cnblogs.com/cnblogs_com/FreePark/68815/r_reg%20udf.PNG" border="0" /><br />
根据Udf的设计,需要给函数提供一个数据库连接和SQL语句,在Excel中我是需要用这个Udf查数据库中某个值,直接在某个单元格输入函数"=GetSingleDataFromSQL($A$1,B4)".因为Excel不知道这个函数所以在这里会显示"#Name!"之类的东西,如果把Udf作成xll放到Excel中就能直接在Excel中用了,这里就不做介绍了.&nbsp;<br />
<img alt="" src="http://images.cnblogs.com/cnblogs_com/FreePark/68815/o_use%20udf.PNG" border="0" /><br />
然后,我把这个发布到Excel Services中.<br />
当我在浏览器中访问的时候,Excel Services就会利用Udf去数据库中查到一个值,显示出来,当数据库中数据有更新的时候,刷新页面会实时更新数据.<br />
<img height="251" alt="" src="http://images.cnblogs.com/cnblogs_com/freepark/68815/o_result.PNG" width="345" border="0" /><br />
<br />
在<a href="http://files.cnblogs.com/FreePark/SQLExcuteUdf.zip"><strong style="color: #0000ff">这里</strong></a>下载源代码. <br />
<br />
<strong style="color: #ff0000">预告</strong>: <br />
如何利用Excel Services取实数据作为KPI列表数据源 </div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/257883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2009-03-04 21:25 <a href="http://www.blogjava.net/SIDNEY/archive/2009/03/04/257883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>