feedcat.net的订阅数上升很快呀

7

分类 : 网络日志 | 发表时间 11-10-2008

前几天在忙活rSSa时,在“怀念1997年的秋天”那里看到了feedcat.net的订阅,比feedsky的多了许多,考虑着,难道这个feedcat流行度很厉害吗?不管怎么样,试上一试。

看了网上的一些评论,功能和现在火热的feedburner、feedsky差不多,不过没两者那么功能强大、影响力大,似是feedsky的删减版本,不管怎么样,注册了试下功能。

感觉汉化得不是太好,很多页面还是直接英文了,这里有一位说是他汉化的feedcat,不知道是否确实?如果真是,那就加油啊!

 

这周热门站点 TOP 100 排行最高的订阅数是98065,很high了!排行的中文博客没有出现在前10,最高在18位,更新也不是很及时。

 

简单订阅了以后,把代码贴在主页上,检测通过,聚合的rSS界面确实和feedsky界面差不多,但没看到类似feedsky的自定义域名访问功能,这个对于广大博主来说也比较重要,以免发生被封时,能够及时更新rss提供源地址,而订阅地址可以保持不变。

更新了主页以后,又浏览了几位rSSA博友的日志,回到主页时,刷新一下,feedcat的订阅图标显示为6个了,这么快?这是什么机制?到今天,订阅数已经显示119个了,估计还要不断增长,这可比我的feedsky订阅发展到现在的144要快上多少倍呀!

为什么这么快?为什么它就是这么快?它就是……

什么呢?

各位仁兄,有知道的没?

WordPress简明使用指南

0

分类 : 技术文摘 | 发表时间 13-06-2006

作者: 黄晶(Alex Huang) 网址: alexhuang.org



从2005年9月到现在,我用Wordpress也有些时日了。现将自己使用中的一些体会分简介、安装、编辑、管理、主题、插件、设置、代码修改等几个部分逐一概述如下。也算是为对Wordpress有兴趣的同志提供一些方便和借鉴吧。
注意:我使用的版本是成熟、稳定的1.5.2,而不是最近才发布的、小问题多多的2.0。
1. 简介
WordPress是全球最棒的免费个人内容(Blog)发布平台之一,其下载量即将突破1000000(详细数据请参考Wordpress Download Counter)。它用经典的PHP+MySQL搭建而成,两者都是开源的软件,其中PHP用于编写相应的操作代码、生成页面,MySQL数据库则用于保存用户发布和编辑的内容。
WordPress并不大,最新的稳定版本1.5.2的zip压缩包仅360KB左右,你如果用快点的宽带上网的,几秒钟就可以下载完毕。相应地,软件的开发人员也少,主要的程序员仅两名,即来自美国达拉斯(Dallas)的Ryan Boren ,和来自德州奥斯汀的小帅哥Matthew Mullenweg(一般都称他为Matt)。前者是网络硬件巨头 – 思科公司(Cisco Systems) – 的一名工程师,以开发免费软件为乐。后者则主要为知名IT媒体CNet Networks工作,并有自己的咨询公司(Mobius Limited),时常还做一些中介业务。开发Wordpress,其实只是他们的业余爱好而已。
“麻雀虽小,但五脏俱全”,Wordpress就是这样的小麻雀。有了它,你就可以:

是全球最棒的免费个人内容(Blog)发布平台之一,其下载量即将突破1000000(详细数据请参考)。它用经典的PHP+MySQL搭建而成,两者都是开源的软件,其中用于编写相应的操作代码、生成页面,数据库则用于保存用户发布和编辑的内容。Wordpress并不大,最新的稳定版本1.5.2的zip压缩包仅360KB左右,你如果用快点的宽带上网的,几秒钟就可以下载完毕。相应地,软件的开发人员也少,主要的程序员仅两名,即来自美国达拉斯(Dallas)的 ,和来自德州奥斯汀的小帅哥(一般都称他为Matt)。前者是网络硬件巨头 – 思科公司() – 的一名工程师,以开发免费软件为乐。后者则主要为知名IT媒体工作,并有自己的咨询公司(),时常还做一些中介业务。开发Wordpress,其实只是他们的业余爱好而已。“麻雀虽小,但五脏俱全”,Wordpress就是这样的小麻雀。有了它,你就可以:

1.进行文章发布、分类、归档。
2.支持文章、评论、分类等多种形式的RSS输出。
3.提供链接的添加、归类功能。
4.支持评论的管理,防垃圾功能。
5.支持对风格(CSS)和程序本身(PHP)的直接编辑、修改。
6.在Blog系统外,方便的添加所需页面。
7.通过对各种参数进行设置,使你的Blog更具个性化。
8.生成静态html页面(需要mod_rewrite支持)。
9.通过选择不同主题,方便地改变页面的显示效果。
10.通过添加插件,可提供多种特殊的功能。
11.支持Trackback和pingback。
12.支持针对某些其它blog软件、平台的导入功能。
13.支持多用户。
这些功能,已经能够满足个人用户绝大多数的需求,并且,对于中小企业来说,它也是建立内容或资讯发布平台的得力工具。
个人认为,与其它的Blog发布软件相比,Wordpress的主要优势在于:

安装最简单。
Web标准支持非常好。
使用比较简单。
主题与插件丰富。因此可以方便地打造自己喜欢的Blog显示效果和功能,让它在简单的同时,变得更加美观、强大。
功能设置比较合适、合理,不像有些软件那样多而无用。
代码修改比较方便、容易。
也正是上述这些原因,我最终选择了Wordpress。
2. 安装
WordPress的安装非常的简单,如果一切顺利的话,只需要几分钟就可以搞定。当然,妥善的前期准备工作在这里是必要的前提。
为了放置你的Wordpress文件,你必须得先找到一台合适的主机。至于它是你自己搭建的,还是去服务商那里租用的,这并不重要。(这里只介绍后一种情况)
前面的简介中已经说过,Wordpress是用PHP+MySQL实现的,因此,它的安装对主机有一个基本的的要求,即主机必须支持高于4.1版本的PHP和高于3.23.23版本的MySQL。另外,主机的Apache(地球上最流行的Web服务器,类似于微软的IIS – Internet Information Services)最好还要支持mod_rewrite功能,这样就可以生成各种指定形式的Permalink(一个静态html形式的页面地址),便于搜索引擎的查找和用户的使用。否则,页面链接的形式就只能是我Blog这样的,如http://alexhuang.org/?p=1。当然,这并不影响它的正常使用。
如果你对permalink没有太多的要求,那么,使用的由edong网提供的K300型虚拟主机将 是不错的选择。以我目前的使用情况来看,还是比较满意的。这个空间容量共为300M,其中数据库为100M(WordPress只在数据中存放文本化的 XHTML代码,因此,完全够用了)。PHP版本为4.3.11,MySQL版本为3.23.28,都符合Wordpress的要求。每年的费用为300 元,相比其它服务商,算是比较实惠的价格了。速度还行,稳定性也比较不错。
购买主机以后,你就可以登录管理页面,然后通过设置MySQL数据库的面板,定义一个自己的数据库,它的名字以及你的用户名和密码都由你自己决定。这三个东东非常的重要,请你一定要记下来。
接下来,就可以到这里下载最新版本的Wordpress程序包,进行正式的安装了。
首先,用解压缩软件如WinRAR将程序包解压。
然后,找到解压后目录中的wp-config-sample.php文件,用文本编辑软件如notepad打开它。
接下来是最关键的步骤了,即填写你的MySQL数据库信息,这些信息由你自己在虚拟主机服务商提供的设置面板中定义。在wp-config-sample.php文件的头部,你会发现类似如下的代码:

define(’DB_NAME’, ‘wordpress’); // 把wordpress用你的MySQL数据库名字代替
define(’DB_USER’, ‘username’); // 用你的MySQL数据库用户名代替username
define(’DB_PASSWORD’, ‘password’); // password即你的MySQL数据库密码
define(’DB_HOST’, ‘localhost’); // 一般来说,这一行就不需要修改了
按照我中文所说的要求,填写相关的信息即可。以“另存为”的方式将wp-config-sample.php文件改名为wp-config.php保存。
文件修改完毕后,用FTP软件如Filezilla将 整个解压目录上传至你虚拟主机上的Wordpress目录,上传时所需的相关资料如主机IP地址、用户名、密码等服务商会提供给你,至于FTP客户端的使 用,这里暂不细讲。Wordpress目录由你自己决定,可以是根目录,也可以是你自己定义的新目录,它将决定你的Blog将以什么样的地址进行访问。我 放在根目录下,就可以用http://alexhuang.org/访问我的Blog,如果放到如/blog/目录下,那么,访问这个Blog就要输入http://alexhuang.org/blog/才行(当然,可以在后台进行设置改变这一限制)。
安 装工作的最后一步,就是获取你的Wordpress用户名和密码了。在地址栏中输入install.php文件的URL,它位于你的Wordpress目 录下的wp-admin子目录中,因此一般的形式为http://wordpress目录/wp-admin/install.php。这个安装文件会生 成一个用户名和密码给你,通过它们,你就可以进入Wordpress的管理面板进行相关的操作了,并且,拥有的是最高权限。这个密码非常的重要,请你一定 要记牢,当然,你也可以在登录后将密码修改为你自己喜欢的字符串。 />补充:
当然,还有第三种方式可以让你更为方便地使用Wordpress,那就是找一个以Wordpress为基础平台的Blog服务商,你注册后就可以立即感受使用Wordpress的乐趣了。我还是推荐几个这样的服务商给大家吧:
· wordpress.com (wordpress团队自己弄的)
· wordpress.com.cn (好象是国内做的,我试过还行)
· blogsome.com (我以前最喜欢用的)






3. 一般使用
前面,我花了一定的篇幅对Wordpress的来历、用途,以及安装进行了一个简要的介绍。接下来,我则会对它的使用进行较为详细的说明了,这些内容将是本系列文章的重点。
WordPress分前端和后台,为了获得一个初步的印象,你可以点这里先看看其官方网站提供的截图。前端是所有用户都能看到的,也即你的Blog最终的外在表现形式,如我的Blog此刻呈现在你面前的样子。后台则仅对管理员和有一定权限的注册用户开放,Wordpress的管理全部都是在后台进行的。
在 地址栏输入”你的域名/wp-admin/”或”你的域名/wp-admin/index.php”,如http://alexhuang.org/wp -admin/或http://alexhuang.org/wp-admin/index.php,填好你的用户名和密码,即可进入行你的 WordPress后台管理界面的主页面。当然,你还可以输入更为具体的地址,直接进入行后台管理界面中的相应功能模块。如”你的域名/wp- admin/post.php”(直接写文章),”你的域名/wp-admin/themes.php”(直接管理主题),”你的域名/wp- admin/link-manager.php”(直接管理链接)等。另外,如果你是管理员或注册用户的话,也可以在前端的页面中点击”Site Admin”(用户名和密码已被系统记住时)或”Login”(你已退出登录或用户名和密码还未被系统记住时)进入后台管理界面。Wordpress后台 管理界面主页面的大致模样请点这里查看。
进入Wordpress后台管理界面的主页面后,你会在最上方看到一个主菜单,通过它们,你就可以完成对Wordpress的主要管理工作了。由于这一部分的内容较多,所以,我决定再将该部分的内容根据与Wordpress后台管理主界面相似的分类细分为七个部分,即:

1. 写文章(Write)
2. 内容管理(Manage)
3. 链接管理(Links)
4. 主题功能(Presentation)
5. 插件功能(Plugins)
6. 用户管理(Users)
7. 设置(Options)
在接下来的文章中,我将依次对它们逐一地进行介绍。
建议:
Tiger Style Administration是一个非常不错的Wordpress后台管理界面转换插件,它可以将你初始的后台管理界面改造成苹果电脑所使用的操作系统的风格,非常的漂亮,喜欢的朋友可以试试。








