2005年08月28日
作者:MQ.Q    转贴自:pcicp.com    点击数:2972    更新时间:2004-4-6 

使用Windows的人非常多,而Windows系统的安全问题也越来越被人们关注。虽然Windows的漏洞众多,安全隐患也很多,不过经过适当的设置和调整,你还是可以用上相对安全的Windows的。本文就为你详细讲述了Windows的安全调整,希望对你有用。

这篇文章将针对一些常见的安全问题给你一些解决方法,其中大部分的操作都是针对Windows 2000/XP的,不保证在Windows 98/Me上可行。

准备活动

给系统安装补丁程序的重要性是不言而喻的,尤其是一些重要的安全补丁和针对IE,OE漏洞的补丁(即使你并不打算使用它们)。微软会经常的发布一些已知漏洞的修补程序,这些东西一般都可以通过Windows Update来安装。你需要做的只是经常性的访问Windows Update网站 。或者直接点击开始菜单中Windows Update的快捷方式。而Windows XP和最新的Windows 2000更加进步了,可以自动检查更新,在后台下载,完成后通知你下载完成并询问是否开始安装。对于Windows 2000/XP的用户,微软还提供了一个检查安全性的实用工具:基准安全分析器(Microsoft Baseline Security Analyzer),这个程序可以自动对你的系统进行安全性检测,并且对于出现的问题,都可以提供一个完整的解决方案。非常适合对于安全性要求高的用户使用。你可以在这里详细了解和下载这个工具。

在你安装了所有的补丁程序后,下面开始我们的调整设置。

重命名和禁用默认的帐户

安装好Windows后,系统会自动建立两个账户:Administrator和Guest,其中Administrator拥有最高的权限,Guest则只有基本的权限并且默认是禁用的。而这种默认的帐户在给你带来方便的同时也严重危害到了你的系统安全。如果有黑客入侵或者其他什么问题,他将轻易的得知你的超级用户的名称,剩下的就是寻找密码了。因此,安全的做法是把Administrator账户的名称改掉,然后再建立一个几乎没有任何权限的假Administrator账户。具体的方法是:

在运行中输入secpol.msc然后回车,打开“Local Security Settings(本地安全设置)”对话框,依次展开Local Policies(本地策略)-Security Options(安全选项),在右侧窗口有一个“Accounts: Rename administrator (guest) account(账户:重命名Administrator/Guest账户)”的策略,双击打开后可以给Administrator重新设置一个不是很引人注目的用户名。然后还可以再新建一个名称为Administrator的受限制用户,以迷惑闯入者。

安全选项的设置

同样是在Local Security Settings中,展开Local Policies-Security Options,这里还有很多其它的设置,经过合理的配置,可以使你的系统更加安全。一下列举的选项最好全部禁止:

Interactive logon: Do not require CTRL+ALT+DEL,交互式登录:不需要按Ctrl+Alt+Del。

Network access: Allow anonymous SID/name translation,网络访问:允许匿名SID/名称转换。

Network access: Let Everyone permissions apply to anonymous users,网络访问:让Everyone权限应用到匿名用户。

Recovery console: Allow automatic administrative logon,故障恢复控制台:允许自动系统管理级登录。

而以下的选项最好启用:

Devices: Restrict CD-ROM access to locally logged-on user only,设备:只有本地登录的用户才能访问CD-ROM。

Devices: Restrict floppy access to locally logged-on user only,设备:只有本地登录的用户才能访问软驱。

Interactive logon: Do not display last user name,交互式登录:不显示上一次使用的用户名。

Network access: Do not allow anonymous enumeration of SAM accounts,网络访问:不允许匿名SAM帐户的匿名枚举。

Network access: Do not allow anonymous enumeration of SAM accounts & shares,网络访问:不允许SAM账户和共享的匿名枚举。

Network security: Do not store LAN Manager hash value on next password change,网络安全:不要在下次更改密码时存储LAN Manager的Hash值。

System objects: Strengthen default permissions of internal system objects (e.g., Symbolic Links) ,系统对象:增强内部系统对象的默认权限(例如Symbolic Links)。




可靠的密码

尽管绝对安全的密码时不存在的,但是相对安全的密码还是可以实现的。这个还是需要运行secpol.msc来配置Local Security Settings。展开到Account Policies-Password Policy,经过这里的配置,你就可以建立一个完备密码策略,并且你的密码也可以得到最大限度的保护。

Enforce password history(强制密码历史)。这个设置决定了保存用户曾经用过的密码的个数。很多人知道要经常性的更换自己的密码,可是换来换去就是有限的几个在轮换,配置这个策略就可以知道用户更换的密码是否是以前曾经使用过的。如果再配合Maximum password age这个策略,就能保证密码安全了。默认情况下,这个策略不保存用户的密码,你可以自己设置,建议保存5个以上,而最多可以保存24个。

Maximum password age(密码最长存留期)。这个策略决定了一个密码可以使用多久,之后就会过期,并要求用户更换密码。如果设置为0,则密码永不过期。一般情况下设置为30到60天左右就可以了,具体的过期时间要看你的系统对安全的要求有多严格。而最长可以设置999天。

Minimum password age(密码最短存留期)。这个策略决定了一个密码要在使用了多久之后才能再次被使用。跟上面讲到的Enforce password history结合起来就可以得知新的密码是否是以前使用过的,如果是,则不能继续使用这个密码。如果设置为0则表示一个密码可以被无限制的重复使用,而最大值为999。

Minimum password length(密码长度最小值)。这个策略决定了一个密码的长度,有效值在0到14之间。如果设置为0,则表示不需要密码。建议的密码长度不能小于6位。

Password must meet complexity requirements(密码必须符合复杂性要求)。如果启用了这个策略,则在设置和更改一个密码的时候,系统将会按照下面的规则检查密码是否有效:密码不能包含全部或者部分的用户名。

最少包括6个字符。

并且在字符的使用上还要遵循以下的规则,密码必须是:

英文字母,A-Z,大小写敏感。

基本的10个数字,0-9。

不能包含特殊字符,例如!,$,#,%等等。

如果启用了这个策略,相信你的密码就会比较安全了。

Store password using reversible encryption for all users in the domain(为域中的所有用户使用可还原的加密来存储密码)。很明显,这个策略最好不要启用。




安全使用Internet Explorer

Internet Explorer是当今最流行的浏览器软件。因为使用的人多,因此IE被发现的安全性问题也就最多,不过没关系,看过本节,你完全可以使你的IE更加安全。需要注意的是,以下的叙述全部以IE 6.0版为准,如果你使用了较低的版本,有些细节方面可能会不一样。

打开Internet Explorer,依次点击工具-Internet选项,然后打开安全选项卡。

在安全选项卡中选择“Internet”,就可以针对Internet区域的一些安全选项进行设置。虽然有不同级别的默认设置,不过我们最好根据自己的实际情况亲自调整一下。点击下方的Custom Level(自定义级别)。会出现图三的窗口,这里显示了所有的IE安全设置。

Download signed ActiveX controls(下载已签名的ActiveX控件)。经过第三方的认证机构签名证明该ActiveX控件是安全的,并且你可以设置为允许下载这种控件,除非你不想安装任何ActiveX控件,或者你想自己从一些网站下载,例如Windows Update,还有播放Flash的插件等。

Download unsigned ActiveX controls(下载未签名的ActiveX控件)。跟经过签名认证的ActiveX控件相比,未经签名认证的可能会包含潜在的安全隐患因此这个选项你最好不要设置为启用,或禁用,或者设置为询问,这样你可以根据正在访问的站点的性质自己决定是否下载安装未经认证的控件。

Initialize & script ActiveX controls not marked as safe(对没有标记为安全的ActiveX控件进行初始化和脚本运行)。跟前面的设置类似的,如果你之前都设置为禁用,那么这个选项同样禁用就可以,否则可以设置为询问(建议的设置)或者允许(不建议)来禁止那些为经签名的控件运行。

Run ActiveX controls & plug-ins(运行ActiveX控件和插件)。假设你已经禁止了所有ActiveX控件和插件的运行,那么这个选项就可以放心的设置为管理员认可。这里不建议设置为允许。

Script ActiveX controls marked safe for scripting(对标记为可安全执行脚本的ActiveX控件执行脚本)。这个设置可以设置的跟前面的选项相同。

Active scripting(活动脚本)。现在各种的脚本程序非常流行,通过脚本程序可以建立很多实用的网页,例如Windows Update网页,就是通过脚本程序来判断你需要下载的补丁的。因此如果禁用掉脚本程序,一些网页将不能正常浏览。这里建议你设置为禁用,至于少数重要的但是不能正常浏览的网页,我们将在后面看到解决办法。

Allow paste operations via script(允许通过脚本进行粘贴操作)。这个选项允许网页通过脚本把文件复制进你的剪贴板,为了安全考虑最好禁用。

Scripting of Java applets(JAVA小程序脚本)。javascript是一种公开的,多平台,面向对象的脚本语言。很多网页中都使用了JAVA脚本,但是安全起见最好禁用它。

如果以上的设置会影响到少数你必须要访问的站点(例如Windows Update网站),但是安全起见你又不想把Internet区域的安全级别设置的太低,那么你可以把一些你信任的站点添加到Trusted sites(信任站点)中去。方法是:

