??xml version="1.0" encoding="utf-8" standalone="yes"?> 2Q?Q? 配置Web Server 2Q?Q? Adobe Acrobat Reader 4.05的安?br />
插入“Impromptu Web Reports”的安装盘Q运行光盘中?#8220;\Adobe\ar405eng.exe”?br />
详见《Impromptu Web Reports Installation and Configuration》page 24?/p>
2Q?Q? Adobe Acrobat Reader 体汉字的安装
]]>
LDAP目录的优?nbsp;
如果需要开发一U提供公׃息查询的pȝ一般的设计Ҏ可能是采用基于WEB的数据库设计方式Q即前端使用览器而后端用WEB服务器加上关pL据库。后端在Windows的典型实现可能是Windows NT + IIS + Acess数据库或者是SQL服务器,IIS和数据库之间通过ASP技术用ODBCq行q接Q达到通过填写表单查询数据的功能;
后端在Linuxpȝ的典型实现可能是Linux+ Apache + postgresqlQApache和数据库之间通过PHP3提供的函数进行连接。用上q方法的~点是后端关pL据库的引入导致系l整体的性能降低和系l的理比较J琐Q因为需要不断的q行数据cd的验证和事务的完整性的认Qƈ且前端用户对数据的控制不够灵z,用户权限的设|一般只能是讄在表一U而不是设|在记录一U?nbsp;
目录服务的推Z要是解决上述数据库中存在的问题。目录与关系数据库相|是指h描述性的Z属性的记录集合Q但它的数据cd主要是字W型Qؓ了检索的需要添加了BINQ二q制数据Q、CISQ忽略大写Q、CESQ大写敏感Q、TELQ电话型Q等语法QSyntaxQ,而不是关pL据库提供的整数、QҎ、日期、货币等cdQ同样也不提供象关系数据库中普遍包含的大量的函数Q它主要面向数据的查询服务(查询和修Ҏ作比一般是大于10:1Q,不提供事务的回滚QrollbackQ机Ӟ它的数据修改使用单的锁定机制实现All-or-NothingQ它的目标是快速响应和大容量查询ƈ且提供多目录服务器的信息复制功能?nbsp;
现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是:可以在Q何计机q_上,用很Ҏ获得的而且数目不断增加的LDAP的客LE序讉KLDAP目录。而且也很Ҏ定制应用E序为它加上LDAP的支持?nbsp;
LDAP协议是跨q_的和标准的协议,因此应用E序׃用ؓLDAP目录攑֜什么样的服务器上操心了。实际上QLDAP得到了业界的q泛认可Q因为它是Internet的标准。商都很愿意在产品中加入对LDAP的支持,因ؓ他们Ҏ不用考虑另一端(客户端或服务端)是怎么L。LDAP服务器可以是M一个开发源代码或商用的LDAP目录服务器(或者还可能是具有LDAP界面的关pd数据库)Q因为可以用同样的协议、客Lq接软g包和查询命o与LDAP服务器进行交互。与LDAP不同的是Q如果Y件商想在Y件品中集成对DBMS的支持,那么通常都要Ҏ一个数据库服务器单独定制。不象很多商用的关系型数据库Q你不必为LDAP的每一个客Lq接或许可协议付?大多数的LDAP服务器安装v来很单,也容易维护和优化?nbsp;
LDAP服务器可以用“?#8221;?#8220;?#8221;的方法复刉分或全部数据Q例如:可以把数?#8220;?#8221;到远E的办公室,以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配|。如果要在DBMS中用相同的复制功能Q数据库产商׃要你支付额外的费用,而且也很隄理?nbsp;
LDAP允许你根据需要用ACIQ一般都UCؓACL或者访问控制列表)控制Ҏ据读和写的权限。例如,讑֤理员可以有权改变员工的工作地点和办公室LQ但是不允许改变记录中其它的域。ACI可以Ҏ谁访问数据、访问什么数据、数据存在什么地方以及其它对数据q行讉K控制。因些都是由LDAP目录服务器完成的Q所以不用担心在客户端的应用E序上是否要q行安全查?nbsp;
LDAPQLightweight Directory Acess ProtocolQ是目录服务在TCP/IP上的实现QRFC 1777 V2版和RFC 2251 V3版)。它是对X500的目录协议的ULQ但是简化了实现ҎQ所以称量的目录服务。在LDAP中目录是按照树型l构l织Q目录由条目QEntryQ组成,条目相当于关pL据库中表的记录;条目是具有区别名DNQDistinguished NameQ的属性(AttributeQ集合,DN相当于关pL据库表中的关键字QPrimary KeyQ;属性由cdQTypeQ和多个|ValuesQ组成,相当于关pL据库中的域(FieldQ由域名和数据类型组成,
只是Z方便索的需要,LDAP中的Type可以有多个ValueQ而不是关pL据库中ؓ降低数据的冗余性要求实现的各个域必L不相关的。LDAP中条目的l织一般按照地理位|和l织关系q行l织Q非常的直观。LDAP把数据存攑֜文g中,为提高效率可以用基于烦引的文g数据库,而不是关pL据库。LDAP协议集还规定了DN的命名方法、存取控制方法、搜索格式、复制方法、URL格式、开发接口等
LDAP对于q样存储q样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新?nbsp;
例如Q这些信息存储在LDAP目录中是十分有效的:
l 公司员工的电话号码簿和组l结构图
l 客户的联pM?nbsp;
l 计算机管理需要的信息Q包括NIS映射、email假名Q等{?nbsp;
l 软g包的配置信息
l 公用证书和安全密?nbsp;
什么时候该用LDAP存储数据
大多数的LDAP服务器都密集型的操作q行专门的优化。因此,当从LDAP服务器中d数据的时候会比从专门为OLTP优化的关pd数据库中d数据快一个数量。也是因Z门ؓȝ性能q行优化Q大多数的LDAP目录服务器ƈ不适合存储需要需要经常改变的数据。例如,用LDAP服务器来存储电话L是一个很好的选择Q但是它不能作ؓ电子商务站点的数据库服务器?nbsp;
如果下面每一个问题的{案都是“?#8221;Q那么把数据存在LDAP中就是一个好L?nbsp;
l 需要在Mq_上都能读取数据吗Q?nbsp;
l 每一个单独的记录Ҏ不是每一天都只有很少的改变?
l 可以把数据存在^面数据库Qflat databaseQ而不是关pd数据库中吗?换句话来_也就是不什么范式不式的Q把所有东襉K存在一个记录中Q差不多只要满W一范式Q?nbsp;
最后一个问题可能会唬住一些hQ其实用q面数据库去存储一些关pd的数据也是很一般的。例如,一条公司员工的记录可以包含经理的d名。用LDAP来存储这cM息是很方便的。一个简单的判断ҎQ如果可以把保数据存在一张张的卡片里Q就可以很容易地把它存在LDAP目录里?nbsp;
安全和访问控?nbsp;
LDAP提供很复杂的不同层次的访问控制或者ACI。因q些讉K可以在服务器端控Ӟq比用客L的Y件保证数据的安全可安全多了?nbsp;
用LDAP的ACIQ可以完成:
l l予用户改变他们自己的电话号码和家庭地址的权限,但是限制他们对其它数据(如,职务名称Q经理的d名,
{等Q只?#8220;只读”权限?nbsp;
l l予“HR-admins"l中的所有h权限以改变下面这些用L信息Q经理、工作名U、员工号、部门名U和部门受?nbsp;
但是对其它域没有写权限?nbsp;
l 止M人查询LDAP服务器上的用户口令,但是可以允许用户改变他或她自q口o?nbsp;
l l予l理讉K他们上的家庭电话的只读权限Q但是禁止其他h有这个权限?nbsp;
l l予“host-admins"l中的Q何h创徏、删除和~辑所有保存在LDAP服务器中的与计算Z机有关的信息
l 通过WebQ允?#8220;foobar-sales"l中的成员有选择地给予或止他们自己d一部分客户联系数据的读权限。这允总们把客户联系信息下蝲到本地的W记本电脑或个h数字助理QPDAQ上。(如果销售h员的软g都支持LDAPQ这非常有用)
l 通过WebQ允许组的所有者删除或d他们拥有的组的成员。例如:可以允许销售经理给予或止销售h员改变Web늚权限。也可以允许邮g假名Qmail aliaseQ的所有者不l过IT技术h员就直接从邮件假名中删除或添加用戗?#8220;公用”的邮件列表应该允许用户从邮g假名中添加或删除自己Q但是只能是自己Q。也可以对IP地址或主机名加以限制。例如,某些域只允许用户IP地址?92.168.200.*开头的有读的权限,或者用户反向查找DNS得到的主机名必须?.foobar.com?nbsp;
LDAP目录树的l构
LDAP目录以树状的层次l构来存储数据。如果你对自向下的DNS树或UNIX文g的目录树比较熟悉Q也很Ҏ掌握LDAP目录树这个概念了。就象DNS的主机名那样QLDAP目录记录的标识名QDistinguished NameQ简UDNQ是用来d单个记录Q以及回溯到树的剙。后面会做详l地介绍?nbsp;
Z么要用层ơ结构来l织数据呢?原因是多斚w的。下面是可能遇到的一些情况:
l 如果你想把所有的国客户的联pM息都“?#8221;C于到襉K囑֊公室Q负责营销Q的LDAP服务器上Q但是你不想把公司的资理信息“?#8221;到那里?nbsp;
l 你可能想Ҏ目录树的l构l予不同的员工组不同的权限。在下面的例子里Q资产管理组?#8220;asset-mgmt"部分有完全的讉K权限Q但是不能访问其它地斏V?nbsp;
l 把LDAP存储和复制功能结合v来,可以定制目录树的l构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每分钟更新的美国销售状늚信息Q但是欧z的销售情况就只要每小时更Cơ就行了?nbsp;
刨根问底Q基准DN
LDAP目录树的最剙是根,也就是所谓的“基准DN"。基准DN通常使用下面列出的三U格式之一。假定我在名为FooBar的电子商务公司工作,q家公司在Internet上的名字是foobar.com?o="FooBar, Inc.", c=US Q以X.500格式表示的基准DNQ?在这个例子中o=FooBar, Inc. 表示l织名,在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前,一般都用这U方式来表示基准DN。但是事物L在不断变化的Q现在所有的公司都已l(或计划)上Internet上。随着
Internet的全球化Q在基准DN中用国家代码很Ҏ让h产生h。现在,X.500格式发展成下面列出的两种格式?nbsp;
o=foobar.com
Q用公司的Internet地址表示的基准DNQ?nbsp;
q种格式很直观,用公司的域名作ؓ基准DN。这也是现在最常用的格式?nbsp;
dc=foobar, dc=com
Q用DNS域名的不同部分组成的基准DNQ?nbsp;
p上面那一U格式,q种格式也是以DNS域名为基的,但是上面那种格式不改变域名(也就更易读)Q而这U格式把域名Qfoobar.com分成两部?dc=foobar, dc=com。在理论上,q种格式可能会更灉|一点,但是对于最l用h说也更难记忆一炏V考虑一下foobar.comq个例子。当foobar.com和gizmo.com合ƈ之后Q可以简单的?#8220;dc=com"当作基准DN。把新的记录攑ֈ已经存在的dc=gizmo, dc=com目录下,q样q化了很多工作Q当Ӟ如果foobar.com和wocket.edu合ƈQ这个方法就不能用了Q。如果LDAP服务器是新安装的Q我你用这U格式。再h意一下,如果你打用活动目录(Actrive DirectoryQ,Microsoft已经限制你必M用这U格式?nbsp;
更上一层楼Q在目录树中怎么l织数据
在UNIX文gpȝ中,最层是根目录QrootQ。在根目录的下面有很多的文g和目录。象上面介绍的那PLDAP目录也是用同LҎl织h的?nbsp;
在根目录下,要把数据从逻辑上区分开。因为历史上QX.500Q的原因Q大多数LDAP目录用OU从逻辑上把数据分开来。OU
表示“Organization Unit"Q在X.500协议中是用来表示公司内部的机构:销售部、胦务部Q等{。现在LDAPq保留ou=q样的命名规则,但是扩展了分cȝ范围Q可以分cMؓQou=people, ou=groups, ou=devicesQ等{。更低一U的OU有时用来做更l的归类。例如:LDAP目录树(不包括单独的记录Q可能会是这LQ?nbsp;
dc=foobar, dc=com
ou=customers
ou=asia
ou=europe
ou=usa
ou=employees
ou=rooms
ou=groups
ou=assets-mgmt
ou=nisgroups
ou=recipes
单独的LDAP记录
DN是LDAP记录的名字
在LDAP目录中的所有记录项都有一个唯一?#8220;Distinguished Name"Q也是DN。每一个LDAP记录的DN是由两个部分l成的:相对DNQRDNQ和记录在LDAP目录中的位置?nbsp;
RDN是DN中与目录树的l构无关的部分。在LDAP目录中存储的记录w要有一个名字,q个名字通常存在cnQCommon NameQ这个属性里。因为几乎所有的东西都有一个名字,在LDAP中存储的对象都用它们的cng为RDN的基。如果我把最喜欢的吃燕麦_食谱存Z个记录,我就会用cn=Oatmeal Deluxe作ؓ记录的RDN?nbsp;
l 我的LDAP目录的基准DN是dc=foobar,dc=com
l 我把自己的食׃为LDAP的记录项存在ou=recipes
l 我的LDAP记录的RDN设ؓcn=Oatmeal Deluxe
上面q些构成了燕麦粥食谱的LDAP记录的完整DN。记住,DN的读法和DNSL名类伹{下面就是完整的DNQ?nbsp;
cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com
举一个实际的例子来说明DN
现在为公司的员工讄一个DN。可以用Zcn或uidQUser IDQ,作ؓ典型的用户帐受例如,FooBar的员工Fran Smith Q登录名QfsmithQ的DN可以Z面两U格式:
uid=fsmith,ou=employees,dc=foobar,dc=com
Q基于登录名Q?nbsp;
LDAPQ以及X.500Q用uid表示“User ID"Q不要把它和UNIX的uidh淆了。大多数公司都会l每一个员工唯一的登录名Q因此用q个办法可以很好C存员工的信息。你不用担心以后q会有一个叫Fran Smith的加入公司,如果Fran改变了她的名字(l婚Q离婚?或宗教原因?Q,也用不着改变LDAP记录的DN?nbsp;
cn=Fran Smith,ou=employees,dc=foobar,dc=com
Q基于姓名)
可以看到q种格式使用了Common NameQCNQ。可以把Common Name当成一个h的全名。这U格式有一个很明显的缺点就是:如果名字改变了,LDAP的记录就要从一个DN转移到另一个DN。但是,我们应该可能地避免改变一个记录项的DN?nbsp;
定制目录的对象类?nbsp;
你可以用LDAP存储各种cd的数据对象,只要q些对象可以用属性来表示Q下面这些是可以在LDAP中存储的一些信息:
l 员工信息Q员工的姓名、登录名、口令、员工号、他的经理的d名,邮g服务器,{等?nbsp;
l 物品跟踪信息Q计机名、IP地址、标{、型受所在位|,{等?nbsp;
l 客户联系列表Q客L公司名、主要联pMh的电话、传真和电子邮gQ等{?nbsp;
l 会议厅信息:会议厅的名字、位|、可以坐多少人、电话号码、是否有投媄机?nbsp;
l 食谱信息Q菜的名字、配料、烹调方法以及准备方法?nbsp;
因ؓLDAP目录可以定制成存储Q何文本或二进制数据,到底存什么要׃自己军_。LDAP目录用对象类型(object classesQ的概念来定义运行哪一cȝ对象使用什么属性。在几乎所有的LDAP服务器中Q你都要Ҏ自己的需要扩展基本的LDAP目录的功能,创徏新的对象cd或者扩展现存的对象cd?nbsp;
LDAP目录以一pd“属性对”的Ş式来存储记录,每一个记录项包括属性类型和属性|q与关系型数据库用行和列来存取数据有Ҏ的不同)。下面是我存在LDAP目录中的一部分食谱记录Q?nbsp;
dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com
cn: Instant Oatmeal Deluxe
recipeCuisine: breakfast
recipeIngredient: 1 packet instant oatmeal
recipeIngredient: 1 cup water
recipeIngredient: 1 pinch salt
recipeIngredient: 1 tsp brown sugar
recipeIngredient: 1/4 apple, any type
h意上面每一U配料都作ؓ属性recipeIngredient倹{LDAP目录被设计成象上面那样ؓ一个属性保存多个值的Q而不是在每一个属性的后面用逗号把一pd值分开?nbsp;
因ؓ用这L方式存储数据Q所以数据库有很大的灵zL,不必为加入一些新的数据就重新创徏表和索引。更重要的是QLDAP目录不必p内存或硬盘空间处?#8220;I?#8221;域,也就是说Q实际上不用可选择的域也不会花费你M资源?nbsp;
作ؓ例子的一个单独的数据?nbsp;
让我们看看下面这个例子。我们用Foobar, Inc.的员工Fran Smith的LDAP记录。这个记录项的格式是LDIFQ用来导入和导出LDAP目录的记录项?nbsp;
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
mailRoutingAddress: fsmith@foobar.com
mailhost: mail.foobar.com
userpassword: {crypt}3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
属性的值在保存的时候是保留大小写的Q但是在默认情况下搜索的时候是不区分大写的。某些特D的属性(例如QpasswordQ在搜烦的时候需要区分大写?nbsp;
让我们一点一点地分析上面的记录项?nbsp;
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
q是Fran的LDAP记录的完整DNQ包括在目录树中的完整\径。LDAPQ和X.500Q用uidQUser IDQ,不要把它和UNIX的uidh淆了?nbsp;
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
可以ZQ何一个对象根据需要分配多个对象类型。person对象cd要求cnQcommon nameQ和snQsurnameQ这两个域不能ؓI。persion对象cd允许有其它的可选域Q包括givenname、telephonenumberQ等{。organizational Personlperson加入更多的可选域QinetOrgPerson又加入更多的可选域Q包括电子邮件信息)。最后,foobarPerson是ؓFoobar定制的对象类型,加入了很多定制的属性?nbsp;
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
以前说过了,uid表示User ID。当看到uid的时候,在脑袋里想一?#8220;login"?nbsp;
h意CN有多个倹{就象上面介l的QLDAP允许某些属性有多个倹{ؓ什么允许有多个值呢Q假定你在用公司的LDAP服务器查找Fran的电话号码。你可能只知道她的名字叫FranQ但是对人力资源处的人来说她的正式名字叫做Frances。因Z存了她的两个名字Q所以用M一个名字检索都可以扑ֈFran的电话号码、电子邮件和办公戉KP{等?nbsp;
mailRoutingAddress: fsmith@foobar.com
mailhost: mail.foobar.com
p现在大多数的公司都上|了QFoobar用Sendmail发送邮件和处理外部邮g路由信息。Foobar把所有用L邮g信息都存在LDAP中。最新版本的Sendmail支持q项功能?nbsp;
Userpassword: {crypt}3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
gecos: Frances Smith
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
注意QFoobar的系l管理员把所有用L口o映射信息也都存在LDAP中。FoobarPersoncd的对象具有这U能力。再注意一下,用户口o是用UNIX的口令加密格式存储的。UNIX的uid在这里ؓuidnumber。提醒你一下,关于如何在LDAP中保存NIS信息Q有完整的一份RFC。在以后的文章中我会谈一谈NIS的集成?nbsp;
LDAP复制
LDAP服务器可以用基?#8220;?#8221;或?#8220;?#8221;的技术,用简单或Z安全证书的安全验证,复制一部分或者所有的数据?nbsp;
例如QFoobar有一?#8220;公用?#8221;LDAP服务器,地址为ldap.foobar.comQ端口ؓ389。Netscape Communicator的电子邮件查询功能、UNIX?#8220;ph"命o要用到这个服务器Q用户也可以在Q何地Ҏ询这个服务器上的员工和客戯pM息。公司的主LDAP服务器运行在相同的计机上,不过端口h1389?nbsp;
你可能即不想让员工查询资产管理或食谱的信息,又不惌信息技术h员看到整个公司的LDAP目录。ؓ了解册个问题,Foobar有选择地把子目录树从主LDAP服务器复制到“公用”LDAP服务器上Q不复制需要隐藏的信息。ؓ了保持数据始l是最新的Q主目录服务器被讄成即?#8220;?#8221;同步。这些种Ҏ主要是ؓ了方便,而不是安全,因ؓ如果有权限的用户x询所有的数据Q可以用另一个LDAP端口?nbsp;
假定Foobar通过从奥克兰到欧z的低带宽数据的q接用LDAP理客户联系信息。可以徏立从ldap.foobar.com:1389到munich-ldap.foobar.com:389的数据复Ӟ象下面这P
periodic pull: ou=asia,ou=customers,o=sendmail.com
periodic pull: ou=us,ou=customers,o=sendmail.com
immediate push: ou=europe,ou=customers,o=sendmail.com
“?#8221;q接?5分钟同步一ơ,在上面假定的情况下够了?#8220;?#8221;q接保证MƧ洲的联pM息发生了变化?nbsp;
立即?#8220;?#8221;到Munich?nbsp;
用上面的复制模式Q用户ؓ了访问数据需要连接到哪一台服务器呢?在Munich的用户可以简单地q接到本地服?nbsp;
器。如果他们改变了数据Q本地的LDAP服务器就会把q些变化传到主LDAP服务器。然后,主LDAP服务器把q些变化
“?#8221;回本地的“公用”LDAP服务器保持数据的同步。这Ҏ地的用户有很大的好处Q因为所有的查询Q大多数是读Q都在本地的服务器上q行Q速度非常快。当需要改变信息的时候,最l用户不需要重新配|客L的YӞ因ؓLDAP目录服务器ؓ他们完成了所有的数据交换工作?
]]>
2Q?Q? Netscape Directory Server 4.12 的安?br />
插入“PowerPlay Enterprise Server Supplementary Software”安装盘,q行光盘上的Netscape\Directory Server\NT\d412eiu.exe?br />
如果在安装过E中提示域名错误Q则需要按照以下步骤纠正此错误。具体操作步骤如下:用右键单?#8220;我的电脑”Q单?#8220;属?#8221;Q单?#8220;|络标识”标签Q单?#8220;属?#8221;Q单?#8220;其它”Q添?#8220;此计机的主DNS后缀”?br />
详见《PowerPlay Enterprise Server Installation and Configuration Guide》page 153?br />
2Q?Q? Netscape Directory Server 的配|?br />
插入“PowerPlay Enterprise Server”安装盘,在AutoRun的安装选择对话框中选择“Configure a Directory Server”q行安装?br />
在Directory Servercd中,选择“Netscape 3.X/4”Q?br />
在Directory Server配置对话框中Q输?#8220;Directory Server Computer”Q?#8220;Password”Q?#8220;Base Distinguished Name(DN)”?#8220;Organization”的信息,其余可用~省信息。其中,?#8220;Directory Server Computer”中,输入LDAP服务器(本机Q的机器名,?#8220;Base Distinguished Name(DN)”中可输入“o=gdb”Q在“Organization”中可输入“gdb”?br />
详见《PowerPlay Enterprise Server Installation and Configuration Guide》page 60?br />
2Q? Impromptu Web Reports 6.0的安装和配置
插入“Impromptu Web Reports”安装盘,在AutoRun的安装选择对话框中选择“Install Cognos Impromptu Web Reports”完成安装?br />
2Q?Q? Data Store 的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“Data Store”q行安装Q?br />
在创建data store存放位置的画面,单击“+”创徏一个新的共享名Q徏议在“share name”中输?#8220;iwr_db”Q在“path”中输?#8220;<drive letter>:\program files\cognos\cer1\database”?br />
详见《Impromptu Web Reports Installation and Configuration》page 43?br />
2Q?Q? Impromptu Web Reports Server 的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“Server”q行安装?br />
详见《Impromptu Web Reports Installation and Configuration》page 46?br />
备注Q安装过E会提示输入windowspȝ中安装此产品的用L密码。此Ӟ输入登陆windows用户密码。需要注意的是:以后如果理员更改该用户的密码后Q必M在服?#8220;理工具Q?gt;服务”中修改两Ҏ务:Cognos Communication Service (cer1)和Impromptu Web Service Manager (CER1)中的登陆用户的密码,否则服务无法启动?br />
2Q?Q? GateWay 的安?br />
在安装方式中选择“custom”安装Q在安装部g选择对话框中选择“GateWay”q行安装?br />
详见《Impromptu Web Reports Installation and Configuration》page 51?br />
2Q?Q? Impromptu Web Reports Administration、IWR Samples、IWR Online Books的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“IWR Administration”?#8220;IWR Samples”?#8220;IWR Online Books”q行安装?br />
详见《Impromptu Web Reports Installation and Configuration》page 31、page 57?br />
2Q? PowerPlay Enterprise Server 6.6的安?br />
插入“PowerPlay Enterprise Server”安装盘,在AutoRun的安装选择对话框中选择“Install Cognos PowerPlay Enterprise Server 6.6”完成安装?br />
2Q?Q? Access Manager Admin Tools、Access Manager Trusted Signon SDK、Common Logon Server 、Ticket Server的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“Access Manager Admin Tools”Q不选择“Configure a Directory Server”Q?#8220;Access Manager Trusted Signon SDK”?#8220;Common Logon Server” ?#8220;Ticket Server”q行安装?br />
2Q?Q? 配置Access Manager Administration
按照以下步骤Q完成Access Manager Administration的配|?br />
1) 启动Access Manager AdministrationQ?br />
2) ?#8220;Authentication Information”面板中,单击“Directory Servers”文g夹;
3) ?#8220;Action”菜单中,单击“Add Connection”Q?br />
4) ?#8220;General”标签中,输入“Host”?#8220;Base Distinguished Name”的内容,其余的输入项用缺省倹{在“Host”输入中输入LDAP服务器的机器名,?#8220;Base Distinguished Name”中输入LDAP服务器中的配|,例如o=gdb,c=cnQ单?#8220;Test”Q如果出?#8220;the directory server is responding”的信息,则表明测试正;
5) 单击“Runtime Credentials”标签Q在“Runtime Administrator Distinguished Name(DN)”中,输入登陆到目录服务器的用户名Q例如Directory ManagerQ在“Runtime Administrator Password”中,输入用户的密码,单击“Log On”Q再单击“Test”Q如果出?#8220;the credentials are valid”的信息,则表明测试正;
6) 单击“Ticket Server”标签Q单?#8220;Test”Q如果出?#8220;the ticket server is responding”的信息,则表明测试正?br />
详见《Impromptu Web Reports Installation and Configuration》page 41?br />
2Q?Q? 配置Access Manager Configuration
按照以下步骤Q完成Access Manager Configuration的配|?br />
1) 启动Access Manager Configuration WizardQ?br />
2) 在第一个窗口单?#8220;下一?#8221;Q?br />
3) 单击“Custom”Q再单击“下一?#8221;Q?br />
4) 选择“Directory Server Configuration”Q再单击“下一?#8221;Q?br />
5) 在对话框中输入以下信息:
HostQ输入LDAP服务器的机器名字
Base Distinguished Name(DN)Q输入LDAP服务器中的配|,例如o=gdb,c=cn
假如在对话框的底部出?#8220;directory server is responding”的信息,则表明配|正;
6) 单击“下一?#8221;Q?br />
7) 选择“(Use the Directory Server Default Namespace)”Q在单击“下一?#8221;Q?br />
8) 选择“Directory Server”Q作为缺省的验证源,在单?#8220;下一?#8221;Q?br />
9) 选择“Accept The Setting”Q再单击“完成”Q?br />
10) 关闭Access Manager Configuration Wizard?br />
详见《Impromptu Web Reports Installation and Configuration》page 49?br />
2Q?Q? PowerPlay Enterprise Server、PowerPlay Enterprise Server Administration 的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“PowerPlay Enterprise Server”?#8220;PowerPlay Enterprise Server Administration”q行安装?/p>
建立Web Server ?#8220;cognos”?#8220;cognos/cgi-bin”?#8220;cognos/help”?#8220;cognos/ppwb” 4个虚拟目录,一般情况下Q?#8220;cognos”?#8220;cognos/cgi-bin”?#8220;cognos/help”q?个虚拟目录已l在安装q程中徏立,实际上,pȝ理员只需要手工徏?#8220;cognos/ppwb”q个虚拟目录?br />
建立“cognos/ppwb”虚拟目录的步骤如下:
1) 在Windows 2000中,单击“开?#8221;?#8220;讄”?#8220;控制面板”Q双?#8220;理工具”Q双?#8220;Internet服务理?#8221;Q?br />
2) 在左辚w板中Q展开“Internet信息服务”Q再展开以本服务器的机器名ؓ名字的文件夹Q?br />
3) 展开“默认web站点”Q再展开“cognos”文g夹;
4) 用右键单?#8220;cognos”Q单?#8220;新徏”Q再单击“虚拟目录”Q?br />
5) 单击“下一?#8221;Q?br />
6) 输入虚拟目录别名“ppwb”Q单?#8220;下一?#8221;Q?br />
7) 在目录中输入“<driver letter>:\program files\cognos\cer1\webcontent\ppwb”Q单?#8220;下一?#8221;Q?br />
8) 只选取“d”权限Q单?#8220;下一?#8221;Q?br />
9) 单击“完成”?br />
其余三个虚拟目录的设|列表如下:
虚拟目录别名 目录 权限
cognos \program files\cognos\cer1\webcontent ?br />
cognos/cgi-bin \program files\cognos\cer1\cgi-bin 执行
cognos/help \program files\cognos\cer1\documentation\html ?br />
详见《PowerPlay Enterprise Server Installation and Configuration Guide》page 110?br />
2Q?Q? Upfront、Upfront Server Administration 的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“Upfront”?#8220;Upfront Server Administration”q行安装?br />
2Q? mpromptu 6.0 Admin Edtion的安?br />
插入“Impromptu 6.0 Administrator Edition”的安装盘Q在AutoRun的安装选择对话框中选择“Install Impromptu 6.0 Administrator Edition”完成安装?br />
Impromptu Administratior、User Define Functions、PowerPrompts 的安?br />
在安装方式中选择“custom”安装Q在安装lg选择对话框中选择“Impromptu Administrator”?#8220;User Define Functions”?#8220;PowerPrompts”q行安装?br />
2Q? Cognos Distribute Shuttle Builder的安?br />
插入“Impromptu 6.0 Administrator Edition”的安装盘Q在AutoRun的安装选择对话框中选择“Cognos Distribute Shuttle Builder”q行安装?br />
详见《Impromptu Web Reports Installation and Configuration》page 23?br />
2Q? PowerPlay Transformer Server 6.61的安?br />
插入“PowerPlay Transformer Server 6.6”的安装盘Q在AutoRun的安装选择对话框中选择“PowerPlay Transformer Server 6.61”q行安装?br />
在安装方式中选择“custom”安装Q在安装lg对话框中选择“PowerPlay for Windows”?#8220;PowerPlay for Excle、PowerPlay Transformer”?#8220;Schedule”?#8220;CognosScript Editor”q行安装?br />
2Q? Adobe Acrobat Reader 的安?/p>
插入“Impromptu Web Reports”的安装盘Q运行光盘中?#8220;\Adobe\chsfont.exe”?br />
2Q? ȀzImpromptu Web Reports 的Report Server
启动Server AdministrationQ展开“Report Servers”Q单击要Ȁzȝ服务器,?#8220;Actions”菜单中选择“Enable”Q激zȝ应的 Report Server?br />
2Q? 在Upfront中添加server
启动Upfront Server AdministrationQ从“Server”菜单中选择“Add Server”Q输入服务器的名字,单击“ok”?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/s_sword/archive/2007/05/18/1614796.aspx
]]>
比如Q?br /> [root@localhost ~]# cat /etc/fstab
1.0 cat 语法l构Q?br />
cat [选项] [文g]...
选项
-A, --show-all {h?-vET
-b, --number-nonblank 寚wI~号
-e {h?-vE
-E, --show-ends 在每行结束处昄 $
-n, --number 对输出的所有行~号
-s, --squeeze-blank 不输出多行空?br />
-t ?-vT {h
-T, --show-tabs 蟩格字W显CZؓ ^I
-u (被忽?
-v, --show-nonprinting 使用 ^ ?M- 引用Q除?LFD ?TAB 之外
--help 昄此帮助信息ƈd
1.1 cat 查看文g内容实例Q?/span>
当前全球有数百万的开发h员在使用微Y?NET技术。如果你是其中之一Q或者想要成为其中之一的话Q我下面要列出的每一个站炚w应该是你的最爱,都应该收藏到书签中去?/p>
对于不熟?NET技术的朋友Q需要说明一下,.NET提供了一个^台和一些相应的工具Q编Eh员可以用它们来在开发Windows桌面Q互联网Q甚x手持Ud讑֤上构建极富交互性的应用。很有可能你最喜欢的网站之一是用微软的ASP.NET技术构建的?/p>
q些q来我在q个站点下蝲了数不清的代码。该站点中的快速有效的文章都是q正的开发h员撰写的Q他们可以给你关于特定编E问题的直接帮助Q而文章中L会包含一个代码下载的链接?/p>
提交文章和代码的开发h员不会得CQ何报酬,他们只是Z得到C的认同。这个站点不仅包?NET和Windowsq_的内容,所以对于想要扩展自q技术视野的开发h员来_q儿也是个很好的d?/p>
DotNetNuke是一个开源的框架Q开发h员可以下载它q用它来构徏自己的ASP.NET|络应用。如果你是一?NET开发h员而你q没有下载过q些代码来读一ȝ话,你真的需要马上去下蝲它了?/p>
此Y件最q几q已l经q了数次q代q被证实其中含有很多最有效率的~码最佛_c尽此站点有一个收费的专业版,但是仍然有一个可以免费下载的C版本Q而在该站点免Ҏ册来获得下蝲途径也是非常值得的?/p>
如果你是一名web开发h员的话,老实_多数.NET开发h员都是,那么q个站点你一定要讉K。此站点包含有你需要了解的关于ASP.NET的各斚w的文章,甚至q包含有很多针对ASP开发者的信息Q信不信׃Q仍然有很多开发h员在使用ASPQ?/p>
多年来,我已l通过阅读此站点的论坛的帖子解决了无数的问题?/p>
你从上图可以看出来Q这个在U开发杂志是由微软提供的Q不q请别因此而心怀成见。我强烈订阅此站点的免费每周新闻时讯Q它可以让你最快速的了解C微Y传出来的大事情?/p>
你也应该讉K一?a title="DevLife" target="_blank">DevLife 论坛?/p>
q是另一个在U开发杂志,它ƈ不仅仅关注于微Y的技术,它們于展CZ些很有趣的非L的技术?/p>
我本人曾l给他们写过几篇文章Q因Z们是为数不多的几安要关于机器h学和演讲技术的|站之一。此站点每天的文章覆盖了从传l的.NET到VB开发的所有内宏V?/p>
MSDN Magazine之于开发h员就相当于《自然》杂志之于科学家。它包含了所有开发h员都应该遵守的标准。他们非怸格地选取内容。它所包含的文章比我上面提到的站点的文章都要长而且通常更有深度。你可以在打C前很肯定的知道这些文章都是经q了_挑l选的?/p>
喜欢看很L技术的视频的朋友们一定要看看q个微Y资源的站炏VChannel 9的团队经常在微Y园区中采访很多开发团队ƈ会时帔R露一些最新的软g和技术的讯息?/p>
不仅仅是采访微Y的工作h员,Channel 9也会和微软之外的行业权威对话?/p>
Scott Guthrie是微软的开发工L企业副总裁Q他的博客经常更斎ͼ上面会有一些别处看不到的公告?/p>
Scott的博客内容覆盖从.NET基础cd到Silverlight的所有内宏V如果你惌让你朋友惊讶于你g和微软有某些内线联系的话Q那p问这个博客吧?/p>
数据库由一个或多个表组成,数据库中所有表之间的关pȝUCؓ数据?span class="italic">模式。虽然有许多不同的模式设计,但是用于查询历史数据的数据库通常被设|ؓhl模式设计(通常是星型模式或雪花模式Q。采用维模式既有许多历史斚w的原因也有许多实跉|面的原因Q但是,它们在决{支持关pL据库斚w的应用的增长是由两项主要的益处推动的Q?/p>
l模式在物理上将用于量化业务的量度(也称?span class="italic">事实Q与用于描述业务和对业务q行分类的描q性元素(也称?span class="italic">l?/span>Q分隔开。DB2 Alphablox 多维体要求底层数据库使用l模式;卻I在物理上必须事实数据与l数据分隔开Q至位于不同的列中Q。通常Q维模式h星型模式形式、雪花模式Ş式或者这两种模式的某U合Ş式。尽不是常见的情况Q但l模式也可以h单个表的形式Q即事实和维仅仅是位于表的不同的列中?/p>
本节描述星型模式和雪花模式以及在q些模式中表CZ务层ơ结构的方式。包括下列各节:
要彻底了解维模式设计及其所有分支的背景信息Q请阅读?Ralph Kimball ~著q由 John Wiley and Sons, Inc. 出版?The Data Warehouse Toolkit?/p>
星型模式和雪花模式设计是用来事实和l分隔到不同的表中的机制。雪花模式将层次l构的不同别进一步分隔到不同的表中。在M一U模式设计中Q每个表都通过主键Q外键关p?/span>与另一表相兟뀂在关系数据库中Q用主键/外键关系来定义各个表之间的多对一关系?/p>
主键是表中的一个列或一l列Q它们的值唯一地标识表中的一行。关pL据库设计成通过仅允许表中的一行具有给定的主键值来强制实施主键的唯一性?/p>
外键是表中的一个列或一l列Q它们的g另一个表中的主键值相对应。ؓ了添加具有给定外键值的行,在相关的表中必须存在h相同主键值的行?/p>
在星型模式或雪花模式中,表之间的主键Q外键关p(有时UCؓ多对一关系Q表C?RDBMS 中将相关的表q接CL路径。这些连接\径是形成对历史数据执行的查询的基。要了解有关多对一关系的更多信息,请参?a >多对一关系?/p>
事实?/span>是星型模式或雪花模式中的一个表Q它存储用于量度业务Q如销售量、商品成本或利润Q的事实。事实表q包含指向维表的外键。这些外键事实表中的每个数据行与其对应的维和别相兟?/p>
l表是星型模式或雪花模式中的一个表Q它存储用来描述l的各个斚w的属性。例如,旉表存储时间的各个斚wQ如q䆾、季度、月份和天。事实表的外键引用多对一关系中的l表的主键?/p>
下图昄了具有单个事实表?4 个维表的星型模式。星型模式可以具有Q意数目的l表。用于连接表的链接末分叉指示了事实表与每个维表之间的多对一关系?/p>
下图昄了具有两个维的雪花模式,其中Q每个维都具?3 个别。雪花模式可以具有Q意数目的l_q且每个l可以具有Q意数目的U别?/p>
要了解有关维的不同别如何Ş成层ơ结构的详细信息Q请参阅层次l构?/p>
层次l构是一l相互之间具有多对一关系的别,q且q一l别共同构成维。在关系数据库中Q层ơ结构的不同U别既可以存储在单个表中Q如在星型模式中Q,也可以存储在不同的表中(如在雪花模式中)?/p>
多对一关系是指一个实体(通常是一个列或一l列Q包含的值引用另一个具有唯一值的实体Q一个列或一l列Q。在关系数据库中Q这些多对一关系通常是由外键Q主键关pd制实施的Qƈ且,q些关系通常是事实表与维表之间以及层ơ结构中的别之间的关系。此关系通常用来描述分类或分l。例如,在具有表 Region?span class="italic">State 层次l构的不同元素(即别)在子代别与父代U别之间必须h多对一关系Q而无层次l构在物理上是以星型模式q是以雪花模式表C的Q即Q数据必遵守这些关pR强制实施多对一关系所需的干净数据是维模式的一w要特征。此外,q些关系使得有可能根据关pL据创?DB2 Alphablox 多维体?br />
主键
外键
事实?/h4>
l表
星型模式
雪花模式
层次l构
多对一关系
http://publib.boulder.ibm.com/db2blox/82/zh_cn/cube/cube13.htm
]]>
SQL Server的安全机制及DBA如何理
作?j14n 旉/2006-11-16 11:26:00 cd/黑客攻防
标签Q?/td>
一 安全体系
d、安全̎P用户Q、角色和l是 Microsoft? SQL Server? 2000 安全机制的基。连接到 SQL Server 的用户必M用特定的d标识W?nbsp;(ID) 标识自己。因此,用户只能查看l授权可以查看的表和视图Qƈ且只能执行经授权可以执行的存储过E和理功能。在SQL Server中,loginQ登录)是用于进入服务器时进行n份识别的Q每个user和login相关联,保证能进入服务器Q每个user属于各个roleQ拥有相应的数据库权限,整个体系如图Q?nbsp;
?nbsp;pȝ存储q程和命?br />
1、存储过E:
dQ?nbsp; sp_grantlogin, sp_revokelogin, sp_denylogin
sp_addlogin, sp_droplogin
sp_helplogins
用户Q?nbsp; sp_grantdbaccess, sp_revokedbaccess
sp_adduser, sp_dropuser (q两个SP是ؓ了向后兼容,请用前2个代?
sp_helpuser
角色Q?nbsp;
服务器角?nbsp; sp_addsrvrolemember, sp_dropsrvrolemember
数据库角?nbsp; sp_addrole, sp_droprole
sp_addapprole, sp_dropapprole
sp_helprole
sp_addrolemember, sp_droprolemember
sp_helprolemember
2、命令:grant, revoke, deny
?nbsp;固定角色
1、固定服务器角色Q?br />
固定服务器角?br />
描述
sysadmin 可以?nbsp;SQL Server 中执行Q何活?nbsp;
serveradmin 可以讄服务器范围的配置选项Q关闭服务器
setupadmin 可以理链接服务器和启动q程
securityadmin 可以理d?nbsp;CREATE DATABASE 权限Q还可以d错误日志和更改密?nbsp;
processadmin 可以理?nbsp;SQL Server 中运行的q程
dbcreator 可以创徏、更改和除去数据?nbsp;
diskadmin 可以理盘文g
bulkadmin 可以执行 BULK INSERT 语句
2、固定数据库角色Q?br />
固定数据库角?br />
描述
db_owner 在数据库中有全部权限
db_accessadmin 可以d或删除用?nbsp;ID
db_securityadmin 可以理全部权限、对象所有权、角色和角色成员资格
db_ddladmin 可以发出 ALL DDLQ但不能发出 GRANT、REVOKE ?nbsp;DENY 语句
db_backupoperator 可以发出 DBCC、CHECKPOINT ?nbsp;BACKUP 语句
db_datareader 可以选择数据库内M用户表中的所有数?nbsp;
db_datawriter 可以更改数据库内M用户表中的所有数?nbsp;
db_denydatareader 不能选择数据库内M用户表中的Q何数?nbsp;
db_denydatawriter 不能更改数据库内M用户表中的Q何数?nbsp;
?nbsp;权限
包括两种cd的权限,卛_象权限和语句权限Q?br />
对象操作权限ȝ
?nbsp;SELECT, INSERT, UPDATE, DELETE, REFERENCE
视图 SELECT, UPDATE, INSERT, DELETE
存储q程 EXECUTE
函数 表值函?nbsp;SELECT, INSERT, UPDATE, DELETE, REFERENCE
标量值函?nbsp;EXECUTE ?nbsp;REFERENCES
内嵌表函?nbsp;EXECUTE ?nbsp;REFERENCES
?nbsp;SELECT, UPDATE
注意QREFERENCE充许在GRANT、DENY、REVOKE语句中向有外键参照表中插入一行数据?br />
语句权限ȝ
CREATE DATABASE 创徏数据?nbsp;
CREATE TABLE 创徏?nbsp;
CREATE VIEW 创徏视图
CREATE RULE 创徏规则
CREATE DEFAULT 创徏~省
CREATE PROCEDURE 创徏存储q程
BACKUP DATABASE 备䆾数据?nbsp;
BACKUP LOG 备䆾事务日志
?nbsp;实用脚本
在sql server中,d到某数据库必L两个条gQ?nbsp;
1、ؓSQL Server建立一个loginQ?br />
2、ؓ该login在数据库中徏立userQ给该用户关联role
/* DBA 的新增登录授权脚?/
USE my_database
GO
--1. 新徏d
IF NOT EXISTS(SELECT 1 FROM master.dbo.syslogins WHERE name = 'wh_login' AND loginname = N'wh_login')
EXEC sp_addlogin 'wh_login', '123', 'plm25'
GO
--2. 新徏用户
IF NOT EXISTS(SELECT * FROM sysusers WHERE name = N'lewis_user')
EXEC sp_grantdbaccess 'wh_login', 'lewis_user'
GO
--3. 分配权限
--语句权限
GRANT CREATE TABLE TO lewis_user
--对象权限
GRANT SELECT ON fb_app_module TO lewis_user
--授予所有权?br />
GRANT ALL TO lewis_user
--4. 授予角色
EXEC sp_addrolemember N'db_datareader', N'lewis_user'
EXEC sp_addrolemember N'db_datawriter', N'lewis_user'
EXEC sp_addrolemember N'db_accessadmin', N'lewis_user'
EXEC sp_addrolemember N'db_ddladmin', N'lewis_user' --建立存储q程权限
--5. 更改d的默认数据库
EXEC sp_defaultdb @loginame = N'login', @defdb = N'default_DB_name'
--6. 更改d的默认语a
EXEC sp_defaultlanguage @loginame = N'login', @language = N' french'
/*DBA 的删除登录授权脚?/
--1. 拒绝授权
REVOKE SELECT ON [dbo].[fb_app_module] TO [lewis_user] CASCADE
REVOKE CREATE TABLE TO lewis_user
EXEC sp_droprolemember N'db_datareader', N'lewis_user'
--不能更改 public 角色的成员资根{也不需要移除?br />
--2. 删除用户
IF EXISTS(SELECT * FROM sysusers WHERE name = N'lewis')
EXEC sp_revokedbaccess 'lewis_user'
GO
--3. 删除d
IF EXISTS(SELECT 1 FROM master.dbo.syslogins WHERE name = 'wh_login' AND loginname = N'wh_login')
EXEC sp_droplogin 'wh_login'
GO
/*DBA 的查看授权脚?/
--1、查看服务器的登?br />
sp_helplogins 查看login和user
SELECT * FROM master.dbo.syslogins WHERE loginname = @login_name
--2、查看数据库的用?br />
sp_helpuser
SELECT * FROM dbo.sysusers where issqlrole = 1 /*数据库角?/
SELECT * FROM dbo.sysusers where islogin = 1 /*d*/
SELECT * FROM dbo.sysusers where issqluser = 1 /*SQL Server用户*/
SELECT * FROM dbo.sysusers where isntname = 1 /*NT用户*/
SELECT * FROM dbo.sysusers where isapprole = 1 /*服务器角?/
--3、查看用h什么权限和角色????
sp_helprolemember 'db_datareader'
--4、用h有的数据库中的对????
--5、查看用戗登录、角色等l合信息
select DISTINCT username = o.name,
loginname = (case when (o.sid = 0x00) then NULL
else l.loginname end),
rolegroup = user_name(o.gid),
userID = o.uid,
o.hasdbaccess,
o.uid
from dbo.sysusers o left join master.dbo.syslogins l on l.sid = o.sid
where ((o.issqlrole != 1 and o.isapprole != 1) or (o.sid = 0x00) and o.hasdbaccess = 1)
and o.isaliased != 1 and (o.name = N'@your_user_name')
?nbsp;CZ
-- ===================================================
-- Procedure Name: fb_plm_access_control
-- Function : set PLM Suite application user
-- Failure return: 1
-- Success return: 0
--
-- Parameters :
-- @login_name : application user name, create a account if the user does not exists, otherwise remain it.
-- @password : for the exists user, if the password is null, then remain its old password,
-- : for the new user, it can not be null.
-- @db_name : PLM Suite database name
-- ===================================================
IF EXISTS (select * from sysobjects where id = object_id(N'fb_plm_access_control') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE fb_plm_access_control
GO
CREATE PROCEDURE fb_plm_access_control
(
@login_name NVARCHAR(100),
@password NVARCHAR(100) = null,
@db_name NVARCHAR(100)
)
--WITH ENCRYPTION
AS
DECLARE @result INT
DECLARE @user_exists INT
DECLARE @execute_sp_role NVARCHAR(100)
DECLARE @create_table_role NVARCHAR(100)
DECLARE @object_name NVARCHAR(120)
DECLARE @object_type NVARCHAR(10)
DECLARE @sql VARCHAR(200)
DECLARE @error_msg VARCHAR(100)
BEGIN
-- check input paramters.
IF (@login_name IS NULL) OR (LTRIM(@login_name) = '') OR (lower(@login_name) = 'sa')
BEGIN
RAISERROR ('The login_name can not be null or sa.' , 16, 1) WITH NOWAIT
RETURN 1
END
IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = @db_name)
BEGIN
SET @error_msg = 'The database ' + @db_name + ' does not exits.'
RAISERROR (@error_msg, 16, 1) WITH NOWAIT
RETURN 1
END
-- if user does not exits, create it
IF NOT EXISTS (SELECT * FROM master.dbo.syslogins WHERE loginname = @login_name)
BEGIN
SET @user_exists = 0
IF (@password IS NULL) OR (@password = '')
BEGIN
RAISERROR ('For new application user, the password can not be null.' , 16, 1) WITH NOWAIT
RETURN 1
END
EXEC sp_addlogin @loginame = @login_name, @passwd = @password, @defdb = @db_name, @deflanguage = @@language
IF @@ERROR <> 0
RETURN 1
END
ELSE
BEGIN
SET @user_exists = 1
IF (@password IS NOT NULL) AND (LTRIM(@password)<>'')
BEGIN
EXEC sp_password @old = null, @new = @password, @loginame = @login_name
IF @@ERROR <> 0
RETURN 1
END
END
-- create the execute sp role if it does not exists
SET @execute_sp_role = N'db_procexecutor'
IF NOT EXISTS (SELECT * FROM dbo.sysusers WHERE name = @execute_sp_role AND issqlrole = 1)
BEGIN
EXEC sp_addrole @rolename = @execute_sp_role
IF @@ERROR <> 0
RETURN 1
END
-- create the create table role if it does not exists
SET @create_table_role = N'db_createtable'
IF NOT EXISTS (SELECT * FROM dbo.sysusers WHERE name = @create_table_role AND issqlrole = 1)
BEGIN
EXEC sp_addrole @rolename = @create_table_role
IF @@ERROR <> 0
RETURN 1
END
-- grant privilege to the role
DECLARE cur_sp_fun CURSOR
FAST_FORWARD
FOR
SELECT name, xtype
FROM sysobjects
WHERE xtype in (N'P', N'FN', N'IF', N'TF')
AND uid = (select uid from sysusers where name = USER_NAME())
OPEN cur_sp_fun
FETCH NEXT FROM cur_sp_fun INTO @object_name, @object_type
WHILE @@FETCH_STATUS = 0
BEGIN
IF @object_type = N'P'
BEGIN
SET @sql='GRANT EXECUTE ON '+@object_name+' TO '+@execute_sp_role
END
IF @object_type = N'FN'
BEGIN
SET @sql='GRANT REFENENCES ON '+@object_name+' TO '+@execute_sp_role
SET @sql=' GRANT EXECUTE ON '+@object_name+' TO '+@execute_sp_role
END
IF @object_type IN (N'IF',N'TF')
BEGIN
SET @sql='GRANT SELECT ON '+@object_name+' TO '+@execute_sp_role
END
EXEC (@sql)
IF @@ERROR <> 0
BEGIN
SET @result = 1
BREAK
END
FETCH NEXT FROM cur_sp_fun INTO @object_name, @object_type
END
CLOSE cur_sp_fun
DEALLOCATE cur_sp_fun
IF @result = 1
RETURN 1
SET @sql = 'GRANT CREATE TABLE TO ' + @create_table_role
EXEC (@sql)
IF @@ERROR <> 0
RETURN 1
-- grant access database privilege to application user
IF @user_exists = 1
EXEC sp_revokedbaccess @name_in_db = @login_name
IF @@ERROR <> 0
RETURN 1
EXEC sp_grantdbaccess @loginame = @login_name, @name_in_db = @login_name
IF @@ERROR <> 0
RETURN 1
-- grant role to application user
EXEC sp_addrolemember @rolename = N'db_datareader', @membername = @login_name
IF @@ERROR <> 0
RETURN 1
EXEC sp_addrolemember @rolename = N'db_datawriter', @membername = @login_name
IF @@ERROR <> 0
RETURN 1
EXEC sp_addrolemember @rolename = N'db_datawriter', @membername = @login_name
IF @@ERROR <> 0
RETURN 1
EXEC sp_addrolemember @rolename = @create_table_role, @membername = @login_name
IF @@ERROR <> 0
RETURN 1
EXEC sp_addrolemember @rolename = @execute_sp_role, @membername = @login_name
IF @@ERROR <> 0
RETURN 1
RETURN 0
END
GO
]]>
那么在什么时候适合加上索引呢?我们看一个Mysql手册中D的例子,q里有一条sql语句Q?/p>
SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = 'Executive')
q条语句涉及3个表的联接,q且包括了许多搜索条件比如大比较,Like匚w{。在没有索引的情况下Mysql需要执行的扫描行数?7721876行。而我们通过在companyID和groupLabel两个字段上加上烦引之后,扫描的行数只需?34行。在Mysql中可以通过Explain Select来查看扫描次数。可以看出来在这U联表和复杂搜烦条g的情况下Q烦引带来的性能提升q比它所占据的磁盘空间要重要得多?/p>
那么索引是如何实现的呢?大多数DB厂商实现索引都是Z一U数据结构——B树。因为B树的特点是适合在磁盘等直接存储讑֤上组l动态查找表。B树的定义是这LQ一m(m>=3)阶的B树是满下列条g的m叉树Q?/p>
1、每个结点包括如下作用域(j, p0, k1, p1, k2, p2, ... ki, pi) 其中j是关键字个数Qp是孩子指?/p>
2、所有叶子结点在同一层上Q层数等于树高h
3、每个非根结点包含的关键字个数满[m/2-1]<=j<=m-1
4、若树非I,则根臛_?个关键字Q若栚w叶子Q则臛_?子树,臛_有m子?/p>
看一个B树的例子Q针?6个英文字母的B树可以这h造:
可以看到在这B树搜索英文字母复杂度只ؓo(m)Q在数据量比较大的情况下Q这Ll构可以大大增加查询速度。然而有另外一U数据结构查询的虚度比B树更快——散列表。Hash表的定义是这LQ设所有可能出现的关键字集合ؓuQ实际发生存储的关键字记为kQ而|k|比|u|很多。散列方法是通过散列函数hu映射到表T[0,m-1]的下标上Q这样u中的关键字ؓ变量Q以h为函数运结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找?br />
然而散列表有一个缺P那就是散列冲H,即两个关键字通过散列函数计算Z相同的结果。设m和n分别表示散列表的长度和填满的l点敎ͼn/m为散列表的填装因子,因子大Q表C散列冲H的Z大?br />
因ؓ有这L~陷Q所以数据库不会使用散列表来做ؓ索引的默认实玎ͼMysql宣称会根据执行查询格式尝试将Z盘的B树烦引{变ؓ和合适的散列索引以追求进一步提高搜索速度。我惛_它数据库厂商也会有类似的{略Q毕竟在数据库战ZQ搜索速度和管理安全一h非常重要的竞争点?br />
http://blog.csdn.net/Ant_Yan/archive/2008/09/15/2932068.aspx