3.1 写文章(Write)
首先,你可以点这里对Wordpress的文章编辑页面形成一个初步的印象。
撰 写文章的页面主要有四个区域。最上面是选择Wordpress后台管理面板中其它功能页面的菜单,中间左边是编辑区域,用于文章的编写,它的右边是内容分 类选择区域,可以用它为当前编写的文章选择相应的分类,最下方是则为了当前文章选择参数和增加用户自定义内容的地方。如果你选择了”Advanced Controls”(高级编辑页面)的话,在它的下方还会看到当前编辑的文章在前端(Front-End)的最终显示效果,它与外部用户能看到的效果保持 一致。
四个区域中,选择菜单前面已有提到。内容分类选择也很简单,你自己可以依情况而定,需要提一下的就是,分类可以选择一个,也可 以选择多个。它的下方还有三个选项,包括”Allow Comments”(是否允许评论)、”Allow Pings”(是否允许本文去Ping它指向的文章)、”Password”(为本文设定一个密码,只有拥有这个密码的人者可以进行编辑)
编辑区域和用户自定义区域的使用相对要复杂一些,因此,要多做一点介绍。
编辑区域的最上方”Title”处,用于填写你的文章标题。
再 往下,会根据你选择是”Simple Controls”(一般编辑页面)还是”Advanced Controls”(高级编辑页面)而有所不同。它的设置我们会在后面的内容中讲到。由于高级编辑页面包含了一般编辑页面中所有的选项和功能,因此,我们 这里的介绍以它为准。
在”Title”的下方,就是”Excerpt”(摘要)区域,这里用于编写针对你文章的摘要。用于读者在以摘 要的模式订阅和浏览文章的时候,显示相关的内容。针对他们的设置将在后面介绍。当然,你也可以不写摘要,这不会对文章造成什么影响。事实上, WordPress自带了个摘要抽取功能,它会在必要的时候执行,只是其内容可能没有自己撰写的准确而已。
再往下走,就是文章编辑页面最重要的地方了,”Post”即文章内容编辑区域,它的大小可以进行设定,留到以后再讲。这里关键讲一下”Quick Tags”(便捷标签),它对你的文章编写是比较有帮助的。
WordPress每一篇文章的内容是由标准的XHTML语言构成,这些标签对应的就是相应的标签功能。它们分别是:

B – 粗体字
i – 斜体字
link – 添加链接
B-Quote – 引用文字
del – 文本加删除线
ins – 文本加下划线
img – 添加图片
ul – 定义有标记的列表
ol – 定义有序号的列表
li – 定义列表项
code – 设置文本为代码风格
more – 添加注释
look up – 在文章内进行查找
Close Tags – 关闭打开的标签(好象不起作用?)
当 然,这些标签的功能还比较有限,因此,为了实现更多的功能,如插入Flash对象等,你最好还得进一步地学习一相XHTML语言的相关知识。不过,对于一 般内容的编写而已,它也已经够用了。需要特别提一下的是,文章的最终显示效果主要还是由主题下的核心样式表(一般叫style.css)来进行控制。
编辑区域的下方,是进行参数选择和设置自定义内容的地方。这些选项有:

Post Status: 文章的当前状态。可以是”Published”(已发布)、”Draft”(草稿)、”Private”(私人日记,选择这种状态,那么该篇文章就只有作者自己能看到)
Send Trackbacks To: 通过它,你可以在发布该篇文章的同时向指定的地址发去一个通告。比如,在你引用了某人Blog中的文章时,你希望告知他,就可以利用这个功能。
Post Slug: 当你使用Permalinks功能的时候(前面提到过,需要Apache的mod_rewrite,反正edong网是 不支持,所以我也没体验过),Wordpress将为你的每一篇文章生成一个类似”你的域名/year/month/day/文章标题/”这样的静态 HTML地址(当然,怎么生成permalinks,你自己还可以定义)。当你想用自己设定的内容来代替permalinks最后的一段字符时,就需要指 定一个Post Slug,这样,Wordpress生成的permalinks的形式就成了”你的域名/year/month/day/post-slug/”。因此, 可以看到,Post Slug主要作用就是可以为每篇文章形成一个更合理、更具个性的静态链接地址。Slug这个字串符最好使用英文或阿拉伯数字的组合,对中文支持怕是不大好 的。
Post author: 文章作者,谁登录编辑此文,谁就是默认的作者。在有多个注册用户的情况,可选相应的作者。
Edit Time: 默认情况下,以系统的当前时间为发贴时间。但你也可以根据自己的情况需要进行修改,比如说把时间提前,这样,该篇文章就插入到你指定的时间所在文章集合中对应的位置。
Custom Field(s): 用户自定义区域。这一块的内容相对比较复杂,它会根据你的加入的插件而有所改变。它包括两个部分,即”Key”(自定义
区域名字)和”Value” (值)。默认情况下只有”enclosure”,可以定义你的文章中加入了哪些资源(如音乐)。当然,Wordpress允许用户自己加入新的内容,如我 每篇文章下的Technorati区域,就是在这里进行定义的。其具体的使用方法后面加讲。
初 次文章编辑完成后,点”Publish”按钮就可发布,点”Save”则只进行保存。当重新编辑时,点”Save”则可实现文章内容的更新。默认情况下, WordPress会为每一文章生成一个唯一的、按顺排列的ID,你可以用”你的域名/?p=[文章ID]”这样的形式支持访问它,如这当前这篇文章就 是”http://alexhuang.org/?p=169”
3.2 内容管理(Manage)
点击主菜单上的”Manage”即可进入内容管理页面,当然,也可在地址栏输入”你的域名/wp-admin/edit.php”直接访问该页面。
管 理页面的还下辖多个子页面,点页面上方的相应链接即可进入。默认情况下,有”Posts”(文章)、”Pages”(独立页面)、” Categorires”(内容分类)、”Comments”(评论)、”Awaiting Moderation”(等待审核的评论)、”Files”(系统文件)等六项。另外,如果你安装了某些插件,可能同时也会在这里增加针对管理它们的相应 选项。
3.2.1 文章管理(Posts)
打开内容管理页面,默认显示的就 是文章管理页面。为了方便地找到你希望编辑的文章,在页面的上方增加了一个文章搜索(Search Post)功能,以及显示指定月份文章(Browse Month)的选项。因为随着你写作的时间越来越长,文章可能会变得比较多,这样就不容易找到你想编辑的文章,而这两项功能,就是为了给用户提供更多的便 利而专门设置的。
再往下,Wordpress会按你的要求,显示详细的文章信息列表,每一篇文章占一行。这些信息从左至右包括:
唯一编号(ID)、最后更新时间(When)、标题(Title)、文章所属分类(Categories)、文章评论数(Comments)、作者(Author)。在每一行的最右边,有三个针对该文章的操作按钮,即:

查看(View) – 直接回到前端(Front-End),显示该篇文章的最终显示结果。
编辑(Edit) – 进入文章编辑页面,它和前面所讲的撰写文章的页面几乎一样,只是文章不再是从零开始进行撰写,而是在已有的基础上进行修改。因此,这里就不再深入介绍了,看我前面的文章即可。
删除(Delete) – 删除该篇文章。
如果指定要列示的文章比较多,一页不够显示(默认一页显示15篇文章的信息)。那么,文章管理页面的最加方还会出现一个名为”更多前面的文章”(Previous Entries)的链接,让你查看更多文章的信息。
3.2.2 独立页面管理(Pages)
点内容管理页面最上方的Pages项,即可进行独立页面管理界面。独立页面的撰写和管理与文章的撰写和管理十分的相似,因此,就里就不再赘述了,相信大家都能举一反三。
3.2.3 内容分类管理(Categories)
内容分类是为了更好的组织文章的一种方式,它不仅可以让作者更容易地管理的自己的文章,还可以让读者更方便的阅读自己喜欢的内容。
WordPress 提供了方便的分类功能。在内容分类管理页面中,有一个”加入一个新的分类”(Add New Category)区域,在这里填上分类的名字(Name),选择好上级分类(Category Parent),再填写好分类的说明(Description,选填项目),然后,点”增加一个分类”(Add Category)按钮,就可以完成内容分类的添加工作了,非常的简单。添加好分类后,你就能够在撰写文章的页面中,方便地使用它们了。
在内容分类管理页面中,分类的信息用与文章管理页面中的文章信息相似的方式显示。一个分类占一行,从左到右分别是:

分类唯一标识(ID)
分类名称(Name)
分类说明(Description)
分类下辖文章数(# Posts)
编 辑按钮(Edit) – 点击它,会进入下分类编辑页面,与”加入一个新的分类”区域中的内容相似,只是多了一个Category Slug选项,你可以在这里填入一个字符串,其具体作用不详,应该是用在permalinks功能中,用于生成该分类的子目录。最终生成类似”你的域名/ [category slug]/[post slug]”这样的静态HTML页面。
删除按钮(Delete)
3.2.4 评论管理(Comments)
评论是读者在看了你的文章后作出的反馈(当然也有垃圾评论,如广告),是Blog作者与读者进行交互的重要手段。
评论管理页面的最上方,有一个搜索区域,在这里可以方便地找到你希望直接进行管理的评论。
在 它的下面,有两个选项,用于要求Wordpress以指定的方式列出评论管理页,其中”View Mode”以向下一个个显示评论及操作选项的方式列出评论,而”Mass Edit Mode”则与文章管理页面相似,以一个表格来显示相应的评论,每个评论占据一行的位置。
根据你使用评论列示方式的不同,系统显示出的信息和针对它们的操作都是也会略有区别。关于评论的信息大致有:

评论者(Name)
评论者电邮(E-Mail)
评论者IP地址(IP)
评论内容的摘要(Comment Excerpt)
评论的时间(”View Mode”下才显示)
而相应的操作则包括:

编辑评论(Edit Comment)
删除评论(Delete Comment)
编辑被评论的文章(Edit Post,”View Mode”下才支持)
显示被评论的文章(View Post,”View Mode”下才支持)
到前端查看评论(View按钮,”Mass Edit Mode”下才支持)
删除多篇文章(点每个评论前的复选框,再按最下方的”Delete Checked Comments”,在”Mass Edit Mode”下才支持)
在”View Mode”下点”Edit Comment”,在”Mass Edit Mode”下点”Edit”按钮,都可以立即进入评论编辑页面,在这个页面中,你可以修改:

评论者的名字(Name)
评论者的电邮地址(E-Mail)
评论者留下的唯一资源标识(URI)
评论内容本身(Comment)
评论的状态(Comment Status), 包括”Approved”(允许该条评论发布)、”Moderated”(等待审核,不会被显示)、”Spam”(垃圾评论,不会被显示)
评论的时间(Edit Time)
删除该评论(Delete Comment)
操作完毕后,点”Edit Comment”按钮,即可完成对该条评论的修改。
3.2.5 等待审核的评论(Awaiting Moderation)
这是Wordpress为了防止垃圾评论、广告的骚扰而提供的功能。它的设置要在”Options”模块中完成,如你可以规定评论中的链接超过五个,则该 评论被暂定为垃圾评论(具体的设置后面再讲)。当发现的相应的垃圾评论时,Wordpress不会让该评论直接显示在前端的页面中,而是把它放到的这里来 进行管理。这些评论必须要通过了你的允许,才会被显示出来,当然,你也可以方便地编辑或删除它们。其操作与评论管理类似。
3.2.6 系统文件管理(Files)
系统文件这里指的是Wordpress的核心文件,包括程序本身、主题、插件等用到的PHP程序文件、CSS样式定义文件及其它一些可编辑的文件。在系统 文件管理页面中,你可以对Wordpress进行最底层的操作,如果你不了解XHTML、CSS、PHP、Javascript语言,建议你就不要到这里 来了。
如果你认为自己有能力对这些文件进行修改、编辑,那也不用我再介绍这个页面里的内容了,因为你应该看得懂的。毕竟,就只有两个按钮:

Update File – 更新你当前编辑的文件
Edit File – 选择你要编辑的文件,直接输入它们的URL地址即可。如果你不清楚它们的地址在哪儿,可以打开你的FTP客户端查看。




3.3 链接管理(Links)
点后台管理面板上的”Links

网站投资你和我的20个自身检查

0

分类 : 社会文摘 | 发表时间 20-04-2006

1、web2.0提了也白提
web2.0这是一个概念,打着web2.0的概念,只是说技术如何如何2.0,战略如何2.0,其实意义真的不大。投资人需要的是一个网民能够接受,并且很有特点的网站,能够满足网民的某个需求,或者能够引导网民的某个需求。你的网站提供的服务只要是有市场潜力的,有发展空间的,真的不用冠上某个新鲜的概念。

2、不要和投资人谈什么大战略
你一上来就是网站建设大而全,这些那些统统都有,栏目100个,功能1000个,网民来了就一站搞定,根本不用去其他地方了。投资人一般认为这是不可能的。一个栏目都建设不好,谈什么所有的栏目都建设的好呢?而且,耗资巨大,建设时间动不动就是一年一年半,等到建设好了,黄花菜都凉了。见过一个人提了个虚拟城市的计划,几乎连政府部门都搬进来了,投资人会说:你说的是对的,但是谁敢给你投资做这个看着很美妙却是一个海市蜃楼的东西?

3、先有第一批用户是至关重要的
不要指望着网站大了,功能全了,用户就来了,一个网站做起来,第一批用户的作用是至关重要的。如果告诉我第一批用户就是网站宣传出来的,我肯定会只给打20分。你必须有一个非常有粘性的吸引网民能够来注册的特点。我们谈的是一个战役,战役开始攻占第一个山头是决定成败的,而不是和我描述整个战役是否能够成功,那是纸上谈兵,诸葛亮都有过这个点上的投资错误,结果是斩了马谡。所以投资人的在这个方面的教训远比你想的更深刻。

4、不要抓大而放小
别小看一个网站中很小的一个功能或者服务,你的这个小服务,很可能就是桥头堡,很可能形成一个网站内的环境,一上来就是视频战略如何如何,内容战略如何,某项宏大的市场活动如何。其实投资人要听的只是你第一步的特点,网民没有时间来听你谈战略,他们进来可不是来关心你还没有实现的这些战略的,他们要的是吸引他们的东西,哪怕只是一个会员视频认证或提供更漂亮的模板,或者让他们看到你网站上面全都是穿三点的会员。

5、无线应用绝对不是盈利模式的全部
没有盈利模式,就拿无线来凑,可是一个新网站,能不能得到特服号不说,如何和其他SP竞争也是一个问题。别人凭什么要来订阅你的服务,或者给你拨打声讯电话?首先你的盈利模式不需要无线就能存在,再拉上无线,这样才有说服力。

6、不是有激情就可以
你没有什么管理经验或者运营经验,你提的点子再好,但我怎么相信你就能把一个团队管理好?搞企业可不是几个好朋友过家家,宣传推广也是烧钱就一定有效果。你都没有失败过,怎么知道你这样做就一定成功?

7、别指望网民给你提供内容
你作为机构,自己都不能生产出合适的内容,而指望网民来提供内容,那几乎太高估我们的网民的综合实力了,美国80%网民的人还都不知道BLOG是何物。就算是你的原则就是不生产,只要也要有整合某些内容的能力或者引导内容生产的能力。

8、不要吹嘘合作伙伴是什么顶尖团队
一说就是技术人员是负责以前某个项目的,结果一问是做旅店的视频监控的,却非要说他能够负责整个网站的技术实现。这个技术跨度让人感觉很可怕。你还不如实话实说,他做视频监控也一定有技术特点或者优势的,没必要包装成大而全的技术专家。

9、毕业三年最好自己做,不要想着能找到投资
才毕业三年,自己以前都没有自己的网站,就要召集几个和你一样的年轻人找别人要投资。太浮躁了吧。的确有一毕业就创业成功的,但是你也要知道别人在上学的时候干的事情你根本没有勇气去尝试。老是拿者别人的成功来掩饰自己的缺点,或者来证明自己也有成功的可能性,是很幼稚的。

10、不要以为你的想法没有人想过
真的不要在没有了解清楚之前,就为自己的某几个想法激动的睡不着觉,好像是投资人眼界还没有你高,没有理解你的伟大的思路,不能理解你的独创性。还给人冠上不是伯乐的帽子。实际上你自己去好好的搜索一下,你这个想法在好几年前就有了,而且有人已经做出来了。所以在谈话和计划书上不要吹嘘什么自己是独创性的,前无古人后无来者,会让人发笑。

11、不要以为投资人是傻冒
投资人是要靠投资来赚钱的,当然会比较慎重,如果碰到特别好的项目,投资人一定会仔细的考虑,并且会给你一些更多的帮助。因为投资人也知道帮你成功了,他们也就发财了。所以不要以为投资人是傻冒,摆着的钱都不赚。实际上投资人比你要聪明的多。

12、你的网站至少是已经开发完成80%以上了,才有和投资人争论的资本
网站只开发了不到50%,模样都还看不出来,就想获得投资,这几乎是不可能的。可能你的点子真的很好,但是既然是好的点子,那就应该全部完成了以后,再找投资人谈谈,让他看看现成的成果。50%的网站就非要给人看,你自己不怕别人把你的东西都学去吗?现在就和投资人争论只是没有完全开发出来,所以你还看不出来,实际上是如何如何的,这都是没有什么意义的。

13、要知道自己的网站以后的拓展方向在哪里
如果你能让投资人相信你能走好第一步,那么你就应该详细的说明下一步你们网站还能扩大些什么具体业务,可以包容什么样的人群,不要一上来就是说我的业务对象和人群就是15-30岁的年轻人。这些人群如何聚集起来,是要一步步的来的,也和你自己的平台本身的拓展性有很大的关系。这是一个分步骤的计划,也是对自己网站的延展性的描述。一定要重视。投资人的投资,是希望你的网站能够不断扩大业务种类和用户范围,而不是做出来什么样,就是什么样。

14、成本要算的清楚
我看过一个计划,15个人月薪总支出就是20多万,而一年的人工成本是多少,硬件设备,带宽成本都没有算,这钱花着也太容易了吧。又不是你饿了就随手能够采到果子吃,基本生存的成本都算的不清楚,以后的钱要支出的方面更多,难道给投资人一笔糊涂账就OK了?所以,你应该字仔细的把成本都考虑清楚,如果你连加班要用的牙刷牙膏的成本都想到了,投资人会很欣慰的。

15、团队一定要性格互补,并有合作的经验
拉着几个人,谈了两三天,刚好几个人都没工作或者不满现状,就宣布团队成立了。这样的团队怎么让人放心,一到利益冲突的时候,亲兄弟都可能翻脸,何况是你们几个重来没有合作过的人组成的团队。到时候闹得不可开交,投资人的投资怎么办?我看投资人真投了,那才会天天睡不好觉,怕你们闹矛盾。所以,如果是团队作战,千万不要生拉硬拽,临时拼凑,这样就算得到了第一笔投资,后面的资金支持将会随着你们的分崩离析而荡然无踪。

16、有自己的独特的资源,并能够在网站上应用
你个人或者团队的资源整合能力和运营能力,是投资人相当重视的。如果你有好的资源,希望你能够利用到你的网站中去,不要另辟新径,因为新的途径你自己都不太了解。比如你以前做某个传统行业,那就不要做的网站和这个行业一点关系都没有;又比如你以前一直做某

站长兵法全集二

0

分类 : 网络日志 | 发表时间 14-01-2006

第二章:第五节:功利化期

商业化后的功利化似乎已经是任何领域,任何产业,都无法逃避的阶段,更何况互联网本来还是个充斥着泡沫的经济呢?

2000年网络开始真正进入了寻常百姓家,网吧数量的增加,网费的降低,网速的提高,网站的大力烧钱推广,媒体的”轮番轰炸”,都使人们更愿意去尝试着使用网络。当无数新网民眼睁睁的看到一个个网络英雄的故事时,他们心动了,张朝阳、丁磊、王志东,这些具有传奇式的大型网站掌门人的事迹,他们早已耳熟能详,又羡慕不已,可是他们自己心里很清楚,这是很难去模仿的,毕竟融到几千万美元的资金,这近乎神话,只能羡慕嫉妒;可是像高春辉、华军、边城浪子、CarBoy这些靠个人网站起家成名的代表,他们却是可以学习借鉴的,因为这虽然可能要花费很多的精力,但还有实现的希望。应当说当时无论是冲着名还是利而去做站的个人站长大有人在。甚至可以用”十有八九”来形容。试想,抱有这种心态的站长们,会做出什么好站点吗?

君不见原本脚踏实地的站长为求访问量,纷纷在计数器、广告代码上作弊,以欺骗广告商(虽然开始尝到些甜头,但最终被广告商发现,删除帐号者大有之);君不见多数个人站点千篇一律,无非是音乐,游戏、下载、免费资源等综合内容,缺少了个人站点应有的个性色彩;君不见自此以后垃圾邮件满天飞,毫无目的性的做站点广告介绍者有之,骗取广告点击率者有之。原本良性发展的个人网站领域顿时乱了套。这种现象直到现在还四处可见。有些还做得非常缺德,例如进入某网站会弹出无数个广告窗口,关掉一个后又弹出二个,凭白消耗你系统资源与网费;又如很多站长在源文件中加入改动你首页或者浏览器TITLE的程序代码,使得你进入其网站后一次,你的浏览器就会被他改得面目全非;再如美女写真、赚钱类明显带有功利色彩的站点以迅雷不及掩耳之势冒出,搅得人心烦意乱……


3、IT写作社区(使用的主力域名是:http://www.donews.com):
2000年4月,IT写作社区成立,网站的前身是IT知名记者–刘韧先生的个人主页(当时的域名也为 http://www.liuren.com)。转型成为IT写作社区后,本意是想吸引一批IT记者和网络写手聚集到一起交流经验,故名为写作社区。经过不懈地发展,竟然成为众多”IT人物”公认的默认汇聚地!现在的IT写作社区,与其说是个人主页,还不如说更像是一个公众网站。这里的主题主要是通过各种IT人士开设的专栏,来评论探讨IT业发生的一切,交流心得体会,并提供IT文章的稿源,供媒体选用,当然也能够在此结识各种IT朋友。这里汇聚的IT人士,几乎均为当今国内IT界中,”有头有脸”的人物;从各IT公司的CXO(如:老榕),到个人站长(如:高春辉),从IT名记(如:刘韧),到IT评论家(如:猛小蛇)无一不是此站的常客。俨然就是个IT社会的真实写照,称其为”IT社区”真是再恰当不过了。纵观国内各IT站,有如此号召力与凝聚力的,可能也只有此站了;由于此站采用了专栏文章即时发表的设置,因此可以说此站是无时无刻都在更新的;提供的论坛、开发的网站客户端,功能虽弱,但亦为整站增色不少。

4、旺旺英语(使用的主力域名是:http://www.englishww.com):
网络的普及使得网上英语学习站大受欢迎,这个名为”旺旺英语”的中文网站就是同类中出类拔萃之作。网站的前身其实在几年前就已建成,但站长曾经因为个人原因休站一年,因此直到2000年站点才算正式对外开放。网站拥有丰富的内容与庞大的数据含量,栏目设置分为单词、发音、句子、听力、语法、开讲、阅读、杂志、考试等数大类。无一不围绕着英语学习展开。同时网站还开设有电子杂志和论坛等交互程序,目前已有近10万人订阅了网站配套的电子杂志,论坛注册用户也有2万人以上,网站还保持了每日至少一次更新的频率,很少有过间断的;可以说凭1、2个站长能够在短时间内做到如此的成绩,实在堪称个人网站成功的经典案例了。

从上述几个2000年及其后出现的优秀个人网站中,我们可以明显感觉到他们与以前的个人网站与众不同的地方,那就是–网站非常垂直!再也不向大而全、什么内容都要做的方向发展了,而是力求网站对某部分网民有针对性,制作上也尽量专一、专业。或许这也正代表了个人网站将来很长时期内的一个发展趋势吧。[NextPage]

第三章:第一节:纯粹性


  纯粹性的个人网站是所有个人网站中最令人钦佩的,而且境界也是最高的,颇有”看破红尘”的意味;这种性质的网站是典型的”三不主义”,即不求访问量,不求知名度,不会商业化(当然也没有强制规定不得商业化,除非站长自认为已经到了该商业化的时候)。随心所欲的制作自己的网站是他们的宗旨,站内无论是形式还是内容,无论是图片还是界面处处体现纯粹的气息。这种性质网站另一个较为显著的特征是内容均为原创,因为他们建设纯粹性的个人站,为的就是一种心情,一种能给自己带来快乐,能给网络带来些许纯净空气的心情。如果抄袭别人东西的话,这种心情就不会出现,更谈不上纯粹了。应当说在这个急功近利的时代,这种性质的个人网站已经寥寥无几。但如果细心观察,还是会发现不少。

纯粹性的个人网站站长们分为2类,若不是刚做站时还没考虑到如何进行商业化,怎样转载其他网站内容的新站长就是已经过大起大落后领悟到了个人网站的”原点”,反璞归真心态的。如果是前者,那么只能说他是涉网未深,做站时间一长难免会把自己的网站逐渐转变成其他性质了;而对于后者,则几乎可以肯定他们明白个人站应该回归本色,做网站是为了让站长提高自己的能力,交更多的朋友,和向世人展示自己,个人网站的前途,就是自己做自己想做的,随心所欲尽情地发挥,不要去摹仿他人,因为每个人均会有自己的特色,做出来的东西也一定会不同。而且很多时候,当你真正这样去做的话,你会发现,种种你事先未曾料到的”好处”自会悄悄地到来。

例:纯粹性的个人网站在网站命名上没有特殊规定,多为”XXX的个人主页”之类名称,(但也不是绝对,譬如当年的”高春辉的个人主页”,就是一个既有不少广告,又有很多软件下载、注册码内容的商业性个人网站),至少不会起很商业化的名字或者喊太空洞的口号,低调是他们的共通之处。网站既可以使用国际域名也大可使用免费域名转向(似乎后者更多些),网站类型上多为情感类的网站,在内容上,一般是对某一事、物进行专一的研究、阐述,或站长自己的单纯自我介绍。

第三章:第二节:自由性

自由性质的个人网站或许是所有个人网站性质中最常见的一种了,数量极多;这种性质的个人站与纯粹性站点有些相近,但也有显著的差别,一个很明显的差别是他们的心态不同,纯粹性的个人站长心态更平静,没有商业广告(友情链接除外),不求知名度,而自由性的站点更盲目些,自娱自乐是他们的目的,从这点上看似乎比纯粹性的个人站更随心所欲一些;但网站的内容一般比较雷同,站长的素质也参差不齐,譬如A个人站有的内容,
到了B站点处改头换面了一下,也同样出现了。而且一般同类网站在表现形式上也大同小异;这种显而易见的抄袭行为直接区分了自由性个人站与纯粹性个人站。

更重要的是自由性个人网站站点上可能会出现一、二个广告位贡献给广告商;但绝不会做得太过分,因为他们也很清楚,太过分的商业气息,所收到的效果只有适得其反。更何况商业化也不是他们的初衷。只可惜一个站点缺少了原创性和有了商业气息,它就很难再成为纯粹的个人站了。

这种性质的个人站点,不太在乎得失,从他们使用的极不稳定、时断时续的免费空间就多少看得出来,不过既然是自娱自乐,这点也可以理解。

例:自由性的个人网站所使用的网站名称是最稀奇古怪的,我们一般人能想到的自然少不了,很多我们可能这辈子也不会想到的名称,竟也敢用,或许这就体现了一种自由精神吧。所使用的域名除了国际域名外,同样也不乏免费域名与空间,且后者占了绝大多数。在网站类型上几乎是所有站点类型都会出现自由性的个人站。游戏、音乐、软件自不必说,什么收藏类、医学类等等偏门的网站类型也一定会有。网站秉承自己的特征,更新速度上也不稳定,有时站长心情好,一天更新数次也有可能,如果他不乐意,几个月不做更新也是常事。

第三章:第三节:公众性

所有权虽然属于站长本人,但网友参与程度更高,站长不愿意进行过多干涉的非赢利性网站。这是公众性个人站的宗旨。

公众性的个人网站在个人网站领域中并不多见,一般是以XX小组,XX联盟这样颇具大气的名称组成,常见于技术类网站;公众性的个人站虽然所有权属于创始人自己,但更具公众色彩,也就是说人人都可以参与进来,人人都是站长(至少也是网站成员)。而且由普通网友参与网站的建设是公众性个人站与其他性质个人站主要区别,是必备因素,如果没有人人参与精神,那这个个人网站就不应该再称为”公众性”。

一个普通网友要想参与到某个公众性的个人站时,只需要遵守这个公众站的规章制度,暂行条例(这些规章制度或条例通常是由最初提出这个公众性网站设想的人所拟定的),就可以加入其中对某一热点问题、专题论点进行讨论、研究。打个比方,如果李甲建立了一个公众性的个人网站,为提高网友的参与性,势必会拟定一些规章制度,以区别和其他个人站性质上的不同,那么这些规章制度或暂行条例,很显然就只有李甲才能拟定。当然,公众性个人站的网友来去自由,想加入只需遵守网站规定,想退出随时都可以。

而且一般而言,公众性的个人站,都会为某一领域的发展起到自己的作用,贡献自己的一份力量。譬如一个研究VB语言的公众性个人站,就会长期对VB这种程序开发语言进行讨论研究,大家都遵守着这个网站的不成文或成文的条例,每当遇到一个困难的问题,一个VB中的缺陷,网友就把问题提交给站长,由站长再提交给微软公司解决或将问题发布在网站上,供热心的网友回答;从这种意义上看,公众性的个人站,更像是遵守OPEN协议的(知道LINUX是怎样开发的么?)个人站。

不过另一方面,公众性个人站往往是由一个在某一领域内有一定威望的知名人物组织发起的,因为这样这种公众性网站才会具有权威性,才会汇聚人气,但也正因为有时间有能力有心情做个人站的知名人物和威望人士本来就少,所以我们就不难理解为什么说公众性个人站不会很多的原因了。像国内比较知名的公众性个人站,就有著名IT记者–刘韧先生的”IT写作社区”(http://www.donews.com),这原本是一个介绍刘韧自己的个人主页,但在2000年初转型成为公众性网站后,把主题定为”IT写作社区”,没用多久时间,网站就已聚集起了近万名喜欢写作的撰稿人及各种媒体的编辑记者等人,当然也不乏IT业界的各种风云人物。足以看出网站创始人刘韧的魅力。


例:公众性个人站的网站名称一般是以”XX联盟”、”XX社区”之类比较具有号召力和大气的名称构成;在域名上多采用国际域名,如果按照站点性质来看应该以.org这样非赢利性的域名后缀结尾,但似乎现在这种规矩并不明显。大多数公众性网站还是以传统的.com、.net的国际域结尾。不过比起使用免费域名来说的确是一大进步。想想也是,如果一个公众性个人站以”XXX的个人主页”这样的名称作为网站标题,以”abc.yeah.net”这样的免费域名作为网站域名,那这个公众性个人网站,又有什么理由让大家信服,让大家都参与进来?又怎么能更好的体现公众性网站这个性质特征呢?另外,需要指出,公众性个人站的类型多见于技术类(譬如病毒研究、黑客技术讨论)、IT类这样具有一定壁磊的网站类型中。

第三章:第四节:公益性

公益、公益、顾名思义,这种个人站性质,宣扬的主题是有利于社会与人民的公益事业,站长的行为是一种无私的奉献精神。


和公众性网站最大的不同是:公益性的个人站不需要多人的参与建设,不需要人人都是网站成员,更不需要遵守网站创业人拟定的规章制度(因为公益性个人站更多是起到普及公益知识的作用),而这些条件却是公众性个人站的必备要素。


如果说公众性个人站在个人网站领域中的数量本不多的话,那么这种公益性个人站的数量更是少之又少,究其原因,是因为公益这2个字,并不是很多人都愿意去做的,至少把自己的精力与网费搭进去,而没有什么实质性的回报,很多个人站长看起来有些无法接受。但很明显的一点是,无论是我们这些IT业内人士,个人站长的同行,还是普通的丝毫不懂技术的网民,都会对这种公益性网站的站长肃然起敬。


公益性站点一般以介绍社会上某种公益活动(譬如无偿献血)、或者宣扬有益人类的领域(如防范艾滋病,提倡环保等),平心而论这种性质的网站不应该是个人站长制作,而更多会由专门的政府部门、民事机构制作,可好在网上就有很多热心的网民,热心的站长,建立这种带有公益性质的个人站点。但如何使这种性质的站点在建成后,得到长期而稳定的更新(包括更新速度和更新信息的来源),已经成为公益性个人站发展的重要阻碍,一个瓶径问题了。


同时,需要指出,很多纪念型的个人站,也可以隶属于公益性的范畴,如网上很多不带个人色彩的纪念已故影视明星’翁美玲’(1983年香港连续剧《射雕英雄传》黄蓉的扮演者)的个人站点就是纯粹的公益性质个人网站。但要区分一点,就是纪念已故人物与介绍当红明星的个人站之区别,前者是公益性质的,后者多半不是。


还要区别,”XX基金会”,”XX委员会”这些虽然也是公益性的网站,但一看就能看出不是由个人制作的,这些政府网站、民间非赢利组织网站不在本书讨论范围之列。


例:公益性个人站的网站名称及使用域名并无特别规定和习惯,既可以是使用”XXX的个人主页”也可以是”XX协调组织”、”XX维护中心”,可使用国际/国内域名,也可以当仁不让的使用免费域名或者直接给出网站的IP地址连接。类型上多见于绿色环保网站、病毒防治网站等等偏门

小议数据库主键选取策略

0

分类 : 技术文摘 | 发表时间 22-11-2005

我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

常见的数据库主键选取方式有:

自动增长字段
手动增长字段
UniqueIdentifier
“COMB(Combine)”类型
一、自动增长型字段

很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主键键值。

尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:

Order(OrderID, OrderDate)
OrderDetial(OrderID, LineNum, ProductID, Price)

Order表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:

首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。显然它们是相互矛盾的。(此处表述有错误。吕震宇 2005-6-15)

【补充2005-6-15】———————————————

听棠.NET指出:主档放在事务中提交时,通过@@IDENTITY 就可以取到生成值的,因此可以传给明细当外键用,而且在事务发生错误回滚时,主档记录也会被回滚取消的。

吕震宇补充:使用自动增长字段会增加网络的roundTrip。尽管可以使用@@IDENTITY取得主键的值,但在更新过程中,不得不增加一次数据往返(以C/S结构为例):

1、客户端发送开始事务命令
2、客户端提交主表更新
3、服务器返回@@IDENTITY
4、客户端根据返回的主键更新从表缓冲
5、客户端将从表提交服务器更新
6、客户端提交事务

在这里多了一次往返就会增加了事务处理的时间。降低并发性能。

如果不用自动增长型字段,将是以下情景:

1、客户端发送开始事务命令
2、客户端提交主表更新
3、客户端提交从表更新
4、客户端提交事务

因此我不赞成使用自动增长型字段作为主键与外键链接的纽带。

————————————————

除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

ADO.NET允许我们在DataSet中将某一个字段设置为自动增长型字段,但千万记住,这个自动增长字段仅仅是个占位符而已,当数据库进行更新时,数据库生成的值会自动取代ADO.NET分配的值。所以为了防止用户产生误解,建议大家将ADO.NET中的自动增长初始值以及增量都设置成-1。此外,在ADO.NET中,我们可以为两张表建立DataRelation,这样存在级联关系的两张表更新时,一张表更新后另外一张表对应键的值也会自动发生变化,这会大大减少了我们对存在级联关系的两表间更新时自动增长型字段带来的麻烦。

二、手动增长型字段

既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个KeyName,就可以知道目前的KeyValue是什么,然后手工实现键值数据递增。在SQL Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:


CREATE PROCEDURE [GetKey]

@KeyName char(10),
@KeyValue int OUTPUT

AS
UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName
GO
这样,通过调用存储过程,我们可以获得最新键值,确保不会出现重复。若将OrderID字段设置为手动增长型字段,我们的程序可以由以下几步来实现:首先调用存储过程,获得一个OrderID,然后使用这个OrderID填充Order表与OrderDetail表,最后在事务保护下对两表进行更新。

使用手动增长型字段作为主键在进行数据库间数据复制时,可以确保数据合并过程中不会出现键值冲突,只要我们为不同的数据库分配不同的主键取值段就行了。但是,使用手动增长型字段会增加网络的RoundTrip,我们必须通过增加一次数据库访问来获取当前主键键值,这会增加网络和数据库的负载,当处于一个低速或断开的网络环境中时,这种做法会有很大的弊端。同时,手工维护主键还要考虑并发冲突等种种因素,这更会增加系统的复杂程度。

三、使用UniqueIdentifier

SQL Server为我们提供了UniqueIdentifier数据类型,并提供了一个生成函数NEWID( ),使用NEWID( )可以生成一个唯一的UniqueIdentifier。UniqueIdentifier在数据库中占用16个字节,出现重复的概率非常小,以至于可以认为是0。我们经常从注册表中看到类似

{45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}

的东西实际上就是一个UniqueIdentifier,Windows用它来做COM组件以及接口的标识,防止出现重复。在.NET里管UniqueIdentifier称之为GUID(Global Unique Identifier)。在C#中可以使用如下命令生成一个GUID:


Guid u = System.Guid.NewGuid();
对于上面提到的Order与OrderDetail的程序,如果选用UniqueIdentifier作为主键的话,我们完全可以避免上面提到的增加网络RoundTrip的问题。通过程序直接生成GUID填充主键,不用考虑是否会出现重复。

UniqueIdentifier字段也存在严重的缺陷:首先,它的长度是16字节,是整数的4倍长,会占用大量存储空间。更为严重的是,UniqueIdentifier的生成毫无规律可言,要想在上面建立索引(绝大多数数据库在主键上都有索引)是一个非常耗时的操作。有人做过实验,插入同样的数据量,使用UniqueIdentifier型数据做主键要比使用Integer型数据慢,所以,出于效率考虑,尽可能避免使用UniqueIdentifier型数据库作为主键键值。

四、使用“COMB(Combine)”类型

既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以
解决呢?答案是肯定的。通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的),可以在三者之间找到一个很好的平衡点。

COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:


DECLARE @aGuid UNIQUEIDENTIFIER

SET @aGuid = CAST(CAST(NEWID() AS BINARY(10))
+ CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
经过测试,使用COMB做主键比使用INT做主键,在检索、插入、更新、删除等操作上仍然显慢,但比Unidentifier类型要快上一些。关于测试数据可以参考我2004年7月21日的随笔。

除了使用存储过程实现COMB数据外,我们也可以使用C#生成COMB数据,这样所有主键生成工作可以在客户端完成。C#代码如下:

//================================================================
/**////<summary>
/// 返回 GUID 用于数据库操作,特定的时间代码可以提高检索效率
/// </summary>
/// <returns>COMB (GUID 与时间混合型) 类型 GUID 数据</returns>
public static Guid NewComb()
{
byte[] guidArray = System.Guid.NewGuid().ToByteArray();
DateTime baseDate = new DateTime(1900,1,1);
DateTime now = DateTime.Now;
// Get the days and milliseconds which will be used to build the byte string
TimeSpan days = new TimeSpan(now.Ticks – baseDate.Ticks);
TimeSpan msecs = new TimeSpan(now.Ticks – (new DateTime(now.Year, now.Month, now.Day).Ticks));

// Convert to a byte array
// Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333
byte[] daysArray = BitConverter.GetBytes(days.Days);
byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds/3.333333));

// Reverse the bytes to match SQL Servers ordering
Array.Reverse(daysArray);
Array.Reverse(msecsArray);

// Copy the bytes into the guid
Array.Copy(daysArray, daysArray.Length – 2, guidArray, guidArray.Length – 6, 2);
Array.Copy(msecsArray, msecsArray.Length – 4, guidArray, guidArray.Length – 4, 4);

return new System.Guid(guidArray);
}

//================================================================
/**//// <summary>
/// 从 SQL SERVER 返回的 GUID 中生成时间信息
/// </summary>
/// <param name=”guid”>包含时间信息的 COMB </param>
/// <returns>时间</returns>
public static DateTime GetDateFromComb(System.Guid guid)
{
DateTime baseDate = new DateTime(1900,1,1);
byte[] daysArray = new byte[4];
byte[] msecsArray = new byte[4];
byte[] guidArray = guid.ToByteArray();

// Copy the date parts of the guid to the respective byte arrays.
Array.Copy(guidArray, guidArray.Length – 6, daysArray, 2, 2);
Array.Copy(guidArray, guidArray.Length – 4, msecsArray, 0, 4);

// Reverse the arrays to put them into the appropriate order
Array.Reverse(daysArray);
Array.Reverse(msecsArray);

// Convert the bytes to ints
int days = BitConverter.ToInt32(daysArray, 0);
int msecs = BitConverter.ToInt32(msecsArray, 0);

DateTime date = baseDate.AddDays(days);
date = date.AddMilliseconds(msecs * 3.333333);

return date;
}


结语

数据库主键在数据库中占有重要地位。主键的选取策略决定了系统是否高效、易用。本文比较了四种主键选取策略的优缺点,并提供了相应的代码解决方案,希望对大家有所帮助。

web2.0新名词

0

分类 : 技术文摘 | 发表时间 14-10-2005

 人民网、新华网、新浪、搜狐等超级网站凭借强势的内容,常年驻扎在网民的收藏夹中。网民们美其名曰的“网上冲浪”其实就是围绕这些网络“恒星”所作的圆周运动,网民仅仅充当互联网的读者,而不是作者,这时的互联网是“只读”的。但Web 2.0 的出现,结束了了网民周期性赶集运动。借助Web 2.0 ,一个不仅“可读”,而且“可写”和“可交互”的互联网时代正逐渐浮出水面,随之而来的还有很多很多新兴的名词,本期视线将于您共享Web2.0时代的新名词。
 ●媒体类
★web2.0

  随着网络技术的日新月异,带有Web2.0特征的服务已经越来越多地进入网民的视野:RSS、SNS、Tag、Blog、P2P。Web2.0即个人媒体时代。个人媒体这一以个体为中心的个人平台实现了相对独立和完整的个人信息中心:个体制造信息、个体发布、个体承受影响并扩散到尽可能多的其他个体。这也正是Web2.0时代与Web1.0时代最大的区别。用户不再按照传统互联网“网络――人”的模式进行信息交流,而是按照“人――人”对话的模式,用户成为信息制造的中心,拥有更多点对点传递信息的渠道。

  ★博客Blog

  Blog是个人或群体以时间顺序所作的一种记录,且不断更新。Blog之间的交流主要是通过反向引用(TrackBack )和留言/ 评论(Comment )的方式来进行的。Blog的作者(Blogger ),既是这个Blog的创作人,也是其档案管理人 。

  ★播客Podcast

   Podcast,中文译名“播客”。它是数字广播技术的一种,出现初期借助一个叫“iPodder”的软件与一些便携播放器相结合而实现。Podcasting录制的是网络广播或类似的网络声讯节目,网友可将网上的广播节目下载到自己的iPod、MP3播放器或其它便携式数码声讯播放器中随身收听,不必端坐电脑前,也不必实时收听,享受随时随地的自由。更有意义的是,你还可以自己制作声音节目,并将其上传到网上与广大网友分享。 播客颠覆了被动收听广播的方式,使听众成为主动参与者。有人说,播客可能会像博客(Blog)一样,带来大众传媒的又一场革命。

  ★维客wiki、维基百科Wikipedia

   维客wikiWiki一词来源于夏威夷语的“weekeeweekee”,是“快点快点”(quick,quick)的意思。 Wiki一种超文本系统,这种超文本系统支持面向社群的协作式写作。使用者可以在Web的基础上对Wiki文本进行浏览、创建、更改。Wiki的写作者自然构成了一个社群,Wiki系统为这个社群提供简单的交流工具。

  1995年,沃德。坎宁安(Ward Cunningham )为了方便模式社群的交流创建了全世界第一个w i k i 系统――WikiWikiWeb (c2.com/cgi/wiki),并用它建立了波特兰模式知识库,在建立过程中,沃德。坎宁安创造了Wiki的概念和名称,并且实现了支持这些概念的服务系统。

  ★手机电视

  利用具有操作系统和视频功能的智能手机观看电视的业务。显然,由于手机用户普及率高且手机拥有携带方便等特性,手机电视业务显示出了比普通电视更广泛的影响力。 目前,手机电视业务的实现方式主要有三种。第一是利用蜂窝移动网络实现,如美国的Sprint、我国的中国移动和中国联通公司已经利用这种方式推出了手机电视业务。第二是利用卫星广播的方式,韩国的运营商计划采用这种方式。 第三种是在手机中安装数字电视的接收模块,直接接收数字电视信号。

●IT类


  ★RSS聚合新闻

  RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站。用于共享新闻和其他Web 内容的数据交换规范。读者可以通过RSS 订阅一个Blog,确知该Blog最近的更新。

  ★社会化书签

  社会化书签Social Bookmark它可以让你把喜爱的网站随时加入自己的网络书签中;你可以用多个关键词(Tag )而不是分类来标示和整理你的书签,并与其他人共享。

  ★SNS

  Social Networking Service (简称SNS ,社会化网络软件)是Web 2.0 体系下的一个技术应用架构。SNS 基于六度分隔理论运作,这个理论的通俗解释是:“在人脉网络中,要结识任何一位陌生的朋友,中间最多只要通过六个朋友就可以达到目的。”放在Web 2.0 的背景下,每个用户都拥有自己的Blog、自己维护的Wiki、社会化书签或者Podcast.用户通过Tag 、RSS 或者IM、邮件等方式连接到一起,“按照六度分隔理论,每个个体的社交圈都不断放大,最后成为一个大型网络,这就是社会化网络(SNS )。”

  ★Tag

  Tag(标签)是一种更为灵活、有趣的日志分类方式,您可以为每篇日志添加一个或多个Tag(标签),然后您可以看到BlogBus上所有和您使用了相同Tag的日志,并且由此和其他用户产生更多的联系和沟通。不仅如此,我们还通过与Technorati的合作,把您的Tag发送到全球Blog空间,和全世界的人们共同分享。

  ★闪客

  所谓“闪”就是指Flash(英文单词本意是指闪光、闪现),而“客”则是指从事某事的人,那么,闪客就是指做Flash的人。所谓“闪客”,也指经常使用Flash的人。“闪客”这个词源起于“闪客帝国”个人网站。如今,“闪客”已经与“黑客”、“博客”等概念一起,构成了风起云涌的网络亚文化浪潮。

  ★3G

  3G是英文3rdGeneration的缩写,指第三代移动通信技术。相对第一代模拟制式手机(1G)和第二代GSM、TDMA等数字手机(2G),第三代手机一般地讲,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。它能够处理图像、音乐、视频流等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。为了提供这种服务,无线网络必须能够支持不同的数据传输速度,也就是说在室内、室外和行车的环境中能够分别支持至少2Mbps(兆字节/每秒)、384kbps(千字节/每秒)以及144kbps的传输速度 。


生活类


  ★快闪族

  “快闪族”起源于2003年的美国纽约。 “快闪”意味着在一段时间里和陌生人分享你的生活,结成庞大阵容,直接宣泄某种情绪。

  ★小私

  私人保姆、私人律师、私人医生、私人美容师……“私人”定语覆盖了“小私”们全方位的生活空间。“小私”大多是教育背景高、职场得意的高收入男女,不仅解决了“小资”囊中羞涩的尴尬,还可以尽情彰显“小资”们已有的精神品性。

  ★极客

  “极客”的代表,个个名声显赫。陈天桥、丁磊、张朝阳、汪延……。 “极客(GEEK)”,起初是一般人对电脑黑客的贬称。如今,“极客”却代表着从事计算机技术的知识人才。这个新的精英亚文化群,被认为是21世纪高科技人才的典型代表。他们由受过一定教育、知识丰富、以技术为中心的青年所组成,年龄在21~34岁,是在虚拟化、数字化时代长大的第一代人。技术,是这一群体最显著的标志。 “极客”群体的大多数,还是系统分析员、系统设计员、程序开发员、技术管理员等技术人才。

  ★啃老族

  已经成年,并有谋生能力,却仍未“断奶”,得靠父母供养的年轻人。 目前
“啃老族”的构成主要有六类人群:一类是高校毕业生,对就业过于挑剔,总认为找不到满意的工作;二类是以工作太累太紧张、不适应为由自动离岗离职的;三类是“创业幻想型”的青年人,他们虽有强烈的创业愿望,但没有目标,缺乏真才实学,总是不成功又不愿“居人篱下”当个打工者;四类是频频跳槽者,跳来跳去最后“漂”到无事可做,;五类是单位里下岗的年轻人,习惯用过去轻松的工作与如今的紧张繁忙相对比,越比越不如意,干脆不就业,;最后一类是文化低、技能差,只能在中低端劳动力市场上找苦脏累工作,因怕苦怕累索性躺在家中“啃”父母。

  ★月光族

  “月光族” 已踏入社会,敢于超前消费、高档消费,敢于花明天的钱、花他人的钱享受自己今天的生活,花到两手空空。 “月光族”之忧,除了忧在未来赡养长辈和抚育子女,还忧在他们这种过于潇洒的生活态度。生活态度是从一个侧面反映了人生观。中国有句老话说得好:“艰难困苦,玉汝于成”。像这样在“幸福”中挥洒钱财和青春,在关爱中沉溺于生活享受的“月光族”,对家庭、社会有多少责任感,这让人心存疑虑。

走在互联网2.0时代的两只脚

0

分类 : 网络日志 | 发表时间 06-10-2005

  最近,关于Web 2.0的讨论非常之热烈。大家对于所谓Web2.0的界定也都热火朝天地感冒。我比较欣赏Keso和欣欣在搜狐林木专访时聊的,而陈一舟、开森、顺风、德胜、晓彬、未完成、老冒、学凌、老白、天舒等等N多网络明星们也有各有探讨。虽然彼此之间既有道合也有不同,但从高层的理念来讲,不妨说Web2.0是一种概念、一种服务、一种体验。

  当然,Web 2.0也是一种机会;当然,在有些“尖锐派”眼中Web 2.0也是什么都不是。

  我想,Web 2.0本身的演变,就如同软件2.0的演化一样,随着用户的需求的变化,对着开发社区的物化程度,随着商业回报的成形定位,一切都将像软件一样,在2.0的版本上——继续升级!

  目前阶段,大家把Web和2.0两个字分得开一点来看,来想想两者的交集和合集,就好了。如果要最简短地来阐释2.0所代表的,那就是一个字:新。

  所以,老美把个著名杂志叫Business 2.0,其寓意就是:我们讲述的是新的商业故事。Web 2.0也是一样,它的提出是一个理念上的发挥想象的框架,它激发我们来讲述自己的新的故事,激发网民对互联网新的渴求,激发各种商业和技术群体来考虑新的创意。当然,也会激怒1.0版的以“旧”方式讲故事的网站,也会激起广告精灵们的鲜活灵感,也会激活被热钱憋红了眼的投资商们麻袋里的钱。

  不过,我想说的不是概念,而是概念背后的一点人文理念。

  最近,我在集中火力专门调研IT方面的潮流,Web 2.0每天眼见的太多了,就像黑楠在超女上评说的,他听了“欧若拉”都要吐了,呵呵呵,可怜的黑楠,可怜的2.0分捡机Keso。

  我,当然还没有那么头晕的感觉,但是暂时先用“互联网2.0”同义替换一下也好。

  个人感觉,新版的互联网,涉及两个方面的人文体验:

  第一个方面,就是现在大家讨论很热烈的,信息获取方面的东西。比如,RSS订阅,比如门户的消亡(或者说退伍比较保险一些)。再比如,如何搜索、筛选、推荐博客信息等等。我本人也有几篇文章在讨论这个问题。不过,这只是互联网的新技术背景和网络文化推动后的一个方面的变化,是停留在技术给予人文需求的保证上的,是立足于受众一方的,是互联网上走路前行的一只脚。

  第二个方面,则是从互联网开天辟地之时就承诺了,而现在才开始兑现的,对于人文自身的外延需求的关怀。通俗地说,就是每个个体对自己的社会化的表达,是对在社会中的有限的不易改变的现实位置的网络延伸扩展与虚化变形。或者说,是自由的网络换上了自主的2.0版的技术后,人们对于自身倾诉、展示,以及个性张扬的渴望,不管是显形的还是隐性的,不管是意识的还是潜意识的,都将被激化、释放出来。

  这一方面,其实讨论也不少,不过相比于互联网2.0信息受众方面的研究,就小巫见大巫了。看来,互联网2.0新生儿的两只脚,不是很齐整。

  另外,我阅读了一些英文文章,从专业杂志上发表的文章数量的量化统计来说:关于互联网第一只脚的研究也是最多。显然,这个互联网人本问题的一个重要侧面,有待所有热心专家们更多的关心。

  我想,这主要是由于第一个方面更加可操作化,而第二个方面则更加隐性化、更加难以带有结论性地讨论。

  事实上,这方面的研究探讨,用社会学科研究领域近年来比较流行的定性研究分析方法(Qualitative Study),更加容易下手,但需要对“被试”个体进行跟踪和深入分析,是比较花气力的那类研究。

  有人会问了,我们凭感觉就行了,为什么要去讨论这个每个人都有的问题呢?是的,很多问题,我们靠直觉也就搞定了。但是,互联网2.0给予我们的恰恰是一个个性张扬的舞台,如果我们作为开发者、作为传播者,都只以自己的“我认为”来贯穿2.0版本的开篇和结局,那么这最多只能说是个不成功的框架,或者说只能算作1.1而不是2.0版。如果我们只在互联网2.0所赋予我们的空间来一瘸一拐地走路,那必定是走不快、不远的。

  所以,既然我们在讨论用户体验,在讨论互联网2.0带给我们的“新鲜”,就不能忽略了:就像我们在现实社会的马路上走路一样,互联网的宽带道路上,也是要用两只脚走路的。

  我们既需要互联列车的马力:RSS/TB/BlogSearch/SNA等技术引擎;也需要登上网络列车的动力:个性信息双向、加速流动的人文内化与外延激励。

  我们有理由相信,在互联网2.0版本的故事里,根深蒂固的人文驱动和个性的双向定制、交流和表达,就像网络交流吧台上的一杯醇酒,在互联世界的每一个角落,举樽倾琼、觥筹交错,让你惦念、流连,而又忘怀。

JSP应用程序开发中安全问题的实例解析

0

分类 : 技术文摘 | 发表时间 04-10-2005

 一、概述

  当网络编程越来越方便,系统功能越来越强大,安全性却指数倍地下降。这恐怕就是网络编程的不幸和悲哀了。各种动态内容生成环境繁荣了WWW,它们的设计目标就是为了给开发者更多的力量,给最终用户更多的方便。正因为如此,系统设计师和开发者必须明确地把安全问题作为一个考虑因素,事后追悔很难奏效。

  从安全的角度来看,服务器端WWW应用的弱点来源于各种各样的交互能力和传输通道。它们是攻击者直接可以用来影响系统的工具。在攻击者寻找和利用系统安全漏洞时,它们总是给系统安全带来压力。对付所有这些攻击的通用防卫策略就是所谓的输入验证。

  从同一层面考虑,主要有两种设计上的错误导致了安全方面的问题:

· 拙劣的访问控制。

· 对部署环境作隐含的假设。

  在有关安全的文献中,针对访问控制问题有着许多深入的分析。这里我们要讨论的是底层实现(代码和配置)上的安全管理问题,讨论的环境是JSP。或者说,我们将讨论恶意的用户输入伪装自身以及改变应用预定行为的各种方法,考虑如何检验输入合法性以及减少对信息和应用接口的不受欢迎的探测。

  二、JSP概述

  JSP技术允许把Java代码逻辑嵌入到HTML和XML文档之内,为创建和管理动态WWW内容带来了方便。JSP页面由JSP引擎预先处理并转换成Java Servlet,此后如果出现了对JSP页面的请求,Web服务器将用相应的Servlet输出结果作为应答。

  虽然JSP和Servlet在功能上是等价的,但是,和Servlet相比,JSP的动态内容生成方法恰好相反:JSP是把Java代码嵌入到文档之中,而不是把文档嵌入到Java应用之中。为访问外部功能和可重用的对象,JSP提供了一些用来和JavaBean组件交互的额外标记,这些标记的语法和HTML标记相似。

  值得注意的是:HTML语法属于JSP语法的一个子集(一个纯HTML文档是一个合法的JSP页面),但反过来不一定正确。特别地,为了便于动态生成内容和格式,JSP允许在标记之内嵌入其他标记。例如,下面是一段合法的JSP代码:

<A HREF = “<%= request.getRemoteUser() %>”>


  从本文后面可以看到,这种结构增加了安全问题的复杂性。

  与CGI相比,JSP具有更好的性能和会话管理(即会话状态持久化)机制。这主要通过在同一个进程之内运用Java线程处理多个Servlet实现,而CGI一般要求为每一个请求分别创建和拆除一个进程。

  三、安全问题

  由于完全开放了对服务器资源的访问,从JSP页面转换得到的不安全Servlet可能给服务器、服务器所在的网络、访问页面的客户机之中的任意一个或全体带来威胁,甚至通过DDoS或蠕虫分布式攻击,还可能影响到整个Internet。

  人们往往假定,Java作为一种类型安全的、具有垃圾收集能力的、具有沙箱(Sandbox)机制的语言,它能够奇迹般地保证软件安全。而且事实上,许多在其他语言中存在的低层次安全问题,比如缓冲或堆溢出,很少给Java程序带来危害。

  然而,这并不意味着人们很难写出不安全的Java程序,特别是对编写Servlet来说。验证输入和控制对资源的访问是始终必须关注的问题。另外,JSP的体系结构相当复杂,其中包含许多相互协作的子系统。这些子系统之间的交互常常是安全隐患的根源。

  除此之外,虽然现在所有的JSP实现都围绕着Java,但JSP规范允许几乎所有其他语言扮演这个角色。这样,这些替代语言的安全问题也必须加以考虑。

  简而言之,在JSP系统中产生安全漏洞的机会是相当多的。下面我们将讨论它们中最常见的一部分。

  四、非置信用户输入的一般问题

  非置信的用户输入(Untrusted User Input)实际上包含了所有的用户输入。用户输入来源于客户端,可以通过许多不同的途径到达服务器端,有时甚至是伪装的。为JSP服务器提供的用户输入包括(但不限于):

· 请求URL的参数部分;

· HTML表单通过POST或GET请求提交的数据;

· 在客户端临时保存的数据(也就是Cookie);

· 数据库查询;

· 其它进程设置的环境变量;

  用户输入的问题在于,它们由服务器端的应用程序解释,所以攻击者可以通过修改输入数据达到控制服务器脆弱部分的目的。服务器的脆弱部分常常表现为一些数据访问点,这些数据由用户提供的限定词标识,或通过执行外部程序得到。

  JSP能够调用保存在库里面的本地代码(通过JNI)以及执行外部命令。类Runtime提供了一个exec()方法。exec()方法把它的第一个参数视为一个需要在独立的进程中执行的命令行。如果这个命令字符串的某些部分必须从用户输入得到,则用户输入必须先进行过滤,确保系统所执行的命令和它们的参数都处于意料之内。

  即使命令字符串和用户输入没有任何关系,执行外部命令时仍旧必须进行必要的检查。在某些情况下,攻击者可能修改服务器的环境变量影响外部命令的执行。例如,修改path环境变量,让它指向一个恶意的程序,而这个恶意程序伪装成了exec()所调用程序的名字。

  为了避免这种危险,在进行任何外部调用之前显式地设置环境变量是一种较好的习惯。具体的设置方法是:在exec()调用中,把一个环境变量的数组作为第二个参数,数组中的元素必须是name=value格式。

  当用户输入用来标识程序打开的任意类型的输入/输出流时,类似的问题也会出现。访问文件、数据库或其他网络连接时不应该依赖于未经检验的用户输入。另外,打开一个流之后,把用户输入直接发送给它是很不安全的。

  对于SQL查询来说这一点尤其突出。下面访问JDBC API的JSP代码片断很不安全,因为攻击者可以在他提交的输入中嵌入分隔命令的字符,从而达到执行危险命令的目的:


<%@ page import=”java.sql.*” %>
<!– 这里加上一些打开SQL
Server连接的代码 –>
<% Statement stmt = connection.getStatement();
String query =
“SELECT * FROM USER_RECORDS WHERE USER = “
+ request.getParameter(“username”);
ResultSet result =
Statement.executeQuery(query);
%>


  如果username包含一个分号,例如:

http://server/db.jsp? username=joe;
SELECT%20*%20FROM%20SYSTEM_RECORDS


  一些版本的SQL Server会忽略整个查询,但还有一些版本的SQL Server将执行两个命令。如果是后者,攻击者就可以访问原本没有资格访问的数据库资源(假定Web服务器具有访问权限),进行适当的输入检验可以防止这类问题出现。

  五、输入检验

  从安全的角度来看,输入检验包括对来自外部数据源(非置信数据源,参见前面说明)的数据进行语法检查,有时还要进行语义检查。依赖于应用的关键程度和其他因素,作为输入检验结果而采取的动作可能是下面的一种或者多种:

· 忽略语法上不安全的成分;

· 用安全的代码替换不安全的部分;

· 中止使用受影响的代码;

· 报告错误;

· 激活一个
入侵监测系统;

  输入检验可以按照以下两种模式之一进行:列举不安全的字符并拒绝它们;定义一组安全的字符,然后排除和拒绝不安全的字符。这两种模式分别称为正向和反向输入过滤。一般地,正向输入过滤更简单和安全一些,因为许多时候,要列举出服务器端应用、客户端浏览器、Web服务器和操作系统可能误解的字符并不是一件容易的事情。

  六、GET请求和Cookie中的敏感数据

  就象CGI协议所定义的,把请求数据从客户端传输到服务器端最简单的方法是GET请求方法。使用GET请求方法时,输入数据附加到请求URL之后,格式如下:


URL[?name=value[&name=value[&...]]]


  显然,对于传输敏感数据来说,这种编码方式是不合适的,因为通常情况下,整个URL和请求字符串都以明文方式通过通信通道。所有路由设备都可以和服务器一样记录这些信息。如果要在客户请求中传输敏感数据,我们应该使用POST方法,再加上一种合适的加密机制(例如,通过SSL连接)。从JSP引擎的角度来看,在很大程度上,使用哪种传输方法无关紧要,因为两者的处理方式一样。

  在WWW的发展过程中,Netscape引入了Cookie的概念。Cookie是服务器保存到客户端的少量信息,服务器提取这些信息以维持会话状态或跟踪客户端浏览器的活动。JSP提供了一个response隐含对象的addCookie()方法,用来在客户端设置Cookie;提供了一个request()对象的getCookie()方法,用来提取Cookie的内容。

  Cookie是javax.servlet.http.Cookie类的实例。由于两个原因,如果把敏感数据保存到Cookie,安全受到了威胁:第一,Cookie的全部内容对客户端来说都是可见的;第二,虽然浏览器一般不提供伪造Cookie的能力,但没有任何东西能够阻止用户用完全伪造的Cookie应答服务器。一般而言,任何客户端浏览器提交的信息都不可以假定为绝对安全。

  七、通过嵌入标记实现的攻击

  CERT Advisory CA-2000-02描述了客户在请求中嵌入恶意HTML标记的问题。这个问题一般被称为“cross site scripting”问题,但它的名字有些用词不当,因为它不仅仅和脚本有关,同时,它和“跨越网站”(cross site)也没有什么特别的关系。不过,这个名字出现时,问题还没有被人们广泛了解。

  这种攻击通常包含一个由用户提交的病态脚本,或者包含恶意的HTML(或XML)标记,JSP引擎会把这些内容引入到动态生成的页面。这种攻击可能针对其他用户进行,也可能针对服务器,但后者不太常见。

  “cross site scripting”攻击的典型例子可以在论坛服务器上看到,因为这些服务器允许用户在自己提交的文章中嵌入格式化标记。通常,被滥用的标记是那些能够把代码嵌入到页面的标记,比如:

<SCRIPT>、<OBJECT>、<APPLET>和<EMBED>。


  另外还有一些标记也会带来危险,特别地,   可能被用于欺骗浏览者暴露敏感信息。下面是一个包含恶意标记的请求字符串的例子:

http://server/jsp_script.jsp?poster
=evilhacker& message=
<SCRIPT>evil_code</SCRIPT>


  要防止出现这种问题当然要靠输入检查和输出过滤。这类检查必须在服务器端进行,不应依赖于客户端脚本(比如javascript),因为没有任何东西能够阻止用户逃避客户端检验过程。下面的代码片断示范了如何在服务器端检查嵌入的标记:

<!– HTML代码结束 –>
<% String message =
request.getParameter(“message”);
message = message.replace (’<’,’_’);
message = message.replace (’>’,’_’);
message = message.replace (’”’,’_’);
message = message.replace (’’’,’_’);
message = message.replace (’%’,’_’);
message = message.replace (’;’,’_’);
message = message.replace (’(’,’_’);
message = message.replace (’)’,’_’);
message = message.replace (’&’,’_’);
message = message.replace (’+’,’_’);
%>
<p>


  你提交的消息是:

<hr/><tt><%= message %>
</tt><hr/></p>
<!– 下面加上其他HTML代码 –>


  由于要列举出所有不合法的字符比较困难,所以更安全的方法是进行正向过滤,即除了那些确实允许出现的字符之外(例如[A-Za-z0-9]),丢弃(或者转换)所有其他字符。

  八、关于JavaBean的说明

  JSP按照JavaBean规范描述的一系列约定,在JSP页面中快速、方便地访问可重用的组件(Java对象)。每个JavaBean组件封装了一些可以不依赖于调用环境而独立使用的数据和功能。Bean包含数据成员(属性),并通过Get和Set方法实现访问这些属性的标准API。

  为快速初始化指定Bean的所有属性,JSP提供了一种快捷方式,即在查询字符串中提供name=value对,并让它匹配目标属性的名字。考虑下面这个使用Bean的例子(以XML格式显示):

<jsp:useBean id=”myBasket”
class=”BasketBean”>
<jsp:setProperty name=”myBasket”
property=”*”/> <jsp:useBean>
<html>
<head><title>你的购物篮</title></head>
<body> <p> 你已经把商品:
<jsp::getProperty name=”myBasket”
property=”newItem”/> 加入到购物篮
<br/> 金额是$ <jsp::getProperty
name=”myBasket” property=”balance”/>
准备 <a href=”checkout.jsp”>付款</a>


  注意在setProperty方法调用中使用的通配符号“*”。这个符号指示JSP设置查询字符串中指定的所有属性的值。按照本意,这个脚本的调用方式如下:

http://server/addToBasket.jsp?newItem=ITEM0105342


  正常情况下,HTML表单构造的查询字符串就是这种形式。但问题在于,没有任何东西能够防止用户设置balance属性:

http://server/addToBasket.jsp?
newItem=ITEM0105342&balance=0


  处理页面的标记时,JSP容器会把这个参数映射到Bean中具有同样名字的balance属性,并尝试把该属性设置为0。

  为避免出现这种问题,JSP开发者必须在Bean的Set和Get方法中实现某种安全措施(Bean必须对属性进行强制的访问控制),同时,在使用的通配符时也应该小心谨慎。

  九、实现上的漏洞与源代码安全

  无论是哪一种JSP实现,在一定的阶段,它们的某些版本都会出现给系统带来危险的安全隐患,即使JSP开发者遵从了安全编程惯例也无济于事。例如,在Allaire的JRun的一个版本中,如果请求URL包含字符串“.jsp%00”作为JSP脚本扩展名的一部分,服务器不会忽略null字节,它会把页面视为一个静态的非JSP页面之类的东西。

  这样,服务器会请求操作系统打开该页面,而这时null字节却被忽略,结果提供给用户的是JSP页面的源代码而不是页面的执行结果。

  类似地,Tomcat的一个版本也有一个安全隐患。只要请求类如下面的格式,它会让攻击者看到JSP页面的源代码:


http://server/
page.js%2570



  这里的骗局在于,%25是URL编码的“%”,而70是“p”的十六进制值。Web服务器不会调用JSP处理器(因为URL没有以“.jsp”结尾),但静态文件处理器会设法把URL映射到正确的文件名字(再一次解码URL)。

  另外,许多Web服务器和JSP实现都带有示范脚本,这些示范脚本常常包含安全隐患。在把服务器部署到一个不无恶意的环境(即Internet)之前,禁止对所有这些脚本的访问有利于安全。

  简而言之,JSP开发者应该清楚:在自己正在开发的平台上,当前有哪些安全隐患。订阅BUGTRAQ和所有供应商提供的邮件列表是跟踪这类信息的好方法。

  结束语

  JSP和任何其他强大的技术一样。如果要保证被部署系统的安全和可靠,应用JSP时必须小心谨慎。在这篇文章中,我们简要地讨论了JSP脚本中常常出现的代码和配置级安全问题,提出了降低由此带来的安全风险的建议。

http://server/page.js%2570


  这里的骗局在于,%25是URL编码的“%”,而70是“p”的十六进制值。Web服务器不会调用JSP处理器(因为URL没有以“.jsp”结尾),但静态文件处理器会设法把URL映射到正确的文件名字(再一次解码URL)。

  另外,许多Web服务器和JSP实现都带有示范脚本,这些示范脚本常常包含安全隐患。在把服务器部署到一个不无恶意的环境(即Internet)之前,禁止对所有这些脚本的访问有利于安全。

  简而言之,JSP开发者应该清楚:在自己正在开发的平台上,当前有哪些安全隐患。订阅BUGTRAQ和所有供应商提供的邮件列表是跟踪这类信息的好方法。

  结束语

  JSP和任何其他强大的技术一样。如果要保证被部署系统的安全和可靠,应用JSP时必须小心谨慎。在这篇文章中,我们简要地讨论了JSP脚本中常常出现的代码和配置级安全问题,提出了降低由此带来的安全风险的建议。

http://server/jsp_script.jsp?poster
=evilhacker& message=
<SCRIPT>evil_code</SCRIPT>


  要防止出现这种问题当然要靠输入检查和输出过滤。这类检查必须在服务器端进行,不应依赖于客户端脚本(比如javascript),因为没有任何东西能够阻止用户逃避客户端检验过程。下面的代码片断示范了如何在服务器端检查嵌入的标记:

<!– HTML代码结束 –>
<% String message =
request.getParameter(“message”);
message = message.replace (’<’,’_’);
message = message.replace (’>’,’_’);
message = message.replace (’”’,’_’);
message = message.replace (’’’,’_’);
message = message.replace (’%’,’_’);
message = message.replace (’;’,’_’);
message = message.replace (’(’,’_’);
message = message.replace (’)’,’_’);
message = message.replace (’&’,’_’);
message = message.replace (’+’,’_’);
%>
<p>


  你提交的消息是:

<hr/><tt><%= message %>
</tt><hr/></p>
<!– 下面加上其他HTML代码 –>


  由于要列举出所有不合法的字符比较困难,所以更安全的方法是进行正向过滤,即除了那些确实允许出现的字符之外(例如[A-Za-z0-9]),丢弃(或者转换)所有其他字符。

  八、关于JavaBean的说明

  JSP按照JavaBean规范描述的一系列约定,在JSP页面中快速、方便地访问可重用的组件(Java对象)。每个JavaBean组件封装了一些可以不依赖于调用环境而独立使用的数据和功能。Bean包含数据成员(属性),并通过Get和Set方法实现访问这些属性的标准API。

  为快速初始化指定Bean的所有属性,JSP提供了一种快捷方式,即在查询字符串中提供name=value对,并让它匹配目标属性的名字。考虑下面这个使用Bean的例子(以XML格式显示):

<jsp:useBean id=”myBasket”
class=”BasketBean”>
<jsp:setProperty name=”myBasket”
property=”*”/> <jsp:useBean>
<html>
<head><title>你的购物篮</title></head>
<body> <p> 你已经把商品:
<jsp::getProperty name=”myBasket”
property=”newItem”/> 加入到购物篮
<br/> 金额是$ <jsp::getProperty
name=”myBasket” property=”balance”/>
准备 <a href=”checkout.jsp”>付款</a>


  注意在setProperty方法调用中使用的通配符号“*”。这个符号指示JSP设置查询字符串中指定的所有属性的值。按照本意,这个脚本的调用方式如下:

http://server/addToBasket.jsp?newItem=ITEM0105342


  正常情况下,HTML表单构造的查询字符串就是这种形式。但问题在于,没有任何东西能够防止用户设置balance属性:

http://server/addToBasket.jsp?
newItem=ITEM0105342&balance=0


  处理页面的标记时,JSP容器会把这个参数映射到Bean中具有同样名字的balance属性,并尝试把该属性设置为0。

  为避免出现这种问题,JSP开发者必须在Bean的Set和Get方法中实现某种安全措施(Bean必须对属性进行强制的访问控制),同时,在使用的通配符时也应该小心谨慎。

  九、实现上的漏洞与源代码安全

  无论是哪一种JSP实现,在一定的阶段,它们的某些版本都会出现给系统带来危险的安全隐患,即使JSP开发者遵从了安全编程惯例也无济于事。例如,在Allaire的JRun的一个版本中,如果请求URL包含字符串“.jsp%00”作为JSP脚本扩展名的一部分,服务器不会忽略null字节,它会把页面视为一个静态的非JSP页面之类的东西。

  这样,服务器会请求操作系统打开该页面,而这时null字节却被忽略,结果提供给用户的是JSP页面的源代码而不是页面的执行结果。

  类似地,Tomcat的一个版本也有一个安全隐患。只要请求类如下面的格式,它会让攻击者看到JSP页面的源代码:


http://server/page.js%2570


  这里的骗局在于,%25是URL编码的“%”,而70是“p”的十六进制值。Web服务器不会调用JSP处理器(因为URL没有以“.jsp”结尾),但静态文件处理器会设法把URL映射到正确的文件名字(再一次解码URL)。

  另外,许多Web服务器和JSP实现都带有示范脚本,这些示范脚本常常包含安全隐患。在把服务器部署到一个不无恶意的环境(即Internet)之前,禁止对所有这些脚本的访问有利于安全。

  简而言之,JSP开发者应该清楚:在自己正在开发的平台上,当前有哪些安全隐患。订阅BUGTRAQ和所有供应商提供的邮件列表是跟踪这类信息的好方法。

  结束语

  JSP和任何其他强大的技术一样。如果要保证被部署系统的安全和可靠,应用JSP时必须小心谨慎。在这篇文章中,我们简要地讨论了JSP脚本中常常出现的代码和配置级安全问题,提出了降低由此带来的安全风险的建议。

http://server/page.js%257
0



  这里的骗局在于,%25是URL编码的“%”,而70是“p”的十六进制值。Web服务器不会调用JSP处理器(因为URL没有以“.jsp”结尾),但静态文件处理器会设法把URL映射到正确的文件名字(再一次解码URL)。

  另外,许多Web服务器和JSP实现都带有示范脚本,这些示范脚本常常包含安全隐患。在把服务器部署到一个不无恶意的环境(即Internet)之前,禁止对所有这些脚本的访问有利于安全。

  简而言之,JSP开发者应该清楚:在自己正在开发的平台上,当前有哪些安全隐患。订阅BUGTRAQ和所有供应商提供的邮件列表是跟踪这类信息的好方法。

  结束语

  JSP和任何其他强大的技术一样。如果要保证被部署系统的安全和可靠,应用JSP时必须小心谨慎。在这篇文章中,我们简要地讨论了JSP脚本中常常出现的代码和配置级安全问题,提出了降低由此带来的安全风险的建议。

安全地卸载win2000域控制器

0

分类 : 技术文摘 | 发表时间 03-10-2005

在命令行运行:dcpromo 按照提示执行,其中它会提示你选最后一个域控制器还是备份域控制器,你选最后一个域控制器即OK,
如果你要卸载的不是最后一个域控制器且之前已出错,那你要先删除域控的数据
下面文章可供参考:
1.单击“开始”,依次指向“程序”、“附件”,然后单击“命令提示符”。
2.在命令提示符下,键入 ntdsutil,然后按 ENTER 键。
3.键入 metadata cleanup,然后按 ENTER 键。根据所给出的选项,管理员可以执行删除操作,但在实施删除之前还需要指定另外一些配置参数。
4.键入 connections,然后按 ENTER 键。此菜单用于连接将在其上发生这些更改的具体服务器。如果当前登录的用户没有管理员权限,可以在连接之前指定要使用的替代凭据。为此,请键入 set creds 域名用户名密码,然后按 ENTER 键。如果密码为空,则为密码参数键入 null。
5.键入 connect to server 服务器名称,然后按 ENTER 键。您会收到一条说明该连接已成功建立的确认消息。如果出现错误,请确认连接中所用的域控制器是否可用以及您提供的凭据对该服务器是否有管理权限。

备注:如果尝试连接的服务器正是要删除的服务器,那么在尝试删除第 15 步提到的服务器时,将显示以下错误信息:
Error 2094. The DSA Object cannot be deleted0x2094

6.键入 quit,然后按 ENTER 键。将显示 Metadata Cleanup 菜单。
7.键入 select operation target,然后按 ENTER 键。
8.键入 list domains,然后按 ENTER 键。将显示一个列出目录林中所有域的列表,每一个域都有一个关联的编号。
9.键入 select domain 编号,然后按 ENTER 键,其中编号 是与域关联的编号,要删除的服务器是该域的成员。您选择的域用于确定正在删除的服务器是否为该域的最后一个域控制器。
10.键入 list sites,然后按 ENTER 键。将显示一个站点列表,每一个站点都有一个关联的编号。
11.键入 select site 编号,然后按 ENTER 键,其中编号 是与站点关联的编号,要删除的服务器是该站点的成员。您会收到一条列出所选站点和域的确认消息。
12.键入 list servers in site,然后按 ENTER 键。将显示一个列出站点中所有服务器的列表,每一个服务器都有一个关联的编号。
13.键入 select server 编号,其中编号 是与要删除的服务器关联的编号。您会收到一条确认消息,其中列出所选的服务器、该服务器的“域名服务器”(DNS) 主机名,以及要删除的服务器计算机帐户的位置。
14.键入 quit,然后按 ENTER 键。将显示Metadata Cleanup 菜单。
15.键入 remove selected server,然后按 ENTER 键。您会收到一条说明删除成功的确认消息。如果出现以下错误信息:

Error 8419 (0x20E3)
The DSA object could not be found
则说明“NTDS 设置”对象可能已从 Active Directory 中删除,原因是其他管理员删除了该“NTDS 设置”对象,或在运行 DCPROMO 实用工具之后对成功删除对象这一操作进行了复制。

备注:尝试绑定到要删除的域控制器时,可能也会出现此错误。Ntdsutil 需要绑定到要用 metadata cleanup 删除的域控制器以外的其他域控制器。

16.在每个菜单上键入 quit,退出 NTDSUTIL 实用工具。您会收到一条说明连接已成功断开的确认消息。
17.在 DNS 的 _msdcs.目录林的根域 区域中删除 cname 记录。假定将要重新安装并重新提升 DC,因此使用新的全局唯一标识符 (GUID) 和 DNS 中匹配的 cname 记录来创建新的 NTDS 设置对象。您不会希望现有 DC 使用旧的 cname 记录。

最佳做法是删除主机名和其他 DNS 记录。如果分配给脱机服务器的“动态主机配置协议”(DHCP) 地址上所剩的租用时间被超出,另一个客户端即可获得问题 DC 的 IP 地址。

二.已经删除了 NTDS 设置对象,现在可以删除以下对象了:

1.使用 ADSIEdit 删除 OU=Domain Controllers,DC=domain… 中的计算机帐户

备注:删除计算机对象时,也将删除 FRS 订阅对象,因为它是计算机帐户的子对象。

2.使用 ADSIEdit 删除 CN=Domain System Volume (SYSVOL share),CN=file replication service,CN=system…. 中的 FRS 成员对象。
3.在 DNS 控制台中,使用 DNS MMC 删除 _msdcs 容器中的 cname(也称为“别名”)记录。
4.在 DNS 控制台中,使用 DNS MMC 删除 DNS 中的 A(也称为“主机”)记录。
5.如果删除的计算机是子域中的最后一个域控制器,而且该子域也已被删除,则使用 ADSIEdit 在 CN=System, DC=domain, DC=domain, Domain NC 中删除该子域的 trustDomain 对象

两台SqlServer数据同步解决方案

0

分类 : 技术文摘 | 发表时间 22-09-2005

利用数据库复制技术 实现数据同步更新
复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。

SQL复制的基本元素包括
出版服务器、订阅服务器、分发服务器、出版物、文章
SQL复制的工作原理
SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
SQL SERVER复制技术类型
SQL SERVER提供了三种复制技术,分别是:
1、快照复制(呆会我们就使用这个)
2、事务复制
3、合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
第一先来配置出版服务器
(1)选中指定[服务器]节点
(2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
(3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。
(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
第二创建出版物
(1)选中指定的服务器
(2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框
(3)选择要创建出版物的数据库,然后单击[创建发布]
(4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行”SQL SERVER 2000″的数据库服务器
(6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
(7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
第三设计订阅
(1)选中指定的订阅服务器
(2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
(3)按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。
(4)单击[完成]。完成订阅操作。
完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表—
一个手工同步的方案
–定时同步服务器上的数据
–例子:
–测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
–服务器上的表(查询分析器连接到服务器上创建)
create table [user](id int primary key,number varchar(4),name varchar(10))
go
–以下在局域网(本机操作)
–本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if exists (select * from dbo.sysobjects where id = object_id(N’[user]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
drop table [user]
GO
create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
go
–创建触发器,维护state字段的值
create trigger t_state on [user]
after update
as
update [user] set state=1
from [user] a join inserted b on a.id=b.id
where a.state is not null
go
–为了方便同步处理,创建链接服务器到要同步的服务器
–这里的远程服务器名为:xz,用户名为:sa,无密码
if exists(select 1 from master..sysservers where srvname=’srv_lnk’)
exec sp_dropserver ‘srv_lnk’,'droplogins’
go
exec sp_addlinkedserver ‘srv_lnk’,”,’SQLOLEDB’,'xz’
exec sp_addlinkedsrvlogin ‘srv_lnk’,'false’,null,’sa’
go
–创建同步处理的存储过程
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_synchro]‘) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[p_synchro]
GO
create proc p_synchro
as
–set XACT_ABORT on
–启动远程服务器的MSDTC服务
–exec master..xp_cmdshell ‘isql /S”xz” /U”sa” /P”" /q”exec master..xp_cmdshell ”net start msdtc”,no_output”‘,no_output
–启动本机的MSDTC服务
–exec master..xp_cmdshell ‘net start msdtc’,no_output
–进行分布事务处理,如果表用标识列做主键,用下面的方法
–BEGIN DISTRIBUTED TRANSACTION
–同步删除的数据
delete from srv_lnk.test.dbo.[user]
where id not in(select id from [user])
–同步新增的数据
insert into srv_lnk.test.dbo.[user]
select id,number,name from [user] where state is null
–同步修改的数据
update srv_lnk.test.dbo.[user] set
number=b.number,name=b.name
from srv_lnk.test.dbo.[user] a
join [user] b on a.id=b.id
where b.state=1
–同步后更新本机的标志
update [user] set state=0 where isnull(state,1)=1
–COMMIT TRAN
go
–创建作业,定时执行数据同步的存储过程
if exists(SELECT 1 from msdb..sysjobs where name=’数据处理’)
EXECUTE msdb.dbo.sp_delete_job @job_name=’数据处理’
exec msdb..sp_add_job @job_name=’数据处理’
–创建作业步骤
declare @sql varchar(800),@dbname varchar(250)
select @sql=’exec p_synchro’ –数据处理的命令
,@dbname=db_name() –执行数据处理的数据库名
exec msdb..sp_add_jobstep @job_name=’数据处理’,
@step_name = ‘数据同步’,
@subsystem = ‘TSQL’,
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, –重试次数
@retry_interval = 5 –重试间隔
–创建调度
EXEC msdb..sp_add_jobschedule @job_name = ‘数据处理’,
@name = ‘时间安排’,
@freq_type = 4, –每天
@freq_interval = 1, –每天执行一次
@active_start_time = 00000 –0点执行
go

无觅相关文章插件,快速提升流量