在Internet选项的安全选项卡下,点击Trusted sites(信任站点),然后点击Sites(站点)按钮,会出现图四的窗口,在新窗口中输入我们希望添加的网络地址(例如https://windowsupdate.microsoft.com)然后点击右侧的Add(添加),这样就可以了。

现在,打开Internet选项中的Content(内容)选项卡,点击AutoComplete(自动完成),在这里也有一些东西需要调整。

对于所列出来的每一项,自动完成功能都会保存特定的内容,其中Web address(Web地址)会保存你在IE地址栏中输入过的内容; Forms(表单)会保存你在网页中填写的资料,例如论坛上的发言(除用户名和密码),搜索引擎中使用过的关键字;User names and passwords on forms(表单上的用户名和密码)会保存你登陆论坛或其它网页时输入的用户名和密码。自动完成可以帮助你节省很多时间,但是同时也带来了很大的安全隐患。一旦有人使用你的账号登陆,你登陆网站的用户名和密码等资料就有可能全部被别人看到。因此你可以根据你的电脑的使用情况适当的调整,决定哪些内容可以自动保存,哪些不行。

现在我们转到Internet选项的高级选项卡。这里有一下几点需要注意:

Use Passive FTP (for firewall & DSL modem compatibility)(使用被动FTP,为防火墙和DSL调制解调器兼容性),这个设置将会允许在使用IE浏览FTP服务器时使用被动模式 ,这种模式更加安全,因为服务器方无法获得你的IP地址,如果某些FTP服务器你不能正常访问,就可以试试启用或者禁用这个设置。


Check for publisher’s certificate revocation(检查发行商的证书吊销),如果选择了这个选项,当你访问某些需要认证的站点时,IE会首先检查给站点提供的证书是否依然有效。一般情况下,建议你启用这个设置。

Check for server certificate revocation(检查服务器的证书吊销),这个选项将会使IE检查站点服务器的证书是否仍然有效,一般也应该启用这个设置。

Check for signatures on downloaded programs(检查下载的程序的签名),如果启用了这个设置,在你下载了程序后IE会通过签名自动检查程序是否被非法改动过。一般应当启用这个设置。

Do not save encrypted page to disk(不将加密的页面存入硬盘),启用了这个选项后,对于加密页面(主要是URL以https打头的)将不会保存到Internet临时文件夹中。如果多人共用同一台电脑,这个选项是很有必要的,这样别人就无法通过Internet临时文件窥探到你访问过的加密网页了(例如某些电子商务网站的信用卡付费页面)。

接下来的三个设置:Use SSL 2.0, Use SSL 3.0 & Use TLS 1.0( 使用SSL 2.0, 使用SSL 3.0和使用 TLS 1.0)都跟在Internet上通过协议加密数据有关。例如一些网站的身分认证和重要数据的传输,在这过程中都会使用到SSL加密。因此最佳建议是这三个选项全部启用。但是如果启用后你访问某些加密站点时出现错误,那么可以禁用除SSL 2.0之外的其它两个协议,因为不同版本之间可能会有冲突,而SSL 2.0是被采用的最广泛的,一般的加密站点都会支持。

Warn about invalid site certificates(对无效站点证书发出警告),启用这个设置之后,在遇到无效的站点证书时IE就会发出警告,提醒你注意。一般情况下可以启用这个。

Warn about changing between secure & not secure mode(在安全和非安全模式之间转换时发出警告),当启用这个设置之后,如果你要从一个安全的网页(可能是经过SSL加密的)进入到一个不安全的网页的时候,IE会发出警告提醒你,以避免你在不知情的情况下泄漏一些私人的信息。

Warn if forms submittal is being redirected(重定向提交的表单时发出警告),启用这个设置后,你在某些论坛或类似的地方提交的一些信息如果被发送到了其它的服务器上,IE就会发出警报提醒你。所以安全起见这个也应当启用。


安全使用Outlook Express

Outlook Express是Windows自带的一个电子邮件程序,通过OE不仅可以收发电子邮件,还可以浏览新闻组,十分方便。不过很多人并不喜欢这个程序,还想千方百计的把它从自己的系统中卸载掉,主要是因为使用OE容易传染病毒。菜刀也容易伤人呢,但是每个家庭都得有个菜刀吧,所以,与其考虑怎么卸载OE还不如考虑一下怎么设置才能让OE更安全。本节全部以OE 6为主,如果你使用得是较低的版本,某些细节方面可能会不同。

OE的主要设置都可以在工具-选项下看到,在这里我们主要关注的是安全选项卡。

Select the Internet Explorer security zone to use(选择要使用的Internet Explorer安全区域),这个设置可以让你决定把电子邮件(尤其是使用HTML语言的电子邮件)当作什么安全区域对待(也就是我们在Internet Explorer的Internet选项中设置的不同安全级别的区域).把它设置为Restricted sites zone(受限制的区域)是比较明智和安全的做法。这样,如果你收到的HTML邮件中含有一些有害的代码就不会危害到你的系统了。

Warn me when other applications try to send mail as me(当其他程序以我的名义发送电子邮件时提醒我),这也是一个很有效的安全策略,曾经有很多病毒都是通过OE的地址簿中的联系人地址来发送含病毒的右键来扩散的,而启用这个设置就可以有效的解决这个问题。一旦有其他程序通过OE发送电子邮件,OE会首先询问你是否发送,对于那些可疑的右键,只要取消发送就可以了。

Do not allow attachments to be saved or opened that could potentially be a virus(不允许可能包含病毒的附件被保存或者被打开),当启用这个设置后,电子邮件中某些格式的附件就不能被保存和打开了,这时如果你收到了含有附件的右键,保存和打开附件的选项将为不可用,进一步增强了安全性。

加固你的Internet连接

默认情况下,为了建立网络连接,Windows会安装很多协议和运行很多服务其中一些协议和服务都不是必须的,例如NetBIOS、文件和打印机共享等,而“最小的服务+最小的权限=最大的安全”这个等式是永远成立的,因此我们有必要关掉不需要的服务,卸载不需要的协议,来增强我们的系统安全。

对于Windows 9x/Me的系统

1.在控制面板中双击网络图标

2.选择Microsoft网络客户端,然后点击卸载

3.禁用文件和打印机共享,如果你确实需要共享,可以给它们设置一个密码

4.选择TCP/IP,然后点击属性按钮,打开NetBIOS选项卡,取消对“我要在TCP/IP上使用NetBIOS的选择。然后选择DNS设置选项卡,并选择禁用DNS(如果你确实不需要的话)。在WINS设置选项卡下,选中禁用WINS解析

5.确定,然后重启动电脑

对于Windows 2000/XP的系统

1.打开控制面板中的网络连接,右键点击Internet连接,选择属性

2.如果你不需要共享文件和打印机,那么选中并卸载(可以不卸载,但是至少不要再使用)Windows网络的文件和打印机共享

3.双击Internet 协议 (TCP/IP),然后点击高级按钮

4.打开WINS选项卡,取消对启用LMHOSTS查询的选择,然后选择禁用TCP/IP上的NetBIOS

5.在运行中输入Services.msc然后回车

6.找到TCP/IP NetBIOS Helper这个服务,把这个服务停止掉,并且设置启动类型为手动或者禁止

7. 重启动电脑

防火墙和杀毒软件

不管你做了怎样的设置,只要你连接在Internet上,防火墙都是必要的。防火墙可以完全保护你的系统,把网络上有害的东西挡在门外。推荐你使用的防火墙主要有两种,一是Symantec公司的Norton Internet Security,这个软件不仅包含网络防火墙,还包含Norton Antivirus,一个著名的杀毒软件。Norton Internet Security的功能非常强大,不仅可以防病毒,防黑客,还可以帮助你过滤浏览网页时看到的广告,过滤收到的电子邮件,过滤网络中的一些色情和其它非法内容。不过Norton Internet Security对系统的要求比较高老的电脑运行起来可能会慢一些。这样的话你可以试试Zone Alarm或者国产的天网,他们对系统的要求都不错,功能也够强大,还有一点,他们两者都可以从互联网上免费下载到。

对于使用Windows XP的用户也可以用系统自带的防火墙,虽然没有那么多花哨的功能,不过最基本的防护还是可以胜任的。启用的方法是:打开控制面板-网络和Internet连接,双击网络连接打开属性对话框,在高级选项卡下,选中在我的电脑上使用Internet连接防火墙,之后还可以点击设置进行更进一步的配置。

总结

经过以上的设置,你的系统安全应该提高不少了,不过需要注意的是,不管在系统和软件上做怎样的防护,正确的使用习惯才是最重要的,因此从现在就开始养成良好的使用习惯的,否则在怎么防护也是白搭。希望你能有一个安全的系统!

使用Windows的人非常多,而Windows系统的安全问题也越来越被人们关注。虽然Windows的漏洞众多,安全隐患也很多,不过经过适当的设置和调整,你还是可以用上相对安全的Windows的。本文就为你详细讲述了Windows的安全调整,希望对你有用。

这篇文章将针对一些常见的安全问题给你一些解决方法,其中大部分的操作都是针对Windows 2000/XP的,不保证在Windows 98/Me上可行。

准备活动

给系统安装补丁程序的重要性是不言而喻的,尤其是一些重要的安全补丁和针对IE,OE漏洞的补丁(即使你并不打算使用它们)。微软会经常的发布一些已知漏洞的修补程序,这些东西一般都可以通过Windows Update来安装。你需要做的只是经常性的访问Windows Update网站 。或者直接点击开始菜单中Windows Update的快捷方式。而Windows XP和最新的Windows 2000更加进步了,可以自动检查更新,在后台下载,完成后通知你下载完成并询问是否开始安装。对于Windows 2000/XP的用户,微软还提供了一个检查安全性的实用工具:基准安全分析器(Microsoft Baseline Security Analyzer),这个程序可以自动对你的系统进行安全性检测,并且对于出现的问题,都可以提供一个完整的解决方案。非常适合对于安全性要求高的用户使用。你可以在这里详细了解和下载这个工具。

在你安装了所有的补丁程序后,下面开始我们的调整设置。

重命名和禁用默认的帐户

安装好Windows后,系统会自动建立两个账户:Administrator和Guest,其中Administrator拥有最高的权限,Guest则只有基本的权限并且默认是禁用的。而这种默认的帐户在给你带来方便的同时也严重危害到了你的系统安全。如果有黑客入侵或者其他什么问题,他将轻易的得知你的超级用户的名称,剩下的就是寻找密码了。因此,安全的做法是把Administrator账户的名称改掉,然后再建立一个几乎没有任何权限的假Administrator账户。具体的方法是:

在运行中输入secpol.msc然后回车,打开“Local Security Settings(本地安全设置)”对话框,依次展开Local Policies(本地策略)-Security Options(安全选项),在右侧窗口有一个“Accounts: Rename administrator (guest) account(账户:重命名Administrator/Guest账户)”的策略,双击打开后可以给Administrator重新设置一个不是很引人注目的用户名。然后还可以再新建一个名称为Administrator的受限制用户,以迷惑闯入者。

安全选项的设置

同样是在Local Security Settings中,展开Local Policies-Security Options,这里还有很多其它的设置,经过合理的配置,可以使你的系统更加安全。一下列举的选项最好全部禁止:

Interactive logon: Do not require CTRL+ALT+DEL,交互式登录:不需要按Ctrl+Alt+Del。

Network access: Allow anonymous SID/name translation,网络访问:允许匿名SID/名称转换。

Network access: Let Everyone permissions apply to anonymous users,网络访问:让Everyone权限应用到匿名用户。

Recovery console: Allow automatic administrative logon,故障恢复控制台:允许自动系统管理级登录。

而以下的选项最好启用:

Devices: Restrict CD-ROM access to locally logged-on user only,设备:只有本地登录的用户才能访问CD-ROM。

Devices: Restrict floppy access to locally logged-on user only,设备:只有本地登录的用户才能访问软驱。

Interactive logon: Do not display last user name,交互式登录:不显示上一次使用的用户名。

Network access: Do not allow anonymous enumeration of SAM accounts,网络访问:不允许匿名SAM帐户的匿名枚举。

Network access: Do not allow anonymous enumeration of SAM accounts & shares,网络访问:不允许SAM账户和共享的匿名枚举。

Network security: Do not store LAN Manager hash value on next password change,网络安全:不要在下次更改密码时存储LAN Manager的Hash值。

System objects: Strengthen default permissions of internal system objects (e.g., Symbolic Links) ,系统对象:增强内部系统对象的默认权限(例如Symbolic Links)。




可靠的密码

尽管绝对安全的密码时不存在的,但是相对安全的密码还是可以实现的。这个还是需要运行secpol.msc来配置Local Security Settings。展开到Account Policies-Password Policy,经过这里的配置,你就可以建立一个完备密码策略,并且你的密码也可以得到最大限度的保护。

Enforce password history(强制密码历史)。这个设置决定了保存用户曾经用过的密码的个数。很多人知道要经常性的更换自己的密码,可是换来换去就是有限的几个在轮换,配置这个策略就可以知道用户更换的密码是否是以前曾经使用过的。如果再配合Maximum password age这个策略,就能保证密码安全了。默认情况下,这个策略不保存用户的密码,你可以自己设置,建议保存5个以上,而最多可以保存24个。

Maximum password age(密码最长存留期)。这个策略决定了一个密码可以使用多久,之后就会过期,并要求用户更换密码。如果设置为0,则密码永不过期。一般情况下设置为30到60天左右就可以了,具体的过期时间要看你的系统对安全的要求有多严格。而最长可以设置999天。

Minimum password age(密码最短存留期)。这个策略决定了一个密码要在使用了多久之后才能再次被使用。跟上面讲到的Enforce password history结合起来就可以得知新的密码是否是以前使用过的,如果是,则不能继续使用这个密码。如果设置为0则表示一个密码可以被无限制的重复使用,而最大值为999。

Minimum password length(密码长度最小值)。这个策略决定了一个密码的长度,有效值在0到14之间。如果设置为0,则表示不需要密码。建议的密码长度不能小于6位。

Password must meet complexity requirements(密码必须符合复杂性要求)。如果启用了这个策略,则在设置和更改一个密码的时候,系统将会按照下面的规则检查密码是否有效:密码不能包含全部或者部分的用户名。

最少包括6个字符。

并且在字符的使用上还要遵循以下的规则,密码必须是:

英文字母,A-Z,大小写敏感。

基本的10个数字,0-9。

不能包含特殊字符,例如!,$,#,%等等。

如果启用了这个策略,相信你的密码就会比较安全了。

Store password using reversible encryption for all users in the domain(为域中的所有用户使用可还原的加密来存储密码)。很明显,这个策略最好不要启用。




安全使用Internet Explorer

Internet Explorer是当今最流行的浏览器软件。因为使用的人多,因此IE被发现的安全性问题也就最多,不过没关系,看过本节,你完全可以使你的IE更加安全。需要注意的是,以下的叙述全部以IE 6.0版为准,如果你使用了较低的版本,有些细节方面可能会不一样。

打开Internet Explorer,依次点击工具-Internet选项,然后打开安全选项卡。

在安全选项卡中选择“Internet”,就可以针对Internet区域的一些安全选项进行设置。虽然有不同级别的默认设置,不过我们最好根据自己的实际情况亲自调整一下。点击下方的Custom Level(自定义级别)。会出现图三的窗口,这里显示了所有的IE安全设置。

Download signed ActiveX controls(下载已签名的ActiveX控件)。经过第三方的认证机构签名证明该ActiveX控件是安全的,并且你可以设置为允许下载这种控件,除非你不想安装任何ActiveX控件,或者你想自己从一些网站下载,例如Windows Update,还有播放Flash的插件等。

Download unsigned ActiveX controls(下载未签名的ActiveX控件)。跟经过签名认证的ActiveX控件相比,未经签名认证的可能会包含潜在的安全隐患因此这个选项你最好不要设置为启用,或禁用,或者设置为询问,这样你可以根据正在访问的站点的性质自己决定是否下载安装未经认证的控件。

Initialize & script ActiveX controls not marked as safe(对没有标记为安全的ActiveX控件进行初始化和脚本运行)。跟前面的设置类似的,如果你之前都设置为禁用,那么这个选项同样禁用就可以,否则可以设置为询问(建议的设置)或者允许(不建议)来禁止那些为经签名的控件运行。

Run ActiveX controls & plug-ins(运行ActiveX控件和插件)。假设你已经禁止了所有ActiveX控件和插件的运行,那么这个选项就可以放心的设置为管理员认可。这里不建议设置为允许。

Script ActiveX controls marked safe for scripting(对标记为可安全执行脚本的ActiveX控件执行脚本)。这个设置可以设置的跟前面的选项相同。

Active scripting(活动脚本)。现在各种的脚本程序非常流行,通过脚本程序可以建立很多实用的网页,例如Windows Update网页,就是通过脚本程序来判断你需要下载的补丁的。因此如果禁用掉脚本程序,一些网页将不能正常浏览。这里建议你设置为禁用,至于少数重要的但是不能正常浏览的网页,我们将在后面看到解决办法。

Allow paste operations via script(允许通过脚本进行粘贴操作)。这个选项允许网页通过脚本把文件复制进你的剪贴板,为了安全考虑最好禁用。

Scripting of Java applets(JAVA小程序脚本)。javascript是一种公开的,多平台,面向对象的脚本语言。很多网页中都使用了JAVA脚本,但是安全起见最好禁用它。

如果以上的设置会影响到少数你必须要访问的站点(例如Windows Update网站),但是安全起见你又不想把Internet区域的安全级别设置的太低,那么你可以把一些你信任的站点添加到Trusted sites(信任站点)中去。方法是:

在Internet选项的安全选项卡下,点击Trusted sites(信任站点),然后点击Sites(站点)按钮,会出现图四的窗口,在新窗口中输入我们希望添加的网络地址(例如https://windowsupdate.microsoft.com)然后点击右侧的Add(添加),这样就可以了。

现在,打开Internet选项中的Content(内容)选项卡,点击AutoComplete(自动完成),在这里也有一些东西需要调整。

对于所列出来的每一项,自动完成功能都会保存特定的内容,其中Web address(Web地址)会保存你在IE地址栏中输入过的内容; Forms(表单)会保存你在网页中填写的资料,例如论坛上的发言(除用户名和密码),搜索引擎中使用过的关键字;User names and passwords on forms(表单上的用户名和密码)会保存你登陆论坛或其它网页时输入的用户名和密码。自动完成可以帮助你节省很多时间,但是同时也带来了很大的安全隐患。一旦有人使用你的账号登陆,你登陆网站的用户名和密码等资料就有可能全部被别人看到。因此你可以根据你的电脑的使用情况适当的调整,决定哪些内容可以自动保存,哪些不行。

现在我们转到Internet选项的高级选项卡。这里有一下几点需要注意:

Use Passive FTP (for firewall & DSL modem compatibility)(使用被动FTP,为防火墙和DSL调制解调器兼容性),这个设置将会允许在使用IE浏览FTP服务器时使用被动模式 ,这种模式更加安全,因为服务器方无法获得你的IP地址,如果某些FTP服务器你不能正常访问,就可以试试启用或者禁用这个设置。


Check for publisher’s certificate revocation(检查发行商的证书吊销),如果选择了这个选项,当你访问某些需要认证的站点时,IE会首先检查给站点提供的证书是否依然有效。一般情况下,建议你启用这个设置。

Check for server certificate revocation(检查服务器的证书吊销),这个选项将会使IE检查站点服务器的证书是否仍然有效,一般也应该启用这个设置。

Check for signatures on downloaded programs(检查下载的程序的签名),如果启用了这个设置,在你下载了程序后IE会通过签名自动检查程序是否被非法改动过。一般应当启用这个设置。

Do not save encrypted page to disk(不将加密的页面存入硬盘),启用了这个选项后,对于加密页面(主要是URL以https打头的)将不会保存到Internet临时文件夹中。如果多人共用同一台电脑,这个选项是很有必要的,这样别人就无法通过Internet临时文件窥探到你访问过的加密网页了(例如某些电子商务网站的信用卡付费页面)。

接下来的三个设置:Use SSL 2.0, Use SSL 3.0 & Use TLS 1.0( 使用SSL 2.0, 使用SSL 3.0和使用 TLS 1.0)都跟在Internet上通过协议加密数据有关。例如一些网站的身分认证和重要数据的传输,在这过程中都会使用到SSL加密。因此最佳建议是这三个选项全部启用。但是如果启用后你访问某些加密站点时出现错误,那么可以禁用除SSL 2.0之外的其它两个协议,因为不同版本之间可能会有冲突,而SSL 2.0是被采用的最广泛的,一般的加密站点都会支持。

Warn about invalid site certificates(对无效站点证书发出警告),启用这个设置之后,在遇到无效的站点证书时IE就会发出警告,提醒你注意。一般情况下可以启用这个。

Warn about changing between secure & not secure mode(在安全和非安全模式之间转换时发出警告),当启用这个设置之后,如果你要从一个安全的网页(可能是经过SSL加密的)进入到一个不安全的网页的时候,IE会发出警告提醒你,以避免你在不知情的情况下泄漏一些私人的信息。

Warn if forms submittal is being redirected(重定向提交的表单时发出警告),启用这个设置后,你在某些论坛或类似的地方提交的一些信息如果被发送到了其它的服务器上,IE就会发出警报提醒你。所以安全起见这个也应当启用。


安全使用Outlook Express

Outlook Express是Windows自带的一个电子邮件程序,通过OE不仅可以收发电子邮件,还可以浏览新闻组,十分方便。不过很多人并不喜欢这个程序,还想千方百计的把它从自己的系统中卸载掉,主要是因为使用OE容易传染病毒。菜刀也容易伤人呢,但是每个家庭都得有个菜刀吧,所以,与其考虑怎么卸载OE还不如考虑一下怎么设置才能让OE更安全。本节全部以OE 6为主,如果你使用得是较低的版本,某些细节方面可能会不同。

OE的主要设置都可以在工具-选项下看到,在这里我们主要关注的是安全选项卡。

Select the Internet Explorer security zone to use(选择要使用的Internet Explorer安全区域),这个设置可以让你决定把电子邮件(尤其是使用HTML语言的电子邮件)当作什么安全区域对待(也就是我们在Internet Explorer的Internet选项中设置的不同安全级别的区域).把它设置为Restricted sites zone(受限制的区域)是比较明智和安全的做法。这样,如果你收到的HTML邮件中含有一些有害的代码就不会危害到你的系统了。

Warn me when other applications try to send mail as me(当其他程序以我的名义发送电子邮件时提醒我),这也是一个很有效的安全策略,曾经有很多病毒都是通过OE的地址簿中的联系人地址来发送含病毒的右键来扩散的,而启用这个设置就可以有效的解决这个问题。一旦有其他程序通过OE发送电子邮件,OE会首先询问你是否发送,对于那些可疑的右键,只要取消发送就可以了。

Do not allow attachments to be saved or opened that could potentially be a virus(不允许可能包含病毒的附件被保存或者被打开),当启用这个设置后,电子邮件中某些格式的附件就不能被保存和打开了,这时如果你收到了含有附件的右键,保存和打开附件的选项将为不可用,进一步增强了安全性。

加固你的Internet连接

默认情况下,为了建立网络连接,Windows会安装很多协议和运行很多服务其中一些协议和服务都不是必须的,例如NetBIOS、文件和打印机共享等,而“最小的服务+最小的权限=最大的安全”这个等式是永远成立的,因此我们有必要关掉不需要的服务,卸载不需要的协议,来增强我们的系统安全。

对于Windows 9x/Me的系统

1.在控制面板中双击网络图标

2.选择Microsoft网络客户端,然后点击卸载

3.禁用文件和打印机共享,如果你确实需要共享,可以给它们设置一个密码

4.选择TCP/IP,然后点击属性按钮,打开NetBIOS选项卡,取消对“我要在TCP/IP上使用NetBIOS的选择。然后选择DNS设置选项卡,并选择禁用DNS(如果你确实不需要的话)。在WINS设置选项卡下,选中禁用WINS解析

5.确定,然后重启动电脑

对于Windows 2000/XP的系统

1.打开控制面板中的网络连接,右键点击Internet连接,选择属性

2.如果你不需要共享文件和打印机,那么选中并卸载(可以不卸载,但是至少不要再使用)Windows网络的文件和打印机共享

3.双击Internet 协议 (TCP/IP),然后点击高级按钮

4.打开WINS选项卡,取消对启用LMHOSTS查询的选择,然后选择禁用TCP/IP上的NetBIOS

5.在运行中输入Services.msc然后回车

6.找到TCP/IP NetBIOS Helper这个服务,把这个服务停止掉,并且设置启动类型为手动或者禁止

7. 重启动电脑

防火墙和杀毒软件

不管你做了怎样的设置,只要你连接在Internet上,防火墙都是必要的。防火墙可以完全保护你的系统,把网络上有害的东西挡在门外。推荐你使用的防火墙主要有两种,一是Symantec公司的Norton Internet Security,这个软件不仅包含网络防火墙,还包含Norton Antivirus,一个著名的杀毒软件。Norton Internet Security的功能非常强大,不仅可以防病毒,防黑客,还可以帮助你过滤浏览网页时看到的广告,过滤收到的电子邮件,过滤网络中的一些色情和其它非法内容。不过Norton Internet Security对系统的要求比较高老的电脑运行起来可能会慢一些。这样的话你可以试试Zone Alarm或者国产的天网,他们对系统的要求都不错,功能也够强大,还有一点,他们两者都可以从互联网上免费下载到。

对于使用Windows XP的用户也可以用系统自带的防火墙,虽然没有那么多花哨的功能,不过最基本的防护还是可以胜任的。启用的方法是:打开控制面板-网络和Internet连接,双击网络连接打开属性对话框,在高级选项卡下,选中在我的电脑上使用Internet连接防火墙,之后还可以点击设置进行更进一步的配置。

总结

经过以上的设置,你的系统安全应该提高不少了,不过需要注意的是,不管在系统和软件上做怎样的防护,正确的使用习惯才是最重要的,因此从现在就开始养成良好的使用习惯的,否则在怎么防护也是白搭。希望你能有一个安全的系统!

2005年05月17日

一、 Oracle,仅次于微软的世界第二大软件公司 

    Oracle虽然规模很大,但名声不像微软、IBM那样显赫,很多非计算机专业的在校学生不知道Oracle是何物。但是如果你是一位想在毕业后进入IT行业的学生,那么,你必须知道什么是Oracle。 

    首先,Oracle是一家软件公司。这家1977成立于加利福尼亚的软件公司是世界上第一个推出关系型数据管理系统(RDBMS)的公司。现在,他们的RDBMS被广泛应用于各种操作环境:Windows NT、基于UNIX系统的小型机、IBM大型机以及一些专用硬件操作系统平台。事实上,Oracle已经成为世界上最大的RDBMS供应商,并且是世界上最主要的信息处理软件供应商。现在,Oracle是仅次于微软公司的世界第二大软件公司,2000年的销售额为101亿美元。现在Oracle在世界范围内大约聘用了4万3千多名专业技术人员,在美国本土有2万1千名。有趣的是,即使在美国本土,Oracle的技术人员(主要是程序员)中有40%是印度人,中国人是第二多的,其次才是美国人。 

    然后,Oracle是一个庞大的品牌系统。如前所述,Oracle不仅在全球最先推出了RDBMS,并且事实上掌握着这个市场的大部分份额,由于Oracle 公司的RDBMS都以Oracle为名,所以,在某种程度上Oracle己经成为了RDBMS的代名词。而近几年来,Oracle不断积极地扩展自己的业务,成功地开发了许多横向和纵向的产品,譬如Oracle自己设计生产的Oracle服务器,面对商业客户的商业交易系统(Oracle Exchange),Oracle数据中心等等。同时,Oracle还成功开发出了很多面对程序员的开发工具,譬如著名的Designer/2000计算机辅助系统工程(CASE)工具和Developer/2000开发包,这些工具作为“设计器”和“开发器”,有力地帮助了程序员的开发工作,也有力地提高了Oracle的声誉。此外,Oracle还开发了一系列面对不同对象的应用软件,它们被统称为Oracle应用软件。这些软件使得Oracle被广泛应用到各个领域,同时也为Oracle带来滚滚财源。比较常见的Oracle软件产品包括: 

    ·Oracle财务软件(Oracle  Financial) 

    ·Oracle制造业软件(Oracle Manufacturing) 

    ·Oracle人力资源软件(Oracle Human Resources) 

    ·Oracle自动控制软件(Oracle Automotive) 

    ·Oracle 商业交易系统(Oracle Exchange) 

    以及其他的应用软件。这些软件连同OracleRDBMS使得Oracle成为一个庞大的品牌系统,深入到了人们生产和生活的各个领域。 

    由于Oracle拥有多年在各种行业下的多种解决方案,拥有基于不同客户环境的Oracle RDMBS服务器工具及规模巨大的应用软件系统,而且,这个庞大的系统正在不同程度、不同层次地为各行各业所广泛应用。因此,能够熟练掌握这个系统的某些方面及适应这个系统的不断更新的专业工程师必然是各界急需的人才,有着良好的就业前景。事实上,Oracle公司也认识到了这一点,这就是Oracle认证专家——OCP(Oracle Certified Professional)的由来。 

二、Oracle认证种类介绍 

    Oracle认证专家——OCP,是由Oracle公司授权国际考试认证中心对考生进行的资格认证。考生按考试标准要求参加几门课程的考试(一般为3—5门),在通过全部考试后,便可获得OCP的专家认证。 

      目前OCP认证考试分为: 

      Database Administrator:数据库管理员考试认证,简称DBA。数据库管理员负责对数据库进行日常的管理、备份及数据库崩溃后的恢复问题。 

    Database Operator:数据库操作员认证考试,简称DBO。数据库操作员主要是基于Windows NT的Oracle 8数据库管理,能够熟练应用OEM等工具完成对数据库的操作及日常的管理工作。 

    Database Developer:数据库开发员认证考试,简称DEV。数据库开发员应能熟练掌握用Developer/2000的工具建立各种Forms应用程序,建立各种标准的以及自定义的报表。 

    Java Developer:Java开发人员考试。 

    Application Consultant: Oracle产品应用咨询顾问。 

    其中,Oracle DBA是最吃香,但也是最难考的一个认证。在Oracle的官方网站上,对DBA有以下说明: 

    Oracle DBA专家可以跟上如今日趋复杂的系统环境要求。最好的DBA们都在幕后工作,他们小心地维护着系统,使得系统可以每天都平稳地运转,并且防止意外灾难的发生,譬如数据库崩溃或者成小时地宕机。这项艰巨的任务需要对Oracle数据库的结构和运行方式有着广泛泛深入的了解,并且有丰富的实战经验。最好的DBA可以在取得最佳运行状态及防止他们公司停止运行的突发事件中找到平衡。Oracle DBA认证考试就是提供一个证明该人可以胜任Oracle DBA这一职务的认证。本认证考试设计了5门独立的考试,使你可以利用良好的知识获得一个专家认证。 

三、如何参加考试? 

    OCP认证的所有考试也是通过Prometric公司组织的,具体的考试事宜请访问它的官方网站:www.prometric.com.cn 

    目前OCP每门考试的费用为125美元。 

Oracle9i 数据库设计指引全集--作者:卢汉利 王辉

数据库物理设计原则

  1.1 数据库环境配置原则

  1.1.1 操作系统环境:

  对于中小型数据库系统,采用linux操作系统比较合适,对于数据库冗余要求负载均衡能力要求较高的系统,可以采用Oracle9i RAC的集群数据库的方法,集群节点数范围在2—64个。对于大型数据库系统,可以采用Sun Solaris SPARC 64位小型机系统或HP 9000 系列小型机系统。RAD5 适合只读操作的数据库,RAD1 适合OLTP数据库

  1.1.2 内存要求

  对于linux操作系统下的数据库,由于在正常情况下Oracle对SGA的管理能力不超过1.7G。所以总的物理内存在4G以下。SGA的大小为物理内存的50%—75%。对于64位的小型系统,Oracle数据库对SGA的管理超过2G的限制,SGA设计在一个合适的范围内:物理内存的50%—70%,当SGA过大的时候会导致内存分页,影响系统性能。

  1.1.3 交换区设计

  当物理内存在2G以下的情况下,交换分区swap为物理内存的3倍,当物理内存>2G的情况下,swap大小为物理内存的1—2倍。

  1.1.4 其他环境变量参考Oracle相关的安装文档和随机文档。

  1.2 数据库设计原则

  1.2.1 数据库SID

  数据库SID是唯一标志数据库的符号,命名长度不能超过5个字符。对于单节点数据库,以字符开头的5个长度以内字串作为SID的命名。对于集群数据库,当命名SID后,各节点SID自动命名为SIDnn,其中nn为节点号:1,2,…,64。例如rac1、rac2、rac24。

  1.2.2 数据库全局名

  数据库全局名称:
 .domain
  

  1.2.3 数据库类型选择

  对于海量数据库系统,采用data warehouse的类型。对于小型数据库或OLTP类型的数据库,采用Transaction Processing类型。

  1.2.4 数据库连接类型选择

  Oracle数据库有专用服务器连接类型和多线程服务器MTS连接类型。对于批处理服务,需要专用服务器连接方式,而对于OLTP服务则MTS的连接方式比较合适。由于采用MTS后,可以通过配置网络服务实现某些特定批处理服务采用专用服务器连接方式,所以数据库设计时一般采用MTS类型。

  1.2.5 数据库SGA配置

  数据库SGA可以采用手工配置或按物理内存比例配置,在数据库初始设计阶段采用按比例配置方式,在实际应用中按系统调优方式修改SGA。


 1.2.6 数据库字符集选择

  为了使数据库能够正确支持多国语言,必须配置合适的数据库字符集,采用UTF8字符集。

  注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,具体过程如下(切记设定的字符集必须是ORACLE支持,不然不能start)


  SQL> shutdown immediate;

  SQL> startup mount;

  SQL> alter system enable restricted session;

  SQL> alter system set job_queue_processes=0;

  SQL> alter database open;

  SQL> alter database character set internal_use we8iso8859p1;

  SQL> shutdown immediate;

  SQL> startup
  

  1.2.7 数据库其他参数配置

  1.2.7.1 DB_FILES

  Db_files是数据库能够同时打开的文件数量,默认值是200个。当数据库规划时文件数量FILES接近或超过200个时候,按以下估计值配置:

  DB_FILES = FILES * 1.5
  

  1.2.7.2 Db_block_size

  一个extent要是5个blocks的倍数为好,如:一个blocks是4096字节,那一个extent就是2M、4M或8M为好。Db_block_size是数据库最小物理单元,一旦数据库创建完成,该参数无法修改,db_block_size按以下规则调整:

  数据仓库类型: db_block_size尽可能大,采用8192 或 16384

  OLTP类型: db_block_size 用比较小的取值范围: 2048 或 4096

  Blocks推荐是系统操作的块倍数(裸设备块大小是512字节,NTFS是 4K,使用8K的方式在大部分系统上通用)。

  1.2.8 数据库控制文件配置

  1.2.8.1 控制文件镜象

  多个控制文件存放在不同的物理位置。

  1.2.8.2 控制文件配置

  控制文件中参数设置,最大的数据文件数量不能小于数据库参数db_files。

  1.2.9 数据库日志文件配置

  1.2.9.1 日志文件大小

  日志文件的大小由数据库事务处理量决定,在设计过程中,确保每20分钟切换一个日志文件。所以对于批处理系统,日志文件大小为几百M 到几G的大小。对于OLTP系统,日志文件大小为几百M以内。

  1.2.9.2 日志文件组数量

  对于批处理系统,日志文件组为5—10组;对于OLTP系统,日志文件组为 3—5组,每组日志大小保持一致;对于集群数据库系统,每节点有各自独立的日志组。

  1.2.9.3 日志成员数量

  为了确保日志能够镜象作用,每日志组的成员为2个。

  1.2.10 数据库回滚段配置

  在Oracle9i数据库中,设计Undo表空间取代以前版本的回滚段表空间。

  Undo 表空间大小的设计规范由以下公式计算:

  Undospace = UR * UPS *db_block_size+ 冗余量

  UR: 表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。

  UPS:表示在undo中,每秒产生的数据库块数量。

  例如:在数据库中保留2小时的回退数据,假定每小时产生200个数据库块。则Undospace = 2 * 3600 * 200 * 4K = 5.8G

  1.2.11 数据库临时段表空间配置

  数据库临时段表空间根据实际生产环境情况调整其大小,表空间属性为自动扩展。

  1.2.12 数据库系统表空间配置

  系统表空间大小1G左右,除了存放数据库数据字典的数据外,其他数据不得存储在系统表空间。

  1.3 数据库表空间设计原则

  1.3.1 表空间大小定义原则

  当表空间 大小小于操作系统对最大文件限制时,表空间由一个文件组成。如果表空间大小大于操作系统对最大文件限制时,该表空间由多个数据文件组成,表空间的总大小为估算为:

  Tablespace + sum (数据段+索引段)*150%。

  1.3.2 表空间扩展性设计原则


  表空间数据文件采用自动扩展的方式,扩展容量快大小按2的整数倍(1M、2M、4M、8M、16M、32M、64M)进行扩展,创建表空间时尽量采用nologing选项。表空间的最大限制一般采用unlimited,除非确切知道表空间数据文件的最大使用范围。(一般windows 32位系统的文件最大2G,64位的unix系统系统文件最大128G,但也要注意文件格式设定的文件大小),建议最大为2G。表空间采用local管理方式,例如:

 CREATE TABLESPACE TBS_USERINFO
  DATAFILE
  ’/oradata/tbs_userinfo.dbf’
  SIZE 8M
  REUSE
  AUTOEXTEND ON
  NEXT 2M
  MAXSIZE UNLIMITED
  NOLOGGING
  EXTENT MANAGEMENT
  LOCAL
  AUTOALLOCATE
  SEGMENT SPACE MANAGEMENT AUTO;
  

  1.4 裸设备的使用

  一个scsi设备可以 14个分区,unix操作系统256个分区,性能比文件系统方式高15%左右,空间大于要小于(实际分区大小减两个ORACLE的数据块),比如100M,大于为100000K,推荐在unix使用软连接(ln)方式把裸设备形成文件,用加入表空间时加resue 选项,当然也可只接把设备加入表空间,移动裸设备使用dd命令

  对于windows平台,oracle提供软连接工具,实现裸设备的使用,计算一条记录的长度

  2 数据库逻辑设计原则

  2.1 命名规范

  2.1.1 表属性规范

  2.1.1.1 表名

  前缀为Tbl_ 。数据表名称必须以有特征含义的单词或缩写组成,中间可以用“_”分割,例如:tbl_pstn_detail。表名称不能用双引号包含。

  2.1.1.2 表分区名

  前缀为p 。分区名必须有特定含义的单词或字串。

  例如 :tbl_pstn_detail 的分区p2004100101表示该分区存储 2004100101时段的数据。

  2.1.1.3 字段名

  字段名称必须用字母开头,采用有特征含义的单词或缩写,不能用双引号包含。

  2.1.1.4 主键名

  前缀为PK_。主键名称应是 前缀+表名+构成的字段名。如果复合主键的构成字段较多,则只包含第一个字段。表名可以去掉前缀。


    2.1.1.5 外键名

  前缀为FK_。外键名称应是 前缀+ 外键表名 + 主键表名 + 外键表构成的字段名。表名可以去掉前缀。

  2.1.2 索引

  4.1.2.1 普通索引

  前缀为IDX_。索引名称应是 前缀+表名+构成的字段名。如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。表名可以去掉前缀。

  2.1.2.2 主键索引

  前缀为IDX_PK_。索引名称应是 前缀+表名+构成的主键字段名,在创建表时候用using index指定主键索引属性。

  2.1.2.3 唯一所以

  前缀为IDX_UK_。索引名称应是 前缀+表名+构成的字段名。

  2.1.2.4 外键索引

  前缀为IDX_FK_。索引名称应是 前缀+表名+构成的外键字段名。

  2.1.2.5 函数索引

  前缀为IDX_func_。索引名称应是 前缀+表名+构成的特征表达字符。

  2.1.2.6 蔟索引

  前缀为IDX_clu_。索引名称应是 前缀+表名+构成的簇字段。

  2.1.3 视图

  前缀为V_。按业务操作命名视图。

  2.1.4 实体化视图

  前缀为MV_。按业务操作命名实体化视图。

  2.1.5 存储过程

  前缀为Proc_ 。按业务操作命名存储过程

  2.1.6 触发器

  前缀为Trig_ 。触发器名应是 前缀 + 表名 + 触发器名。


       2.1.7 函数

  前缀为Func_ 。按业务操作命名函数

  2.1.8 数据包

  前缀为Pkg_ 。按业务操作集合命名数据包。

  2.1.9 序列

  前缀为Seq_ 。按业务属性命名。

  2.1.10 表空间

  2.1.10.1 公用表空间

  前缀为Tbs_ 。 根据存储的特性命名,例如: tbs_parameter 。

  2.1.10.2 专用表空间

  Tbs_<表名称>_nn。该表空间专门存储指定的某一个表,或某一表的若干个分区的数据

  2.1.11 数据文件

  <表空间名>nn.dbf 。nn =1,2,3,4,…等。

  2.1.12 普通变量

  前缀为Var_ 。 存放字符、数字、日期型变量。

  2.1.13 游标变量

  前缀为Cur_ 。存放游标记录集。

  2.1.14 记录型变量

  前缀为Rec_ 。 存放记录型数据。

  2.1.15 表类型变量

  前缀为Tab_ 。 存放表类型数据。

  2.1.16 数据库链

  前缀为dbl_ 。 表示分布式数据库外部链接关系。

  2.2 命名

  2.2.1 语言

  命名应该使用英文单词,避免使用拼音,特别不应该使用拼音简写。命名不允许使用中文或者特殊字符。

  英文单词使用用对象本身意义相对或相近的单词。选择最简单或最通用的单词。不能使用毫不相干的单词来命名

  当一个单词不能表达对象含义时,用词组组合,如果组合太长时,采用用简或缩写,缩写要基本能表达原单词的意义。

  当出现对象名重名时,是不同类型对象时,加类型前缀或后缀以示区别。

  2.2.2 大小写

  名称一律大写,以方便不同数据库移植,以及避免程序调用问题。

  2.2.3 单词分隔

  命名的各单词之间可以使用下划线进行分隔。

  2.2.4 保留字

  命名不允许使用SQL保留字。

  2.2.5 命名长度

  表名、字段名、视图名长度应限制在20个字符内(含前缀)。

  2.2.6 字段名称

  同一个字段名在一个数据库中只能代表一个意思。比如telephone在一个表中代表“电话号码”的意思,在另外一个表中就不能代表“手机号码”的意思。

  不同的表用于相同内容的字段应该采用同样的名称,字段类型定义。

  2.3 数据类型

  2.3.1 字符型

  固定长度的字串类型采用char,长度不固定的字串类型采用varchar。避免在长度不固定的情况下采用char类型。如果在数据迁移等出现以上情况,则必须使用trim()函数截去字串后的空格。

  2.3.2 数字型

  数字型字段尽量采用number类型。

  2.3.3 日期和时间

  2.3.3.1 系统时间

  由数据库产生的系统时间首选数据库的日期型,如DATE类型。

  2.3.3.2 外部时间

  由数据导入或外部应用程序产生的日期时间类型采用varchar类型,数据格式采用:YYYYMMDDHH24MISS。

  2.3.3.3 大字段

  如无特别需要,避免使用大字段(blob,clob,long,text,image等)。

  2.3.3.4 唯一键

  对于数字型唯一键值,尽可能用系列sequence产生。

  2.4 设计

  2.4.1 范式

  如无性能上的必须原因,应该使用关系数据库理论,达到较高的范式,避免数据冗余,但是如果在数据量上与性能上无特别要求,考虑到实现的方便性可以有适当的数据冗余,但基本上要达到3NF.如非确实必要,避免一个字段中存储多个标志的做法。如11101表示5个标志的一种取值。这往往是增加复杂度,降低性能的地方。

  2.4.2 表设计

  2.4.2.1 逻辑段设计原则

  2.4.2.1.1 Tablespace

  每个表在创建时候,必须指定所在的表空间,不要采用默认表空间以防止表建立在系统表空间上导致性能问题。对于事务比较繁忙的数据表,必须存放在该表的专用表空间中。

  2.4.2.1.2 Pctused

  默认pctused导致数据库物理空间利用率非常低40%左右;对于update比较少或update不导致行增大的表,pctused可设置在60—85之间;对于update能够导致行增大的表,update设置在40—70之间

  2.4.2.1.3 Initrans

  对于需要并行查询或者在RAC数据库中需要并行处理的表,initrans设置为2的倍数,否则,不设该值。

  2.4.2.1.4 Storage

  2.4.2.1.4.1 Initial

  尽量减少表数据段的extents数量,initial的大小尽量接近数据段的大小64K,128K,… ,1M,2M,4M,8M,16M ,…,等按2的倍数进行圆整。例如表或分区数据段大小为28M,则initial取32M。

  2.4.2.1.4.2 Next

  表或分区扩展extents的大小,按上述方法进行圆整。当表或分区数据段无法按Initial接近值进行圆整的情况下,其大小可以按 Initial+Next进行圆整。此时,必须设置Minextents=2。例如:表或分区数据段大小为150M,则Initial=128M;Next=32M,Minextents=2。

  2.4.2.1.4.3 Minextents

  该参数表示表创建时候Extents的初始数量,一般取1—2。

  2.4.2.1.4.4 Pctincrease

  表示每个扩展Extents的增长率,设置pctincrease=0能够获得较好的存储性能。

  2.4.2.2 特殊表设计原则

  2.4.2.2.1 分区表

  对于数据量比较大的表,根据表数据的属性进行分区,以得到较好的性能。如果表按某些字段进行增长,则采用按字段值范围进行范围分区;如果表按某个字段的几个关键值进行分布,则采用列表分区;对于静态表,则采用hash分区或列表分区;在范围分区中,如果数据按某关键字段均衡分布,则采用子分区的复合分区方法。

  2.4.2.2.2 聚蔟表

  如果某几个静态表关系比较密切,则可以采用聚蔟表的方法。

  2.4.2.3 完整性设计原则

  2.4.2.3.1 主键约束

  关联表的父表要求有主健,主健字段或组合字段必须满足非空属性和唯一性要求。对于数据量比较大的父表,要求指定索引段。

  2.4.2.3.2 外键关联

  对于关联两个表的字段,一般应该分别建立主键、外键。实际是否建立外键,根据对数据完整性的要求决定。为了提高性能,对于数据量比较大的标要求对外健建立索引。对于有要求级联删除属性的外键,必须指定on delete cascade 。

  2.4.2.3.3 NULL值

  对于字段能否null,应该在sql建表脚本中明确指明,不应使用缺省。由于NULL值在参加任何运算中,结果均为NULL。所以在应用程序中必须利用nvl()函数把可能为NULL值得字段或变量转换为非NULL的默认值。例如:NVL(sale,0)。

  2.4.2.3.4 Check条件

  对于字段有检查性约束,要求指定check规则。

  2.4.2.3.5 触发器

  触发器是一种特殊的存储过程,通过数据表的DML操作而触发执行,起作用是为确保数据的完整性和一致性不被破坏而创建,实现数据的完整约束。

  触发器的before或after事务属性的选择时候,对表操作的事务属性必须与应用程序事务属性保持一致,以避免死锁发生。在大型导入表中,尽量避免使用触发器。

  2.4.2.4 注释

  表、字段等应该有中文名称注释,以及需要说明的内容。

  2.4.3 索引设计

  对于查询中需要作为查询条件的字段,可以考虑建立索引。最终根据性能的需要决定是否建立索引。对于复合索引,索引字段顺序比较关键,把查询频率比较高的字段排在索引组合的最前面。在分区表中,尽量采用local分区索引以方便分区维护。

  除非时分区local索引,否则在创建索引段时候必须指定指定索引段的tablespace、storage属性,具体参考4.4.2.1内容。

  2.4.4 视图设计

  视图是虚拟的数据库表,在使用时要遵循以下原则:

  从一个或多个库表中查询部分数据项;

  为简化查询,将复杂的检索或字查询通过视图实现;

  提高数据的安全性,只将需要查看的数据信息显示给权限有限的人员;

  视图中如果嵌套使用视图,级数不得超过3级;

  由于视图中只能固定条件或没有条件,所以对于数据量较大或随时间的推移逐渐增多的库表,不宜使用视图;可以采用实体化视图代替。

  除特殊需要,避免类似Select * from [TableName] 而没有检索条件的视图;

  视图中尽量避免出现数据排序的SQL语句。

  2.4.5 包设计

  存储过程、函数、外部游标必须在指定的数据包对象PACKAGE中实现。存储过程、函数的建立如同其它语言形式的编程过程,适合采用模块化设计方法;当具体算法改变时,只需要修改需要存储过程即可,不需要修改其它语言的源程序。当和数据库频繁交换数据是通过存储过程可以提高运行速度,由于只有被授权的用户才能执行存储过程,所以存储过程有利于提高系统的安全性。

  存储过程、函数必须检索数据库表记录或数据库其他对象,甚至修改(执行Insert、Delete、Update、Drop、Create等操作)数据库信息。如果某项功能不需要和数据库打交道,则不得通过数据库存储过程或函数的方式实现。在函数中避免采用DML或DDL语句。

  在数据包采用存储过程、函数重载的方法,简化数据包设计,提高代码效率。存储过程、函数必须有相应的出错处理功能。

  2.4.6 安全性设计

  4.4.6.1 管理默认用户

  在生产环境中,必须严格管理sys和system用户,必须修改其默认密码,禁止用该用户建立数据库应用对象。删除或锁定数据库测试用户scott 。

  2.4.6.2 数据库级用户权限设计

  必须按照应用需求,设计不同的用户访问权限。包括应用系统管理用户,普通用户等,按照业务需求建立不同的应用角色。

  用户访问另外的用户对象时,应该通过创建同义词对象synonym进行访问。

  2.4.6.3 角色与权限

  确定每个角色对数据库表的操作权限,如创建、检索、更新、删除等。每个角色拥有刚好能够完成任务的权限,不多也不少。在应用时再为用户分配角色,则每个用户的权限等于他所兼角色的权限之和。

  2.4.6.4 应用级用户设计

  应用级的用户帐号密码不能与数据库相同,防止用户直接操作数据库。用户只能用帐号登陆到应用软件,通过应用软件访问数据库,而没有其它途径操作数据库。

  2.4.6.5 用户密码管理

  用户帐号的密码必须进行加密处理,确保在任何地方的查询都不会出现密码的明文。

  2.5 SQL编写

  2.5.1 字符类型数据

  SQL中的字符类型数据应该统一使用单引号。特别对纯数字的字串,必须用单引号,否则会导致内部转换而引起性能问题或索引失效问题。利用trim(),lower()等函数格式化匹配条件。

  2.5.2 复杂sql

  对于非常复杂的sql(特别是有多层嵌套,带子句或相关查询的),应该先考虑是否设计不当引起的。对于一些复杂SQL可以考虑使用程序实现。

  USER_TAB_COMMENTS 数据字典

  Comment on 可加注解

  2.5.3 高效性

  2.5.3.1 避免In子句

  使用In 或 not In子句时,特别是当子句中有多个值时,且查询数据表数据较多时,速度会明显下降。可以采用连接查询或外连接查询来提高性能。

  Char 比 varchar 查询时高询

  在进行查询及建立索引时,char比varchar的效率要高,当然varchar在存储上比char要好

  2.5.3.2 避免嵌套的Select子句

  这个实际上是In子句的特例。

  2.5.3.3 避免使用Select * 语句

  如果不是必要取出所有数据,不要用*来代替,应给出字段列表,注:不含select count(*)。

  2.5.3.4 避免不必要的排序

  不必要的数据排序大大的降低系统性能。

  2.5.4 健壮性

  2.5.4.1 Insert语句

  使用Insert语句一定要给出要插入值的字段列表,这样即使更改了表结构加了字段也不会影响现有系统的运行。

  2.5.4.2 Count(*)、Count(*)、count(distinct id)的区别

  Select count(*) from testtab

  得到表testtab的记录数

  select count(id) from testtab

  得到表testtab id字段非空记录数

  select count(distinct id) from testtab

  得到表testtab id字段值非相同记录数

  2.5.4.3 Not null 为字段类型性质的约束

  本约束功能在后期无语法使期失效,可使用修改字段类型方式

  alter table modify 字段名 类型 not null

  alter table modify 字段名 类型
  2.5.4.4 外键值可用null的问题

  外键列如没有明确说明not null,可插入null记录(而null是在外部表的记录中没有的),如无可插null记录的想法,要对外键字段加not null约束。

  2.5.4.5 序列 sequence 跳号的问题

  sequence 因回滚,系统崩溃(使用cache 内的值将认为已用),多表引用都将使其跳号,所以不能用于为连续序号 utl_row.cast_to_row

  2.5.4.6 unicn\ intersect\ minus 使用ordey by的注意事项

  以上语句进行连表操作,而表同表的字段顺序的类型相同但字段标题名可不同,使用ordey by时后面如果是字段名,要求所有的表的字段标题名相同,否则用字段的顺序号


  select id,name,year from user1
  union
  select no,name,to_number(null) year from user2
  order by 1,name,year
  

  2.5.5 安全性

  2.5.5.1 Where 条件

  无论在使用Select,还是使用破坏力极大的Update和Delete语句时,一定要检查Where条件判断的完整性,不要在运行时出现数据的重大丢失。如果不确定,最好先用Select语句带上相同条件来果一下结果集,来检验条件是否正确。

  2.5.6 完整性

  有依赖关系的表,例如主外键关系表,在删除父表时必须级联删除其子表相应数据,或则按照某种业务规则转移该数据。9I中表中字段缩小及变类型,字段为空或表空,varchar和char长度不变可任意改,字段名和表名可字段可用 ALTER TABLE table SET UNUSED (column) 设定为不可用,注意无命令再设为可用

  3 备份恢复设计原则

  3.1 数据库exp/imp备份恢复

  Oracle数据库的Exp、Imp提供了数据快速的备份和恢复手段,提供了数据库级、用户级和表级的数据备份恢复方式。这种方法一般作为数据库辅助备份手段。

  3.1.1 数据库级备份原则

  在数据库的数据量比较小,或数据库初始建立的情况下采用。不适合7*24的在线生产环境数据库备份。

  3.1.2 用户级备份原则

  在用户对象表数据容量比较小、或则用户对象初始建立的情况下使用。

  3.1.3 表级备份原则

  主要在以下场合采用的备份方式:

  参数表备份

  静态表备份

  分区表的分区备份。

  3.2 数据库冷备份原则

  数据库冷备份必须符合以下原则:

  数据库容量比较小。

  数据库允许关闭的情况。

  3.3 Rman备份恢复原则

  这种方式适用于7*24环境下的联机热备份情形。

  3.3.1 Catalog数据库

  单独建立备份恢复用的数据库实例,尽可能与生产环境的数据库分开,确保catalog与生产数据库的网络连接良好。在9I系统使用良好的备份策略以可,支持完全使用控制文件保存catalog信息,备份策略如下:


  backup spfile format ‘/data/backup/%d_SPFILE_%T_%s_%p.bak’;

  sql "alter system archive log current";

  backup archivelog all format ‘/data/backup/%d_ARC_%T_%s_%p.bak’ delete all input;

  backup current controlfile format ‘/data/backup/%d_CTL_%T_%s_%p.bak’;

  在spfile、控制文件、数据库全丢的情况下可通过下面的方式恢复

  RMAN> connect target

  connected to target database (not started)

  RMAN> startup

  RMAN> restore spfile from ‘/data/backup/COMMDB_SPFILE_20030411_9_1.bak’;

  SQL> startup

  ORA-00205: error in identifying controlfile, check alert log for more info

  RMAN> restore controlfile from ‘d:\DB92_CTL_20031113_9_1.BAK’;

  Mout database:

  RMAN> recover database;

  RMAN> alter database open resetlogs;
  

  注意:对数据库设定控制文件保存备份信息为365天,具体语句如下。

  alter system set control_file_record_keep_time=365 SCOPE=BOTH;
  

  3.3.2 Archive Log

  设置Archive Log 的位置,确保存储介质有足够的空间来保留指定时间内archive log的总量。建设定期对RMAN进行全备份,删除冗余归档日志文件。

  3.3.3 全备份策略

  对于小容量数据库,可以采用全备份策略。对于大容量数据库,必须制定全备份策略方案,备份时对archive log进行转储,同时冷备份catalog 数据库。

  3.3.4 增量备份策略

  对于大容量数据库,必须制定增量备份、累积备份和全备份的周期,备份时对archive log进行转储,同时冷备份catalog 数据库。

  3.3.5 恢复原则

  采用Rman脚本进行数据库恢复。数据库恢复有以下几种:

  3.3.5.1 局部恢复

  主要用于恢复表空间、数据文件,一般不影响数据库其他操作。

  3.3.5.2 完全恢复

  数据库恢复到故障点,由catalog当前数据库决定。

  3.3.5.3 不完全恢复

  恢复到数据库的某一时间点或备份点。

  恢复catalog数据库。

  恢复数据库control file 。

  恢复到数据库某一时间点。

  重设日志序列。

  3.4 备用数据库原则

  数据库系统在以下情况下可以考虑采用备用数据库data guard原则:

  数据库容量适中。

  数据库严格要求7*24不间断,或间断时间要求控制在最小范围内。

  数据库要求有异地备份冗余。

  3.5 一些小经验

  使用oemc的oms时,首选项要求是节点和数据库分别加入系统用户(如:administrator)和数据库DBA用户(system)。节点的系统用户必须有批处理作业登录的权限

  agent 不能启动,lisnter修改后都要手动删除oracle\ora9\network\agent 中的*.q文件

  oracle\admin\my9i\bdump 中是用户的出错日志

  改变表的空间的方式alter table hr.ssss move TABLESPACE example(要重建索引); 或用imp导入时,设定导入用户只有某一表空间的使用权,无RESOURCE角色和UNLIMITED TABLESPACE权限

  aleter system set log_checkpoint_to_alter=true,后可报警文件发现checkpoint的起动和结束时间。

  3.6 系统调优知识

  3.6.1.1 生成状态报表(statspack的使用)

  使用(存放位置@?\rdbms\admin\)的文件生成报表用户

  @?\rdbms\admin\Spcreate.sql建表

  将timed_statistics设定true

  使用生成的perfstat用户登录,执行以下语句手动收集信息

  Exex statspack.snap

  Exec statspack.snap(I_SNAP_LEVEL=>0,I_MODEFY_PRAMETER=>TRUE) 0级,最少10最大

  使用下面的语句生成状态报表

  @?\rdbms\admin\Spreport.sql

  其他相关文件

  delete stats$snapshot ;清原来记录数据

  @?\rdbms\admin\Saputo.sql

  select job from user_jobs 取用户作业号

  exec dbms_remove(作业号)

  timed_statistics=true要求

  @?\rdbms\admin\spdrop.sql ;

  3.6.1.2 sql追踪

  设定全部用户跟踪

  alter system set sql_trace=true;

  用户级别跟踪

  alter session set sql_trace=true;

  用户的跟踪文件生成在 admin\{pid}\udump\{pid} _ora_{ SPID}.trc 中,spid从下面语句得到

  SELECT b.name bkpr, s.username, p.spid,s.sid,s.serial# FROM v$bgprocess b, v$session s, v$process p WHERE p.addr = b.paddr(+) AND p.addr = s.paddr and s.username=user;

  DBA对特定用户跟踪

  exec dbms_system_set_Sql_trace_in_session(sid,serial#,true)

  信息从下面得到

  SELECT b.name bkpr, s.username, p.spid,s.sid,s.serial#,osuser,s.program

  FROM v$bgprocess b, v$session s, v$process p

  WHERE p.addr = b.paddr(+)

  AND p.addr = s.paddr;

  /*p.spid用于sql_trace时日志编号,dbms_system.set_sql_trace_in_session(sid,erial#,true)*/

  用户的跟踪文件生成在 admin\{pid}\udump 中

  系统的跟踪文件生成在admin\{pid}\bdump\alert_{pid}.log

  tkprof.exe将log文件生成格式化文本

  在av Rd(ms) 20以上说明表空间使用过用频繁,考虑将表分开其他表空间上

  系统变量fast_start_mttr_target的值要大到不产生log等待,当然也可通过加log组使其不等待

  reao log大小应为每30分钟切换一次

  建议表空间的利用率不超80%

  buffer hit 要达80%以上为好

  3.6.1.3 内存调整

  一般的内存分配原则

  SGA 50%(其中80% DATA BUFFER,15% SHARE POOL,5其他)

  PGA30%

  OS 20%

  例如:2G的WINDOWS的平台,OS 300M,SAG 1.2G,PGA 500M

  内存分配的基本单位

  SGA《=128M 4M

  SGA》128M  64位系统16M,32M系统8M

  动态分配时总值不可大于sga_max_size

  通过V$SGA_DYNAMIC_FREE_MEMORY取空闲内存空间

  在缩小时如果内存空间实际在应用中,CPU利用率将达100%,最后将语句出错。

  V$SGASTAT 可看实际的使用情况

  Redo log buffer一般在5M内,可通过v$sessuon_wait看是否等,v$sysstat

  可也通过报警文件看是否等切换,方法可加组。可通过nologging(数据库也要设定支持nologging)方法减少日志文件产生量。

  java_pool 没有设定时,使用shared_pool_size

  3.6.1.3.1 shared_pool

  本缓冲区用于sql语句,pl sql等的对象保存

  Cursor_sharing{Exact|Similar|force} 游标共享设定

  Force方式适用OLTP数据库,Exact方式适合数据仓库,similar为智能方式

  hard parses 硬SQL语句分析,每秒要底于100次,小要加大shared_pool

  soft parse 软SQL语句分析,OLTP要达90%以上,小要加大shared_pool

  不建议用无命名PL SQL段

  如果有大PL SQL(存储过程)对象可强制保存于内存,也可加大SHARED_POOL_RESERVED_SIZE,大小不可过SHARED_POOL_SIZE的50%,不然实例不能起动

  3.6.1.3.2 db_cache

  本缓冲区用于数据库数据对象保存

  db_cache_advice 为on,可以提出通过企业管理器看到系统建议

  通过select * from v$system_event 进行系统查看。

  发现存在free buffer waits,说明不能将data buffer及时写入data file;

  可通过增加加CPU后,加db_writer_processes=CPU数改善。

  也可设disk_asynch_io为true,使用异步IO(前提同要操作系统支持)db_writer_processes=1时(只有一个CPU的情况下),也可通加大dbwr_io_slaves来改善。db_writer_processes>1,不可用本功能

  调整效果排序:异步IO>CPU>dbwr_io_slaves

  Buffer Busy Waits大说明出现IO冲突

  Buffer Busy Waits 大 和 dbbock大说明全表扫描多,说明数据不能读入,可加大

  db_cache_size来改善.

  Undo block大要加大回滚段(手动管理方式,9I默认是自动管理)

  undo header 大要加大回滚段(手动管理方式,9I默认是自动管理)

  db_cache命中率99%,不是唯一因素,关系是不要出现等待。建议达90%以上。

  内存使用建议:

  系统可以设三个缓冲区,建表时可设定用那个缓冲区(默认在db_cache_size)

  db_cache_size   (默认区)

  db_keep_cache_size (常访问,小于db_keep_cache_size的10%的表可放于本区)

  db_recycle_cache_size (一个事物完成后常时间不再使用,或两倍大小于缓冲区)


  3.6.2 排序的优化

  9I为专用服务器时系统变量workarea_size_policy 设定为auto, statistics_level设定为 TYPICAL 可获取v$pga_target_advice中的优化建议。参数pga_aggregate_target值为所有连接用户可用排序内存。

  9I为共享服务器时workarea_size_policy设定为menaul, sort_area_size值为每用户排序内存。

  如果内存不足将使用TEMP表空间进行排序,排序使用比率disk/meme应小于5%

  尽量少用排序,如果使用排序功能,尽量在字段上加索引进行优化。

  SQL分析模式:RBO(基于规则)方案小表(驱动表)放在最后,优先使用索引,对SQL语句要求严格(8I以前的模式);CBO (基于开销)根据统计值进行选择开销最少,性能最优的最佳方式进行,但本方式DBA(使用analyze table语句)要定期进行分析统计.系统设定通过optimizer_mode 系统参数

  说明: 指定优化程序的行为。如果设置为 RULE, 就会使用基于规则的优化程序, 除非查询含有提示。如果设置为 CHOOSE, 就会使用基于成本的优化程序, 除非语句中的表不包含统计信息。ALL_ROWS 或 FIRST_ROWS

  始终使用基于成本的优化程序。

  值范围: RULE | CHOOSE | FIRST_ROWS | ALL_ROWS

  默认值: CHOOSE

  {rule(RBO)|choose(自动选择)|fist_rows| fist_rows_n|all_row}

  3.6.3 统计信息

  进行某表的统计分析

  EXECUTE dbms_stats.gather_table_stats (‘HR’,'EMPLOYEES’);

  查看结果


  SELECT num_rows, blocks, empty_blocks as empty,

  avg_space, chain_cnt, avg_row_len

  FROM dba_tables

  WHERE owner = ‘HR’

  AND table_name = ‘EMPLOYEES’;
  

  4 设计工具

  统一使用sybase power designer设计工具,在该工具上完成物理模型的设计。所有的数据库对象尽可能在物理模型上进行设计,而且每个物理模型都要有相应的文字描述。

  所有的数据库对象变更以数据库物理模型为基准。为了避免字符敏感问题,产生的脚本以大写字母为标准。

2005年05月09日

孔子论玉十德

黄帝"冕旒之制"的产生标志着我国原始公社制度的崩溃。"合符釜山圭瑞"制的产生标志着玉器当时已成为统治阶级权力的象征,我国伟大的儒家创始人孔子论玉"十德",从此玉又成为封建社会对人们道德规范的标准。孔子曰:夫昔者君子比德于玉焉。

(一)温润而泽,仁也。(泽意为濡,濡音为儒即儒家,儒家的标准要求是祖述尧舜,宪章文武,崇尚"礼乐"和"仁义"。提倡"忠恕"和"中庸之道"政治上主张"德治"和"仁治")。

(二)缜密从栗,知也。(缜意为缜,栗知音为智,意为玉质内紧而外貌明智,即要求人们有外表的明智而又有内在的优秀素质)。

(三)廉而不刿,义也。(廉洁不贪而不刿即不伤义。这就是要求人们即要廉洁奉公而对周围的亲朋好友不伤义气)。

(四)垂之如坠,礼也。(礼仪谦让别人的精神而且要自尊自爱)。

(五)其终诎然,乐也。(终即终点,诎即屈,意为玉器碰撞有声,要求人们不怕困难保持乐观)。

(六)瑕不掩瑜、瑜不掩瑕,忠也。(瑕是玉中之病,瑜是玉中美者,这就是要求人们敢于承认自己的缺点,敢于改正自己的缺点,做到自知之明,光明正大)。

(七)孚尹旁达,信也。(孚即浮,尹音略同筠是指竹子的青皮即玉采,旁达意为由里及表这就是要求人们内外一致。由表及里、做到内美和外美相结合)。

(八)气如白虹,天也。(气即气质,气质如白虹有通天之灵气,这就是要求人们气质好、风度好)。

(九)精神贯于山川,地也。(精神即神采,神采能通地,这就是要求人们精神面貌要充实自信如山川大地)。

(十)圭璋特达,德也。(圭璋为祀神之器,是祀神六器之首二,圭璋用于堂即升堂之用,这就是要求人们像圭璋一样有大志、干大事、立大业)。

    孔子论玉十德是封建社会对人们道德规范的标准,我们只能借鉴,而不能作为现代社会人们道德规范的标准。

现在鹅颈桥又有市民开始打小人,那天刚巧经过,连警察也出动维持秩序,火光冲天。

 我曾经说过小人越打越多,小人不是可以殴打的,是需要化解的。朋友听到便有点反应,跟我聊天。他问,如何才能认识自己的心理心态,如何叫做君子坦荡荡,小人常戚戚。 

 我跟着为他说了一个故事,我说见过很多事情,我自己感到,是外界事物的出现,使我们内心的反映表现出我们内在的那种情操。 

 譬如一个舞会,一个很大型的派对,很多人穿着漂亮衣服出席,大家争妍斗丽。

 这个时候刚巧来了一个少女,这个少女跟在场的全部人士都不认识,没有纠缠,没有恩怨情仇,但是她很美丽,一进来便艳压群芳,将所有的人给比下去。 

 这个时候会出现什么状况?我相信会出现连续的反应。有些人觉得这个女孩真美啊,衷心赞美。 

 有些人又会如何,很美吗?你看她那模样!挑毛病,说她这件衣服不好看,一双鞋子又过时。这是第二种人。 

 第三种人甚至会憎恨,绝不会赞美,他会妒忌、憎恨, 甚至愤怒。 

 这一切导致出来的动作,有些人会攀比,走上前攀比来抬高自己。也有些人会离开她,来表示自己清高。总而言 之一连串的东西会表现出来。 

 刚才我说过,这个少女跟全场的所有人没有关系,但是在场人士不同的反应,便反映出我们每个人不同的心态和个人情操。

 能够衷心赞美别人的人,他这个人很快乐很坦荡。妒忌心越强,憎恨心越强的人,其实他很痛苦,这叫做君子坦荡荡,小人常戚戚。 

 我不是说有些人对某事妒忌便叫小人,绝对没有这个意思,我的意思是说,我们每一个人都有君子的一面,也有 小人的一面。

 但是我们通过镜子一照,照出了我们自己内在的阴暗的一面。假如我们将它拿出来,在太阳底下晒一晒,我们做人便会开朗一点,快乐一点。 

 我说这个故事是想说明一点,其实面对很多事情,我们如果只管埋怨别人,说这个人不好,那个人不是,那是我们自己内心的反映。

 上面提到的这个少女便说明了这个道理,她跟任何人都没有关系。为什么你还会不喜欢她呢?她跟你没有任何历史渊源,没有恩怨情仇,什么关系也没有, 是你自己的问题,不是别人的问题。

2005年05月08日

1、jdk就是j2se,jdk1.1.8版本以后改成为j2se,
  下载地址:http://java.sun.com/j2se/downloads.html

  2、jre是java运行时环境(jdk1.3版本以后都包含jre)不用单独下载

  3、设置环境变量
  安装了jdk以后,要配置环境变量
  我的电脑->属性->高级->环境变量
  添加以下环境变量(假定你的java安装在c:\jdk1.3)
  java_home=c:\jdk1.3
  classpath=.;c:\jdk1.3\lib\dt.jar;c:\jdk1.3\lib\tools.jar;(.;已经不能少,因为它代表当前路径)
  path = c:\jdk1.3\bin
  新开一个dos窗口,键入java和javac测试一下

  4、简单测试程序
  代码:——————————–
  public class Test{
   public static void main(String args[]){
    System.out.println("Hello world!");
   }
  }
  ————————————-
  javac Test.java
  java Test

  5、java、j2ee、xml 开发常用工具介绍
  j2sdk安装程序及Java API Doc
  j2sdk-1_4_0 for win
  j2sdk-1_4_0 for linux
  j2sdk-1_4_0-doc
  j2sdkee-1.3-doc
  可去http://java.sun.com/j2ee/download.html下载

  6、build工具
  ant: Ant是一个基于java的跨平台的build工具。之所以Ant能跨平台,是因为Ant不再需要你编写shell命令,Ant的配置文件是基于XML的任务树,能让你运行各种各样的任务,任务的运行是由实现了特定任务接口的对象来完成的。
  Http://jakarta.apache.org/ant

  7、开发工具(IDE,集成开发环境)
  1、开发工具首选两种
  1、jbuilder–不用我多说了
  2、netBeans(下载地址www.netbeans.org,免费),forte也就是Sun EE和netbeans类似(估计是使用netbeans的原码改写而成), 但是netbeans(3.4版本)我觉得比较好用,可以和tomcat和cvs等集成,但是唯一不足的就是不能开发EJB,forte倒是可以,但是不能给出我们自己写的API(也就是.后出现的方法都是系统的,而我们自己写的方法出不来,faint)
  其它开发工具
  Eclipse:号称未来能进行任何语言开发的IDE集大成者。
  Eclipse 是替代IBM Visual Age for Java(以下简称IVJ)的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。
  目前,Eclipse已经开始提供C语言开发的功能插件。更难能可贵的是,Eclipse是一个开放源代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。也就是说未来只要有人需要,就会有建立在Eclipse之上的COBOL,Perl,Python等语言的开发插件出现。
  同时可以通过开发新的插件扩展现有插件的功能,比如在现有的Java开发环境中加入Tomcat服务器插件。
  可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。
  Http://www.eclipse.org

  8、专业XML编辑工具
  XMLSPY:支持SOAP;支持Oracle XML Schema扩展;支持MSXML4等等;提供三种XML文档视图:结构显示和编辑,原码视图和支持CSS,XSL的预览。支持最新schema标准,可以根据schema校验XML文档可以将不同schema版本schema文档转换成符合最新schema规范的文档可以将DTDs, XML-Data, 或者BizTalk schemas 转换成W3C XML
  Schema从数据库连接(ADO,ODBC)中自动产生XML Schema可以直接访问数据库,提供数据库和XML之间的转换提供类似Office XP compatible的用户界面提供了更方便的用户界面定制方式.
  该编辑器支持所见即所得的文本编辑,基于form地数据输入,图形元素等,包括了一个图形化的XSLT产生器,可以针对schema或者DTD产生样式文档,最后应用于相应的XML文档。
  可去http://www.xmlspy.com/download.html 下载

  9、Framework
  cocoon:XML Framework
  Cocoon是采用100%纯Java编写的一个内容发布框架。
  Cocoon让你能采用W3C的最新技术(DOM、XML、XSL)来提供Web内容。
  新的Cocoon模式能将文档内容、样式、处理逻辑进行完全的分离,允许这三层能独立地设计、创建和管理, 从而减少了管理开销,加强了工作的重用性,减少了开发时间。
  来源:http://xml.apache.org/cocoon

  9、struts:JSP Framework
  Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。
  采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
  Struts有如下的主要功能:
  ?包含一个controller servlet,能将用户的请求发送到相应的Action对象。
  ?JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
  ?提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。
  来源:http://jakarta.apache.org/struts

  10、turbine:Servlet Framework
  Turbine是基于servlet的framework,使有经验的Java开发员能快速地构建web应用。
  使用Turbine,可以通过创建使用特定服务来处理模板的Screen,
  来集成现有的模板技术(例如Velocity、Webmacro、Java Server Pages(JSP)、FreeMarker、cocoon)。
  来源:http://jakarta.apache.org/turbine

  11、Demo
  Java Pet Store: j2ee应用样例
  Java Pet Store是Java software蓝图规划的j2ee企业应用样例。
  它示范了怎样应用j2ee 平台的威力去构建一个灵活的、可伸展的跨平台企业应用。
  你可从java.sun.com/blueprints/enterprise/上获取最新的信息及学习资料,目前最新的版本是基于j2ee1.3的1.3_01。
  来源:http://java.sun.com/blueprints/enterprise/

  12、database
  pointbase:进军企业级数据库市场的一只新军。
  PointBase 是第一个经过认证的100%纯Java数据库,可用于任何使用的Java 2 标准版虚拟机(JVM)的平台。
  来源:http://www.pointbase.com/

  13、j2ee server
  1、j2sdkee1.3.1 referrence implement(j2ee参考实现),sun的一个很好的学习j2ee的工具,记着,这是一个学习的工具,不是一个企业开发的工具,因为它的效率,安全等诸多问题,所以不能用它做项目或者产品。
  Http://java.sun.com/j2ee/download.html
  2、weblogic和websphere 不用我多说了吧!
  3、sun one Application Server(前身是iplanet)—强烈推荐
  里面是一个比较完成j2ee开发平台
  1、sun one studio 4 (前身forte)
  2、tomcat 4
  3、sun one application server 一个较棒的j2ee server
  4、和j2ee ri集成
  5、pointbase 是第一个经过认证的100%纯Java数据库
  这些工具可以够你开发任何java产品,最重要的是,它是一个免费的j2ee服务器,并且是免费的哦,比起jboss来说,不知道好到哪里去了哈哈,这下活该我发了!!!
  Http://wwws.sun.com/software/download/app_servers.html

  14、UML工具
  1、Rational Rose 大哥大级别的UML设计工具,功能很强大。
  2、Together 可以认为是最好的java UML设计工具,可以根据类图同步生成java代码,设计完成后,系统的
  框架也出来了,爽啊!

  15、指导书籍
  1、入门书籍就不多介绍了
  看一些《从入门到精通》之类的书籍,《java编程思想》初学者不推荐
  2、java programmer推荐看《java编程思想》
  3、java designer推荐看《java与模式》(新书,中国人写的,不是翻译的,中国人能写出这样有深意的IT书,很难得)

 Java语言主要由以下五种元素组成:标识符、关键字、文字、运算符和分隔符。这五种元素有着不同的语法含义和组成规则,它们互相配合,共同完成Java语言的语意表达。下面我们分别予以讲解。

1. 标识符变量,类和方法都需要一定的名称,我们将这种名称叫做标识符。Java中对标识符有一定的限制。首先:所有的标识符的首字符必须是字母(大小写)、下划线_或美元符¥;其次标示符是由数字(0–9),所有从A–Z的大写字母、a–z的小写字母和下划线_、美元符¥和所有在十六进制0xc0前的 ASCII码等构成;第三注意表示符不能使用系统保留的关键字做标示符。

以上是标识符命名的基本规则,以下是一个正误对照表,通过它会对标识符的命名规则有一个更好的了解:


合法标识符 非法标识符
try try#   (注:不能用#作为标示符)
group_7 7group (注:不能用数字符号开头)
opendoor open-door ( 注:不能用下-作为标示符号)
boolean_1 boolean (注:boolean 为关键字,不能用关键字做标示符)



2. 关键字

关键字是Java语言本身使用的标识符,它有其特定的语法含义。所有的Java关键字将不能被用作标识符,Java的关键字有:


abstract、
continue、
for、
new、
switch、
boolean、
default、
goto、
null、
synchronized、
break、
do、
if、
package、
this、
byte、
double、
implements、
private、
threadsafe、
byvalue、
else、
import、
protected、
throw、
case、
extends、
instanceof、
public、
transient、
catch、
false、
int return、
true、
char、
final、
interface、
short、
try、
class、
finally、
long、
static、
void、
const、
float、
native、
super、
while等。



3. 数据类型

Java有着不同的数据类型,Java的数据类型有:整型、浮点型、布尔型、字符型、字符串型。整型数据是最普通的数据类型,它的表现方式有:十进制、十六进制和八进制。十六进制整数必须以0X作为开头。

每一个整型数据占有32位的存储空间,即四个字节。这意味着整型数据所表示,的范围在-2,147,483,648和 2,147,483,648之间,假如由于某些原因,你必须表示一个更大的数,64位的长整型应该是足够的。如果你想把一个整数强制存为一个长型(long),你可以在数字后面加字母l。

浮点数据用来代表一个带小数的十进制数。例如1.35或23.6。是浮点数的标准形式,还可以用科学计数法的形式,下面是一些例子:


3.1415926  0.34  .86  .01234  9.999E8



标准的浮点数叫做单精度浮点数,它的存储空间为32位,也就是四个字节。也有64位的双精度浮点数。你可以用D后缀确定你想使用这种双精度浮点数。布尔类型是最简单的一种数据类型,布尔数据只有两种状态:真和假,通常用关键字true和false来表示这两种状态。字符型数据是由一对单引号括起来的单个字符。它可以是字符集中的任意一个字符,如:′a′,′b′。

字符串数据类型是用一对双引号括起来的字符序列,字符串数据实际上是由String类所实现(类这个概念我们将在后续章节中详细讲解),而不是C语言中所用的字符数组。每一个字符串数据将产生一个String类的新的实例,读者不必对字符串与类这个概念发生关系而感到担心,由于类的特性,你不必担心如何去实现它们,它们会自己照顾好自己,需要说明的是字符串在Java里作为类只是出于安全的考虑。

下面给出了几个字符串的例子:


"How are your"
"I am Student



4. 运算符

任何语言都有自己的运算符,Java语言也不例外,如+、-、*、/等都是运算符,运算符的作用是与一定的运算数据组成表达式来完成相应的运算。对不同的数据类型,有着不同的运算符。

5. 分隔符

分隔符用来使编译器确认代码在何处分隔。‘’‘’‘;’‘:’都是Java语言的分隔符。

本程序是一个汉诺塔的游戏程序,用TURBO  C 2.0编写并编译成功,游戏可以让玩家选择盘子的个数(3到7个).并有三种游戏结果(YOU WIN;GAME OVER;YOU PLAY BAD),而且一局成功以后,玩家可以选择退出或继续(如果选择继续,则盘子的个数就会自动加一).
本游戏程序算法简单,界面友好,可玩性强,是第一款在DOS界面下的汉诺塔游戏程序.

作者E_MAIL:   bolm@etang.com

/*—————————HANOI TOWER V 1.0————————–*/
/*—————————–SOURCE PROGRAM—————————*/
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "graphics.h"
#include "math.h"

#define O outtextxy
#define S setcolor
#define F setfillstyle
#define R rectangle
#define C circle
#define L line
#define B bar
#define B3D bar3d

#define X 200
#define Y 30

int step=0;
int record[5]={7,15,31,63,127},rec;
int disk,disknum;
char mark[15];

struct rod
       {
       int disk[8][5];
       int diskname[8];
       }tree[3];

/********************************************/
ntoa(int s)
{
 int b[15];
 int i,j;
 for (i=0;i<15;i++)
   mark[i]=’\0′;
 for (i=0;s>=10;i++)
   {b[i]=s%10;
   s/=10;}
 b[i]=s;
 for(j=i;j>=0;j–)
   mark[i-j]=b[j]+’0′;
}

void drawrod()
{
 F(1,LIGHTBLUE);
 B(118,150,122,400);   /*ROD1*/
 B(318,150,322,400);   /*ROD2*/
 B(518,150,522,400);   /*ROD3*/
 F(6,BLUE);
 B(119,151,123,401);
 B(319,151,323,401);
 B(519,151,522,401);
}

void draw()
{
 S(LIGHTBLUE);
 R(10,10,629,469);
 L(10,30,629,30);      /*UP LINE1*/
 L(10,26,629,26);
 L(10,450,629,450);    /*BOTTOM LINE1*/
 L(10,446,629,446);
 S(GREEN);
 settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
 O(200,452,"HANOI TOWER V1.0");
 S(LIGHTBLUE);
 O(201,453,"HANOI TOWER V1.0");
}

void showrecord()
{
 settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
 F(1,BLACK);
 bar(58,11,80,22);
 ntoa(disk);
 S(RED);
 O(20,15,"DISK:");
 S(GREEN);
 O(60,15,mark);

 bar(318,11,350,22);
 ntoa(rec);
 S(RED);
 O(260,15,"RECORD:");
 S(GREEN);
 O(320,15,mark);

 bar(530,11,600,22);
 ntoa(step);
 S(RED);
 O(490,15,"STEP:");
 S(GREEN);
 O(532,15,mark);
}

void filldisk(int x1,int y1,int x2,int y2,int color,int color1)
{
 S(color);
 F(1,color);
 B3D(x1,y1,x2,y2,5,5);
 F(6,color1);
 B3D(x1+1,y1+1,x2+1,y2+1,5,5);
}

void action()  /**ANIMATION**/
{
 int i;
 S(BLACK);
 for (i=0;i<600;i=i+2)
 {R(i,0,i+40,479);
  delay(100);}
}

int ifwin()
{
  int i,step_sub_rec;
  disknum=0;
  for (i=0;i<disk;i++)
   { if(tree[2].disk[i][0]==1) disknum++;}
  step_sub_rec=step-rec;
  if (disknum==disk)
    { if (step_sub_rec<=10) /**WIN**/
       { action();
  cleardevice();
  S(GREEN);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
  O(230,200,"YOU WIN");
  S(RED);
  O(231,201,"YOU WIN"); }
      else if (step_sub_rec<=20)
       { action();
  cleardevice();
  S(RED);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
  O(220,200,"GAME OVER");
  S(LIGHTBLUE);
  O(221,201,"GAME OVER"); }
       else
       { action();
  cleardevice();
  S(LIGHTBLUE);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
  O(175,200,"YOU PLAY BAD");
  S(CYAN);
  O(176,201,"YOU PLAY BAD"); }

  for (i=0;i<3000;i=i+50)
   {sound(i);
    delay(300);
    nosound();}
  S(RED);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
  O(180,240,"THANK YOU TO PLAY");
  S(GREEN);
  O(181,241,"THANK YOU TO PLAY");
  S(RED);
  R(168,298,473,309);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
  O(170,300,"PRESS ANY KEY TO CONTINUE(ESC TO QUIT)");
  S(YELLOW);
  O(171,301,"PRESS ANY KEY TO CONTINUE(ESC TO QUIT)");

  if(getch()==27) {closegraph();exit(0);}
  else return(1);
    }
    return(0);
}

void helpmessage()
{
 S(BLUE);
 R(20,258,619,405);
 L(20,260,619,260);
 L(20,376,619,376);
 S(RED);
 O(124,230,">>>");
 settextstyle(SANS_SERIF_FONT,HORIZ_DIR,1);
 O(23,265,"HELP MESSAGE:");
 settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
 S(LIGHTBLUE);
 O(30,290,"1). KEY: <-,->,A,D :MOVE THE RED BALL TO SELECT A ROD");
 O(30,315,"2). KEY: UP,W      :TO SELECT THE TOP DISK");
 O(30,340,"3). KEY: DOWN,S    :TO GET DOWN THE DISK WHICH SELECT");
 O(30,365,"4). KEY: ESC       :QUIT THE GAME");
 S(RED);
 O(30,382,"5). IF   STEP-RECORD<10  THAN  :YOU WIN");
 O(30,393,"6). ELSE                       :GAME OVER");
}

/************************—GAME—**************************/
void game()
{
 int movedisk[4],updiskname1,updiskname2,updisknum1,updisknum2,havemove=0,i,j,rn=0;
 int stage,stage1,stage2,rn1,rn2;
 int x1,y1,x2,y2;
 int a=0,b=0;
 int name=1;
 char c;
 rec=record[disk-3];
 draw();
 drawrod();
 showrecord();

for (i=0;i<3;i++)         /*****—EXIST BIT=0—********/
  for (j=0;j<7;j++)
    {tree[i].disk[j][0]=0;
     tree[i].diskname[j]=0;}


for (i=0;i<disk;i++)     /****DRAW THE DISKS OF THE FIRST ROD***/
 {
  tree[rn].diskname[i]=name;
  tree[rn].disk[i][0]=1;      /*DISK i—–exist bit*/
  tree[rn].disk[i][1]=40+a;   /*–X1–*/
  tree[rn].disk[i][2]=380-b;  /*–y1–*/
  tree[rn].disk[i][3]=200-a;  /*–X2–*/
  tree[rn].disk[i][4]=400-b;  /*–y2–*/

  name=name+1;
  a=a+10;
  b=b+30;
 }

for (i=0;i<disk;i++)     /*********DRAW THE DISKS***********/
    filldisk(tree[rn].disk[i][1],tree[rn].disk[i][2],tree[rn].disk[i][3],tree[rn].disk[i][4],9,1);
for (i=0;i<4;i++)
    movedisk[i]=0;
 drawrod();
/*—————————————————————–*/

F(1,BLACK);
       B(20,100,609,130);
       F(1,RED);
       S(RED);
       C(118+(rn*200),115,10);
       floodfill(118+(rn*200),115, RED);

while(1)
    {if(kbhit())
      switch(c=getch())
       {case 75:     /**left**/
        case ‘A’:
        case ‘a’:
           rn=((rn==0)?2:rn-1);
    break;

 case 77:     /**right**/
        case ‘D’:
        case ‘d’:
           rn=((rn==2)?0:rn+1);
    break;

 case 72:     /**up**/
        case ‘W’:
 case ‘w’:
    for (i=0;tree[rn].disk[i][0]!=0;i++);
    if (i<1) break;
    else
      {
        updiskname1=tree[rn].diskname[i-1];
        updisknum1=i-1;
        stage1=i-1;
        rn1=rn;
    for (i=0;i<4;i++)
        movedisk[i]=tree[rn].disk[updisknum1][i+1];
        havemove=0;
    /*    tree[rn].diskname[updisknum1]=0;
   tree[rn].disk[updisknum1][0]=0;   */
       }
    break;

 case 80:     /**down**/
        case ‘S’:
 case ’s’:
    if (movedisk[0]==0) break;
    for (i=0;tree[rn].disk[i][0]!=0;i++);
    if (i<1)
      {  if (havemove==1) break;
        stage2=0;rn2=rn;
        tree[rn].diskname[0]=updiskname1;
        tree[rn].disk[0][0]=1;      /**exist bit–>1**/
  tree[rn1].diskname[updisknum1]=0;
  tree[rn1].disk[updisknum1][0]=0;
        stage=stage1-stage2;
        x1=movedisk[0]+(rn2-rn1)*X;
        y1=movedisk[1]+stage*Y;
        x2=movedisk[2]+(rn2-rn1)*X;
        y2=movedisk[3]+stage*Y;

        tree[rn].disk[0][1]=x1;
        tree[rn].disk[0][2]=y1;
        tree[rn].disk[0][3]=x2;
        tree[rn].disk[0][4]=y2;
      }
     else
      {
        updiskname2=tree[rn].diskname[i-1];
        updisknum2=i;
        stage2=i;
        rn2=rn;
        if (updiskname1>updiskname2)
    {
    if (havemove==1) break;
      tree[rn].diskname[updisknum2]=updiskname1;
      tree[rn].disk[updisknum2][0]=1; /**exist bit–>1**/
       tree[rn1].diskname[updisknum1]=0;
       tree[rn1].disk[updisknum1][0]=0;
      stage=stage1-stage2;
      x1=movedisk[0]+(rn2-rn1)*X;
      y1=movedisk[1]+stage*Y;
      x2=movedisk[2]+(rn2-rn1)*X;
      y2=movedisk[3]+stage*Y;

      tree[rn].disk[updisknum2][1]=x1;
      tree[rn].disk[updisknum2][2]=y1;
      tree[rn].disk[updisknum2][3]=x2;
      tree[rn].disk[updisknum2][4]=y2;
    }
    else
      {sound(1000);
       delay(300);
       nosound();
       break;     }
      }
      filldisk(movedisk[0],movedisk[1],movedisk[2],movedisk[3],7,9);
      delay(2000);
      filldisk(movedisk[0],movedisk[1],movedisk[2],movedisk[3],0,0);
      filldisk(x1,y1,x2,y2,9,1);
      step=step+1;
      showrecord();
      drawrod();

      for(i=0;i<4;i++)
         movedisk[i]=0;
         havemove=1;
     if (ifwin()==1) return;       /****check if moves are finished****/
    break;

 case 27:closegraph(); exit(0);
 default:break;
       }
F(1,BLACK);
       B(20,100,609,130);
       F(1,RED);
       S(RED);
       C(118+(rn*200),115,10);
       floodfill(118+(rn*200),115, RED);

}
}

/********************MAIN*******************/
void main()
{
  int gd=DETECT,gm=0;
  int input,i;
  initgraph(&gd,&gm,"");
  setbkcolor(BLACK);
  S(YELLOW);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,4);
  O(150,204,"HANOI TOWER");
  S(LIGHTBLUE);
  O(149,203,"HANOI TOWER");
  S(YELLOW);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
  O(267,254,"V 1.0");
  S(LIGHTBLUE);
  O(266,253,"V 1.0");
  S(LIGHTBLUE);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
  O(243,300,"–MADE BY CHENCHENG–");
  S(CYAN);
  O(242,299,"–MADE BY CHENCHENG–");
  sleep(2);
  cleardevice();
  helpmessage();
  S(GREEN);
  settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
for (i=1;i<75;i++)
  {delay(500);          /*SPEED OF THE SENTENCE*/
  setviewport(0,0,50+i*8,479,1);
  O(155,230,"PLEASE INPUT THE NUMBERS OF DISKS(3..7):");
  }
while((input=getch())<’3′||input>’7′);
  input=input-48;
  disk=input;
  delay (1000);
  action();
  cleardevice();
ag:
  game();              /********GAME*******/
  cleardevice();
  if (disk<7) disk++;
  step=0;
  goto ag;
}

网络游戏中的数据包设计与定义(初论)

转载自:www.csdn.net

 接触了一段时间的网游封包设计,有了一些初步的思路,想借这篇文章总结一下,同时也作个记录,以利于以后更新自己的思路。  网络游戏的技术研发,分为三个主要的方面:服务器设计,客户端设计,数据库设计。而在服务器和客户端之间实现游戏逻辑的中介则是游戏数据包,服务器和客户端通过交换游戏数据包并根据分析得到的数据包来驱动游戏逻辑。网络游戏的实质是互动,而互动的控制则由服务器和客户端协同完成,协同就必然要依靠数据来完成。  当前网络游戏中的封包,其定义形式是各种各样的,但归纳起来,一般都具有如下要素:封包长度,封包类型,封包参数,校验码等。  封包长度用于确定当前游戏数据包的长度,之所以提供这个数据,是因为在底层的TCP网络传输中,出于传输效率的考虑,传输有时会把若干个小的数据包合并成一个大的数据包发送出去,而在合并的过程中,并不是把每一个逻辑上完整的数据包全部合并到一起,有时可能因为这种合并而将一个在逻辑上具有完整意义的游戏数据包分在了两次发送过程中进行发送,这样,当前一次的数据发送到接受方之后,其尾部的数据包必然造成了“断尾”现象,为了判定这种断尾的情况以及断尾的具体内容,游戏数据包在设计时一般都会提供封包长度这个信息,根据这个信息接受方就知道收到的包是否有断尾,如果有断尾,则把断尾的数据包与下次发过来的数据包进行拼接生成原本在逻辑意义上完整的数据包。  封包类型用于标识当前封包是何种类型的封包,表示的是什么含义。  封包参数则是对封包类型更具体的描述,它里面指定了这种类型封包说明里所必须的参数。比如说话封包,它的封包类型,可以用一个数值进行表示,而具体的说话内容和发言的人则作为封包参数。  校验码的作用是对前述封包内容进行校验,以确保封包在传递过程中内容不致被改变,同时根据校验码也可以确定这个封包在格式上是不是一个合法的封包。以校验码作为提高封包安全性的方法,已经是目前网游普遍采用的方式。封包设计,一般是先确定封包的总体结构,然后再来具体细分有哪些封包,每个封包中应该含有哪些内容,最后再详细写出封包中各部分内容具体占有的字节数及含义。  数据包的具体设计,一般来说是根据游戏功能进行划分和圈定的。比如游戏中有聊天功能,那么就得设计客户端与服务器的聊天数据包,客户端要有一个描述发言内容与发言人信息的数据包,而在服务器端要有一个包含用户发言内容及发言人信息的广播数据包,通过它,服务器端可以向其他附近玩家广播发送当前玩家的发言内容。再比如游戏中要有交易功能,那么与这个功能相对应的就可能会有以下数据包:申请交易包,申请交易的信息包,允许或拒绝交易包,允许或拒绝交易的信息包,提交交易物品包,提交交易物品的信息包,确认交易包,取消交易包,取消交易的信息包,交易成功或失败的信息包。需要注意的是,在这些封包中,有的是一方使用而另一方不使用的,而有的则是双方都使用的包。比如申请交易包,只可能是一方使用,而另一方会得到一个申请交易的信息包;而确认交易包和提交交易物品这样的数据包,都是双方在确定要进行交易时要同时使用的。封包的设计也遵从由上到下的设计原则,即先确定有哪些功能的封包,再确定封包中应该含有的信息,最后确定这些信息应该占有的位置及长度。一层层的分析与定义,最终形成一个完善的封包定义方案。在实际的封包设计过程中,回溯的情况是经常出现的。由于初期设计时的考虑不周或其它原因,可能造成封包设计方案的修改或增删,这时候一个重要的问题是要记得及时更新你的设计文档。在我的封包设计中,我采用的是以下的封包描述表格进行描述:  封包编号   功能描述  对应的类或结构体名  类型命令字  命令参数结构体及含义   根据游戏的功能,我们可以大致圈定封包的大致结构及所含的大致内容。但是,封包设计还包含有其它更多的内容,如何在保证封包逻辑简洁的前提下缩短封包的设计长度提高封包的传输速度和游戏的运行速度,这也是我们应该考虑的一个重要问题。一般情况下,设计封包时,应该尽量避免产生一百字节以上的封包,多数封包的定义控制在100字节以内,甚至20-50字节以内。在我所定义的封包中,多数在20字节以内,对于诸如传递服务器列表和用户列表这样的封包可能会大一点。总之一句话,应该用尽可能短的内容尽可能简洁清晰地描述封包功能和含义。  在封包结构设计方面,我有另一种可扩展的思路:对封包中各元素的位置进行动态定义。这样,当换成其它游戏或想更换当前游戏的封包结构时,只要改变这些元素的动态定义即可,而不需要完全重新设计封包结构。比如我们对封包编号,封包类型,封包参数,校验码这些信息的开始位置和长度进行定义,这样就可以形成一个动态定义的封包结构,对以后的封包移植将会有很大帮助,一个可能动态改变封包结构的游戏数据包,在相当程度上增加了外挂分析封包结构的难度。  在进行封包设计时,最好根据封包客户端和服务器端的不同来分类进行设计。比如大厅与游戏服务器的封包及游戏服务器与游戏客户端的封包分开来进行设计,在包的编号上表示出他们的不同(以不同的开头单词表示),这样在封包的总体结构上就会更清晰。

介绍

  有关Dev-Cpp的介绍,我在这里不想多做解释。因为下面会具体的介绍和讲解的。我在这里只是想要介绍一下有关GCC的内容。因为,Dev-Cpp所使用的Mingw32是一款GCC编译器。所以,对GCC的了解有助于使用Dev-Cpp。

gcc.exe  这是一个C语言的编译器,负责编译C语言。这个也许大家都知道。不过,在这里我要先向大家说明一下。gcc只是一个C语言的编译器。不能识别C++代码。所以,以前所说的gcc可以编写C++是一个误传。因为,我们通常所说的GCC不是gcc.exe而是GCC的一套程序。其中就包括可以编译C++语言的g++.exe

如果,你不确定这个gcc的版本,可以用如下的命令查看。

gcc -v

关于编译,gcc可以通过命令符编译。

gcc source.c -o binary

以上的命令,是让gcc直接由.c代码编译成可执行代码。也可以这样。

gcc -c source.c -o code.ogcc code.o -o binary

这样就生成了一组二进制代码,然后在通过二进制代码生成可执行程序。

g++.exe  刚才已经说过了,这个是一个用于编译C++代码的程序。基本用法和gcc一样。所以这里不再介绍了。只是让各位了解一下,这个程序是编译C++代码的。

gdb.exe  用于调试程序的。功能非常强大。可以调试C,C++等语言。据说还可以调试Java程序。不过我没有试过。对于gcc/g++编译出来的程序。需要再编译时加上 -g 参数。gdb才能进行调试。有点像VC的debug。

make.exe  这是一个非常有用的程序,可以用来发布程序和编译复杂关系的代码组。其实有点像提示符版的安装程序。不同的是,安装程序是一段二进制执行代码,而它是一个文本文档。  make所执行的是makefile文件。文件是一个文本文档,里面包含了程序的编译规则。如果要用提示符调用的话可以用如下方法。

make -f makefile

然后,make会根据makefile所提供的编译关系进行编译和安装。下面是一段makefile的内容。请注意,其开头的空白是 tab。

release : main.o gcc main.o -o mainmain.o : main.c gcc -c main.c -o main.o

然后,通过命令 make -f makefile release 就可以执行了。make会根据文件的创造日期来判断是否要对main.o进行重新编译。也就是说,make可以知道作者修改了哪些文件,并将修改过的文件重新编译。再连接成程序。这样有助于开发者节省开发周期上的时间和精力。

好了,希望上面的介绍能让各位满意。在此,我只介绍一些主要的程序,不一一介绍其他的了。接下来我们介绍一下gcc生成的文件。

*.o 其实就是VC生成的*.objlib*.a 就是VC中用的*.lib静态链接库。只是,每个库必须用lib开头。在调用的时候,只要提供*的内容就可以了。*.so 虽然在Win32中很少用,几乎不用但,还是介绍一下。这个就是Win32中的*.dll动态连接库。但是,在Ming32中已经支持dll了。

好了,关于gcc的介绍就到这里。下面我们开始进入正题。

 

第一章 安装Dev-Cpp

  在这里,我不介绍Mingw32如何安装。因为Dev-Cpp中已经包含了Mingw32。如果您想了解Mingw32如何安装,可以查看其他相关的资料。这里不作阐述。  首先,我们必须下载一个Dev-CPP的安装程序。Dev-Cpp的官方网站是http://www.bloodshed.net。Dev-Cpp的网页是http://www.bloodshed.net/dev/devcpp.html最新版本应该是Dev-Cpp 4.9.9.0它的下载地址是 http://umn.dl.sourceforge.net/sourceforge/dev-cpp/devcpp4990setup.exe 。这个下载的文件中包含了全部的内容。在得到安装程序以后,我们就来安装了。  不论如何,我想,安装这种小问题,我想不用再一步步介绍了吧。毕竟我们都是程序员,如果,连安装都不会那真是……。不过,如果在安装中有什么问题,可以提出。我会尽力帮你解决的。  双击安装程序后,就按照平常安装的方式安装,建议按照默认安装。当然安装的路径就算便你了。在第一次安装以后,程序会提示你界面的设置。如果你喜欢英文就选择English。如果喜欢中文的,就选择Chinese。注意不要选择Chinese(TW)除非你安装了繁体中文。并喜欢繁体中文。然后是图标设置。推荐你使用New Look。如果你喜欢其他的也可以。还有就是是否使用XP风格。这些都随便你了。  好了就介绍到这里,到此。我已经介绍了Dev-Cpp的安装,如果顺利。

  在这里,我不介绍Mingw32如何安装。因为Dev-Cpp中已经包含了Mingw32。如果您想了解Mingw32如何安装,可以查看其他相关的资料。这里不作阐述。  首先,我们必须下载一个Dev-CPP的安装程序。Dev-Cpp的官方网站是http://www.bloodshed.net。Dev-Cpp的网页是http://www.bloodshed.net/dev/devcpp.html最新版本应该是Dev-Cpp 4.9.9.0它的下载地址是 http://umn.dl.sourceforge.net/sourceforge/dev-cpp/devcpp4990setup.exe 。这个下载的文件中包含了全部的内容。在得到安装程序以后,我们就来安装了。  不论如何,我想,安装这种小问题,我想不用再一步步介绍了吧。毕竟我们都是程序员,如果,连安装都不会那真是……。不过,如果在安装中有什么问题,可以提出。我会尽力帮你解决的。  双击安装程序后,就按照平常安装的方式安装,建议按照默认安装。当然安装的路径就算便你了。在第一次安装以后,程序会提示你界面的设置。如果你喜欢英文就选择English。如果喜欢中文的,就选择Chinese。注意不要选择Chinese(TW)除非你安装了繁体中文。并喜欢繁体中文。然后是图标设置。推荐你使用New Look。如果你喜欢其他的也可以。还有就是是否使用XP风格。这些都随便你了。  好了就介绍到这里,到此。我已经介绍了Dev-Cpp的安装,如果顺利。

  接下来介绍一下,有关Dev-Cpp在windows中的设置。由于GCC有很多的东西是要在提示符下进行操作的,特别是为Dev-Cpp安装,编译一些工具包。所以,我们就Mingw32添加到系统命令中,有助于以后方便调用。  方法很简单,右键单击 我的电脑。然后选色属性。使用 高级 选项卡。点击环境变量按钮。点击 Path 项,点击编辑按钮。然后将DevCpp安装目录中的bin目录的路径添加到这个选项值的后面。注意,使用 ; 分隔。确定后启动命令提示符。输入 gcc -v 看。一切都好了。现在你就可以像在Linux环境下一样在Win32环境下编译程序了。

至此,您的Dev-Cpp环境就算弄好了。下面我们将介绍如何制作程序。

 

第二章 新建项目与编译

  本章我们要进行实战训练了。介绍一下如何在Dev-Cpp下进行项目新建和编译。我相信你一定会慢慢喜欢上这个编译环境的。  点击文件菜单,选择新建,点击工程。在出现的对话框中选择你所需要的程序种类。

  其中,Windows application是Win32图形界面。Console Application是Win32控制台程序。Static Library是Win32的静态连接库。DLL是Win32的动态连库。Empty Project是更具已有的项目类型创造一个新的项目类型。下面的内容是选择使用的语言,如是C语言还是C++语言。还有就是项目名称。这个名称将作为程序编译后的可执行程序的名称。  在这里为了方便叙述,我们就新建一个Console Application项目好了。至于使用的语言,就随便你了。我这里就用C语言为例了。点击确定后,提示项目保存的路径,建议您选择其他路径不要使用默认的路径,因为默认的路径是安装目录。如果放在那里的话,会很混乱的。在其他目录中,新建一个文件夹(当然不新建也可以,只是这样便于管理)将项目保存在那里。然后,在点击保存按钮(这个按钮就是一张磁盘,和Windows里的一样)或者从文件菜单中选择保存或者Ctrl + S。这些都可以。这样,Dev就会提示你项目中默认文件的保存目录。通常名为main.*。选择一个路径,保存就好了。(建议和项目文件保存在一起)

  下面我们就来编译程序了。点击工具栏,第二行,第一个彩色的按钮。就进行编译了。这时会出现一个编译窗口,显示编译的进度。你可以通过环境选项来设置它。在编译完成后,点击第二个白色的按钮,就可以运行程序了。是不是很方便?我也是那么觉得。

  接下来,我就来介绍一下,有关项目目录内的文件的作用。

main.c 程序的C语言源代码。main.o main.c的二进制代码。Makefile.win 就像我上面所说的,这个是项目的Makefile文件。用make命令可以编译程序的。*.dev *的内容视你项目的名称所定。这个是项目文件,用于记录你对项目的设置。有关文件内个字段的作用就不做介绍了。*.exe 你所生成的可执行程序。

最后,我介绍一下如何不用IDE来编译生成程序。首先进入您项目所在的目录。然后用如下命令。

make -f makefile.win all

就可以编译了。当然,也可以直接通过编译源代码来实现。具体的方法,我已经在开头介绍过了。这里就不再重复介绍了。