ACCESS数据库操作(转载)

如将店的多寡较做生所必不可少的血,那么数据库的计划虽是运中尽紧要的同样有的。有关数据
仓库设计之资料汗牛充栋,大学学位课程里也发出专门的叙述。不过,就如我辈反复强调的那么,再好的
教师吗比不过经验的育。所以我多年来摸索了几针对数据库设计好有功力的专业人士给大家传授一些要是
测算数据库的技巧及阅历。我自从接收的130 只反映中甄选了中的60
个极品技巧,并将这些
艺编写成了本文,为了方便索引其情节分也5 单部分:
第1 部分— 设计数据库之前
当下无异于组成部分罗列了12 个中心技术,包括取名规范与判工作要求等。
第2 部分— 设计数据库表
一起24 个指南性技巧,涵盖表内字段设计及当避免的科普问题相当。
第3 部分— 选择键
岂挑择键呢?这里出10
个技巧专门提到系统生成的主键的不错用法,还生何时以及哪寻找引字段
以获得最佳性能等。
第4 部分— 保证数据完整性
议论哪些保持数据库底清和强壮,如何把危害数据回落至绝小程度。
第5 部分— 各种小技巧
莫包于上述4

独组成部分中之旁技术,五花八门,有矣她想而的数据库开发工作会更自在一些。   

第1 部分— 设计数据库之前

  1. 相现有条件
    每当设计一个新数据库时,你不仅仅当精心研究业务要求而还要观察现有的网。大多数数据库项目还不是开始开始建之;通常,机构内到底会有用来满足特定需求的水土保持系统(可能没有落实活动计算)。显然,现有系统并无健全,否则你就是不要再度起新系统了。但是针对原始体系的研讨好吃你意识有些恐怕会见忽略的细小问题。一般的话,考察现有系统对你绝对有补益。

本人已经接手过一个啊地面运输企业开的数据库项目,活不为难,用之凡Access
数据库。我设置了有的种类规划参数,而且和客户共同对这些参数进行了评估,事先还查了开条件下所采取的行事模式,等到最后安排下的时刻,只见终端上发出了几乎单提醒符然后立马在我前面翘辫子了!抓耳挠腮的煎熬了一些个钟头,我才察觉及,原来这家企业之网络上走在些许独数据库应用,而对网络的走访需要鲜明和严峻的用户帐号及其访问权限。明白了立或多或少,问题化解:只需要使用客户之系即可。这个类型于本人的训诫就是:记住,假如你在诸如Access
或者Interbase
这类似公共环境下出应用程序,一定要是自外表下手深入系统里头做明白而面临的条件到底是怎么回事。

  1. 概念标准的靶子命名规范
    肯定要是定义数据库对象的命名规范。对数码库表来说,从类型雷同开始将确定表名是采取复数还是单数形式。此外还要给表的别名定义简单规则(比方说,如果表名是一个单词,别叫就赢得单词的前头4
    个假名;如果表名是片独单词,就各取两个单词的眼前少单字母组成4
    只字母长的号;如果表的名由3
    个单词组成,你不妨起来两只单词遭各取一个然后于最后一个单词遭再取出两单字母,结果还是整合4
    字母长的别名,其余依次类推)对工作用表来说,表名可以增长前缀WORK_
    后面附上采用该表的应用程序的讳。表内的列要针对键采用一整套企划规则。比如,如果键是数字型,你可就此_NO
    作为后缀;如果是字符类型则足以行使_CODE
    后缀。对列名应该采取正式的前缀和后缀。再要,假如你的表里有无数“money”字段,你不妨让每个列增加一个_AMT
    后缀。还有,日期列最好坐DATE_用作名字打头。

反省表名、报表名和查询名之间的命名规范。你也许会见快速就吃这些不同之数据库要素的称为糊涂了。假如你坚持合并地命名这些数据库的不同部分,至少你该在这些目标名字的初步用table、query
或者report 等前缀加以区别。

而用了Microsoft Access,你可以据此qry、rpt、tbl 和mod
等标志来标识对象(比如
tbl_Employees)。我当与SQL Server(或者Oracle)打交道的早晚还用过tbl
来索引表,但自为此sp_company
(现在用sp_feft_)标识存储过程,因为在局部时候要自身发觉了重新好的拍卖措施往往会保留好几单拷贝。我在贯彻SQL
Server 2000 时用udf_ (或者类似之标记)标识我修的函数。

  1. 预先计划
    上个世纪80 年代初,我还当以本帐目系统跟System 38
    平台,那时自己肩负统筹具有的日子字段,这样在不费啊力气的气象下将来就是得轻松处理2000
    年问题了。许多丁受我说就转变错过解决当下同题材了,因为要是处理起来最好费事了(这当世人皆知的Y2K
    问题之前特别悠久了)。我回击说若预先计划今后就未会见遇到好累。结果自己单所以了一定量完美之时刻哪怕管程序全部变更了了。因为预先计划的好,后来Y2K
    问题针对性拖欠体系的伤降到了最低水平(最近传闻该次还到了1995
    年都还运行在AS/400
    系统上,唯一出现的有点题目是由代码中除去注释费了点工夫)。

  2. 获取数据模式资源手册
    正好于营示例模式之人得阅读《数据模式资源手册》一题,该书由Len
    Silverston、W. H.Inmon 和Kent Graziano
    编写,是均等如约值得所有的特级数据建模图书。该书概括的段涵盖多种数目领域,比如人口、机构以及做事职能等。

  3. 畅想未来,但不足淡忘了千古底教训
    自身发觉询问用户如何对未来需求变动很管用。这样做可以直达一定量独目的:首先,你可知晓地问询下设计在谁地方应当更富有灵活性与哪避免性能瓶颈;其次,你知发生事先没有规定的急需变动时用户以与你同感觉到震惊。

肯定要是记住过去的经验教训!我们开发人员还应该通过分享温馨之回味和更互相帮助。即使用户觉得他们再也为不需要什么支持了,我们吧应当针对他们进行及时上面的教导,我们且早已面临过如此的时刻“当初一经是如此做了拖欠多好⋯⋯”。

  1. 以情理实践之前开展逻辑设计
    当深刻物理设计前面要事先进行逻辑设计。随着大气之CASE
    工具不断涌现出来,你的计划性啊得达到一定高的逻辑水准,你习以为常可以于总体上还好地打听数据库设计所要之一切。

  2. 了解您的政工
    当您百分百地规定系从客户角度满足该急需前毫无当您的ER(实体关系)模式遭遇参加哪怕一个数据表(怎么,你还无模式?那要而参看技巧9)。了解您的信用社工作好在后来的开发阶段节约大量底工夫。一旦你明显了政工需,你尽管可以协调做出过多核定了。

倘而觉得你早已尽人皆知了业务内容,你不过好与客户拓展同样赖系统的交流。采用客户之术语并且于她们解释你所想到的跟汝所闻的。同时还应为此或、将见面和必须顶词汇表达出体系的关系基数。这样您就算可被您的客户纠正你自己之知晓然后开好下同样步之ER
设计。

  1. 创立数量字典和ER 图表
    定要花点时间创造ER
    图表和数量字典。其中至少应包含每个字段的数据类型和在每个表内的预告外键。创建ER
    图表和数据字典确实来硌困难但对其它开发人员要了解任何计划也是完全必要的。越早创建越能促进避免事后面临的或是混乱,从而可以被其它问询数据库的人头犹显然哪些由数据库被收获数量。

来一致客诸如ER
图表等时髦文档其重要性如何强调还不过分,这对表明表中涉及异常有因此,而数据字典则证明了每个字段的用途与另可能有的别名。对SQL
表达式的文档化来说就是完全必要的。

  1. 开创模式
    同样摆设图胜了千言万语:开发人员不仅使读书与落实其,而且还要因此它来扶持自己和用户对话。模式推动提高合作效能,这样于事先的数据库设计被几未可能出现非常的题材。模式不必为的不胜复杂;甚至可以大概到手写在同摆放张上虽可了。只是要保证其达到的逻辑关系今后能闹效果。

  2. 由输入输出下手
    以定义数据库表和字段需求(输入)时,首先应反省现有的要么曾筹划来之表格、查询以及视图(输出)以决定为支持这些输出哪些是必需的阐发和字段。举个简单的事例:假如客户需要一个表格按照邮政编码排序、分段和求和,你一旦管中囊括了单身的邮政编码字段而并非将邮政编码糅进地址字段里。

  3. 表技巧
    倘若了解用户日常是怎告数的:批处理或在线提交报表?时间间隔是每日、每周、每月、每个季度或者年年?如果需要的话还好设想创建总结表。系统生成的主键在表格被那个为难管理。用户以备系统生成主键的表内用副键进行查找往往会回许多双重数据。这样的寻找性能于没有而且容易招惹混乱。

  4. 理解客户要求
    圈起就应该是明显的从,但要求就是是缘于客户(这里要起其中与标客户之角度考虑)。不要因用户写下来的要求,真正的要求于客户之脑袋里。你一旦给客户说其需要,而且就开发的持续,还要时常询问客户保管其需依旧以开之目的中。一个勿移的真谛是:“只有我看见了本人才清楚自家思念只要的凡呀”必然会导致大气的返工,因为数据库没有高达客户从不曾写下去的需要标准。而重复糟糕底是若针对他们需要的诠释只有属您协调,而且可能是全然错误的。


第2 部分— 设计表和字段

  1. 反省各种变通
    本人当统筹数据库的下会考虑到什么样数据字段将来也许会见发出变更。比方说,姓氏就是这般(注
    一齐是西方人的姓氏,比如女性结婚后打夫姓等)。所以,在起系统存储客户信息时,我倾向被
    于单独的一个数据表里存储姓氏字段,而且还增大起始日和终止日等字段,这样即使足以跟踪这无异于
    数码条目的转移。

  2. 采取闹义之字段名
    来一致扭曲自家到场开发了一个种,其中起从另程序员那里继承的先后,那个程序员喜欢用屏幕及
    著数据指示用语命名字段,这吗可,但不幸之是,她还爱好用部分意想不到之命名法,其命名采
    从而了匈牙利取名暨操纵序号的结合形式,比如cbo1、txt2、txt2_b 等等。
    除非您以使只面向您的缩写字段名的系,否则要尽量地管字段描述的理解些。当然,也扭转
    举行过头了,比如Customer_Shipping_Address_Street_Line_1 I
    虽然可怜具说明性,但从不人乐于
    键入这么长之讳,具体规范就以你的把握着。

  3. 运用前缀命名
    比方多独表里有成千上万平类型的字段(比如FirstName),你不妨用特定表的前缀(比如
    CusLastName)来拉而标识字段。

时效性数据应包括“最近创新日期/时间”字段。时间标记对寻找数据问题之缘故、按日期再次处
理/重载数据以及排除旧数据特别发因此。

  1. 标准化和数量让
    数码的口径不仅方便了温馨又为造福了其他人。比方说,假如你的用户界面要拜访外部数据
    起源(文件、XML
    文档、其他数据库等),你不妨把相应的连接和路信息囤积于用户界面支持表
    里。还有,如果用户界面执行工作流之类的职责(发送邮件、打印信笺、修改记录状态等),那
    呢产生工作流的数码为足以存放于数据库里。预先安排总要付出努力,但一旦这些过程用数
    仍驱动而无硬编码的法,那么策略改变和保安还见面好得差不多。事实上,如果经过是数据驱动
    的,你虽好把相当深的事推给用户,由用户来保障团结的工作流过程。

  2. 格不能够过头
    对那些未熟悉标准化一词(normalization
    )的人数而言,标准化可以保表内的字段都是无限基础的
    素,而当时同一计推进消除数据库中之多寡冗余。标准化来某些栽形式,但Third
    Normal
    Form(3NF)通常为当当性、扩展性和数据完整性方面达到了极其好平衡。简单的话,3NF

    定:

· 表内的各个一个值都只能让发挥相同坏。
· 表内之每一行还当让唯一的标识(有唯一键)。
· 表内无应储存依赖让其他键的非键信息。
守3NF
标准的数据库有以下特点:有一致组表专门存放通过键连接起来的关联数据。比方说,
某存放客户及其有关定单的3NF 数据库就可能发少数单说明:Customer
和Order。Order 表不保证
含定单关联客户之另音讯,但表内会存放一个键值,该键指向Customer
表里富含该客户信息
的那一行。
重复胜似层次之尺码也产生,但再次专业是否就自然再次好啊?答案是勿自然。事实上,对某些项目来
说,甚至就是连3NF 且可能让数据库引入太胜的复杂。

为效率的原委,对表不进行规范有时也是必备之,这样的事例很多。曾经产生个出财务分析
软件之在就是因此无标准化表把询问时自平均40
秒降低至了区区秒左右。虽然我只得这样做,
然而自绝不将数据表的非标准化当作理所当然的计划理念。而现实的操作而是平等种植派生。所以要表
发了问题再度来不标准化的表是完全可能的。

  1. Microsoft Access 报表技巧
    设你在用Microsoft
    Access,你可就此对用户自己的字段名来代替编号的名:比如用
    Customer Name
    代替txtCNaM。这样,当你用引导程序创建表单和表格时,其名字会给那些休
    举凡程序员的人数更易于看。

  2. 免活跃或无利用的指示符
    充实一个字段表示所于记录是否以事情遭不再活跃挺有因此之。不管是客户、员工或别什么
    人,这样做且能推进重新运行查询的当儿过滤活跃或未欢状态。同时还免去了初用户以动用
    数据经常所面临的有些题目,比如,某些记录或不再为他们所用,再去的早晚可以由至自然之
    防作用。

  3. 使角色实体定义属于有型的排列
    每当需要针对属于特定项目或者有所一定角色的物做定义时,可以据此角色实体来创造特定的年月拉
    联关系,从而可以实现自身文档化。
    此处的意思不是深受PERSON 实体带有Title 字段,而是说,为什么不要PERSON
    实体和
    PERSON_TYPE 实体来叙述人员也?然后,比方说,当John Smith, Engineer
    提升也John
    Smith, Director 乃至最后爬至John Smith, CIO
    的要职,而备你要是召开的可是是改变简单个说明
    PERSON 和PERSON_TYPE
    之间涉及之键值,同时多一个日期/时间字段来解变化是何时
    发生的。这样,你的PERSON_TYPE 表就隐含了有着PERSON
    的或是类型,比如Associate、
    Engineer、Director、CIO 或者CEO 等。
    还发生只代表方式就是是改PERSON
    记录来体现新头衔的成形,不过这样一来在时空达到无法跟踪
    个人所处位置的切实可行时间。

  4. 以常用实体命名机构数
    社数量的极其简单易行方法尽管是以常用名字,比如:PERSON、ORGANIZATION、ADDRESS

    PHONE
    等等。当您拿这些常用的相似名字做起来还是创造特定的照应副实体时,你就算赢得了
    协调之所以底奇特版本。开始的早晚以一般术语的第一原因在于有的实际用户还能够针对抽象事物有着
    体化。
    生了这些抽象意味,你就可以当第2 级标识着应用自己之例外名称,比如,PERSON
    可能是
    Employee、Spouse、Patient、Client、Customer、Vendor 或者Teacher
    等。同样的,
    ORGANIZATION 也恐怕是MyCompany、MyDepartment、Competitor、Hospital、
    Warehouse、Government 等。最后ADDRESS
    可以切实也Site、Location、Home、Work、
    Client、Vendor、Corporate 和FieldOffice 等。
    使用一般抽象术语来标识“事物”的类别好让你当论及数据因满足工作要求地方取得巨大的灵巧
    活性,同时这样做还得判下跌数据存储所用的冗余量。

  5. 用户来源世界各地
    于规划用到网或具有任何国际特性的数据库时,一定要记住大多数国家还起两样的字段格
    庆典,比如邮政编码等,有些国家,比如新西兰虽没邮政编码一说。

  6. 数还用采用分立的数据表
    使你发现自己在再度输入数据,请创建新表和新的关系。

  7. 每个表中都当长的3 单有效之字段
    · dRecordCreationDate,在VB 下默认是Now(),而在SQL Server
    下默认为GETDATE()
    · sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER
    · nRecordVersion,记录的版本标记;有助于准确说明记录着起null
    数据要少数据的原

  8. 对地方与电话采用多只字段
    叙述街道地址便短短一行记录是不够的。Address_Line1、Address_Line2
    和Address_Line3 可
    坐提供再不行之灵活性。还有,电话号码和邮件地址最好有好之数据表,其间有本身的色
    与记类别。

过于标准化可使小心,这样做也许会见导致性上出现问题。虽然地点和电话表分离通常可以上
顶尖状态,但是要需要时看这类似消息,或许在其父表中存放“首选”信息(比如
Customer 等)更为妥当些。非标准化以及加速访问期间的降是发出一定意义之。

  1. 使用多个号字段
    自我道大吃惊,许多人当数据库里虽被name
    留一个字段。我觉着只有刚入门的开发人员才会就
    啊做,但实际上网上这种做法特别广。我提议应当将姓氏和名作两个字段来拍卖,然后在
    询问的时更管他们结成起来。

假使把这种情景易得对用户更协调有好
若干方法。我尽常用之是于同样表中开创一个计算列,通过它们可自行地接连标准化后底字段,这
种数据变动的时候它吗随着变。不过,这样做在以建模软件时得慌灵敏才行。总之,采用连接
字段的方法得以有效的断用户采取以及开发人员界面。

  1. 防护大小写混用的目标名和特殊字符
    过去最使自己发火的工作有即是数据库里出高低写混用的目标名,比如CustomerData。这同样问
    题从Access 到Oracle
    数据库都留存。我弗喜下这种大小写混用的对象命名方式,结果还非
    得无手工修改名字。想想看,这种数据库/应用程序能混到使用重复强大数据库的那无异龙也?采用全
    部大写而且蕴藏下划符的名拥有双重好之可读性(CUSTOMER_DATA),绝对不要当目标名的
    字符中留空格。

  2. 小心保留词
    倘若包你的字段名没有与保留词、数据库系统或常用访问方法冲突,比如,最近自己修的一个
    ODBC 连接程序里生个说明,其中即因此了DESC 作为验证字段名。后果可想而知!DESC

    DESCENDING 缩写后底保留词。表里的一个SELECT
    *告知句子也能够为此,但自身收获的可是如出一辙很堆
    并非用处之信。

  3. 保字段名和花色的一致性
    当命名字段并也该指定数据类型的下一定要管一致性。假如字段在某个表中叫做
    “agreement_number”,你就是转变当任何一个表里把名字改成成为“ref1”。假如数据类型在一个表里
    是整数,那在外一个表里可即便变变成字符型了。记住,你涉嫌了自己之生存了,其他人还要因此而的频繁
    据库呢。

  4. 有心人挑选数字型
    于SQL 中动用smallint 和tinyint
    类型要专门小心,比如,假如你想看看月销售总额,你的总数字
    段类型是smallint,那么,如果总额逾了$32,767 你尽管不克进行测算操作了。

  5. 抹标记
    当表明中富含一个“删除标记”字段,这样就算可以管实施号为去。在关系数据库里并非独自去
    某平等实施;最好用清除数据程序同时若仔细维护索引整体性。

  6. 免采用触发器
    触发器的效用通常可以用其他措施贯彻。在调试程序时触发器可能成干扰。假如你真用募
    用触发器,你不过好集中对其文档化。

  7. 蕴含本机制
    建议您于数据库中引入版本控制机制来规定以中之数据库的版。无论如何你还如贯彻就等同要是
    央。时间一模一样长,用户的需要连续会转移之。最终或会见要求修改数据库结构。虽然您可以通过查验
    查阅新字段或者找引来确定数据库结构的版本,但自我发觉将版本信息直接存放到数据库被未另行为方
    便吗?。

  8. 深受文本字段留足余量
    ID 类型的文本字段,比如客户ID
    或定单号等等都应安装得比较相似想象更甚,因为时不添加而
    过半就是会为要加加额外之字符而难堪不已。比方说,假而你的客户ID 为10
    员数长。那您应当
    拿数据库表字段的长短要为12 或者13
    单字符长。这终究浪费空间吧?是发生一些,但也从未你想象的
    那多:一个字段加长3 个字符在产生1
    百万长达记下,再长一些目的状下才不过为整数据
    库多占据3MB
    底上空。但随即额外占据的长空也不用将来重构整个数据库就可以实现数据库规模
    的提高了。

  9. 排命名技巧
    咱俩发现,假如你于每个表的列名都利用统一之前缀,那么当编辑SQL
    表达式的时段会获取充分
    异常之简化。这样做吧确确实实发生毛病,比如破坏了自动表连接工具的图,后者将国有列名同一些数
    论库联系起来,不过就是连这些家伙有时不为一连错误嘛。举个简单的事例,假设有两独说明:
    Customer 和Order。Customer
    表的前缀是cu_,所以该表内的子段名如下:cu_name_id、
    cu_surname、cu_initials 和cu_address 等。Order
    表的前缀是or_,所以子段名是:
    or_order_id、or_cust_name_id、or_quantity 和or_description 等。
    然打数据库中选出全部数额的SQL 语句可以形容成如下所示:
    Select * from Customer, Order
    Where cu_surname = “MYNAME”
    and cu_name_id = or_cust_name_id
    and or_quantity = 1;
    每当没这些前缀的情景下虽形容成这个法:
    Select * from Customer, Order
    Where Customer.surname = “MYNAME”
    and Customer.name_id = Order.cust_name_id
    and Order.quantity = 1
    第1 独SQL 语句没掉键入多少字符。但如若查询涉及到5
    独说明乃至更多之排你尽管明白之技术
    大多出因此了。


第3 部分— 选择键和目录

  1. 数码采掘要预先计划
    自家所于的市场部门已使处理8
    万大多客联系方式,同时填写每个客户之必需数据(这纯属不是略
    生)。我从中还要确定有同组客户作为市场目标。当自己于最初步设计表和字段的时节,我准备不
    以主索引里增加极其多的字段以便加速数据库的运作速度。然后自己发觉及一定的组查询和信息采掘
    既无精确速度为难受。结果不得不以主索引中重建而且合并了数额字段。我发现出一个指示计划相
    当第一——当自家眷恋创立系统项目查找时怎么而运用号码当主索引字段也?我得以据此传真号码
    展开查找,但是它几乎就象系统项目一样对自己的话并无重大。采用后者作为主字段,数据库更新
    继还索引和查找就急匆匆多了。

不过操作数据仓库(ODS)和数据仓库(DW)这简单种植环境下的多寡索引是产生距离之。在DW
环境
生,你若考虑销售部门是什么样组织销售移动的。他们并无是数据库管理员,但是他们规定表内的
键信息。这里设计人员或数据库工作人员应该分析数据库结构从而确定来性能及科学输出之间
的极品标准。

  1. 动用系统生成的主键
    立即同样龙接近与技术1,但本身道出必不可少当此间再次提醒大家。假如你总是以规划数据库的下以
    系统生成的键作为主键,那么您其实控制了数据库的目录完整性。这样,数据库及免人工机制就算
    有效地控制了针对性存储数据遭到每一行的顾。
    动系统生成键作为主键还有一个独到之处:当您拥有同等的键结构时,找到逻辑缺陷很易。

  2. 诠释字段用于索引
    为分离命名字段和含字段为支持用户定义的表,请考虑分解其他字段(甚至主键)为其组
    成为要素以便用户可对该展开索引。索引将加紧SQL
    和表格生成器脚本的实践进度。比方说,
    自我便在必须采取SQL LIKE 表达式的景下创造报表,因为case number
    字段无法分解为
    year、serial number、case type 和defendant code
    等元素。性能为会见更换大。假如年度以及类型字
    段可以说明为找引字段那么这些报表运行起来就是见面赶紧多矣。

  3. 键设计4 原则
    · 为涉字段创建外键。
    · 所有的键都必须唯一。
    · 避免下复合键。
    · 外键总是关联唯一的键字段。

  4. 转变忘了目录
    目是打数据库被获取数据的尽迅速方式有。95%的数据库性能问题都得以应用索引技术取得
    缓解。作为同漫长规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用
    唯的非成组索引,对另外键列下非成组索引。不过,索引就象是盐,太多矣菜就篌了。你
    得考虑数据库的长空有差不多良,表如何进行访问,还有这些访问是否要为此作读写。

大部数据库都引得自动创建的主键字段,但是只是转变忘了目录外键,它们为是常事用的键,比
要运行查询显示主表和富有关联表的某个修记下就是就此得上。还有,不要索引memo/note
字段,不
使寻找引大型字段(有无数字符),这样作会被索引占用太多之贮存空间。

  1. 不用索引常用的小型表
    无须吧小型数据表设置任何键,假如它们常发生插入和去操作就更别这样作了。对这些插入和
    剔除操作的目录维护或于扫描表空间消耗又多的时间。

  2. 甭将社会保障号码(SSN)选作键
    永远都无须采用SSN
    作为数据库的键。除了隐私原因外,须知政府尤其趋于于无许可把
    SSN 用作除收入有关外的其他目的,SSN
    需要手工输入。永远不要用手工输入的键作为主
    键,因为要你输入错误,你唯一能召开的就是抹所有记录然后从头开始。

上个世纪70 年代我还于宣读大学的时刻,我记忆当时SSN
还一度于用做学号,当然尽管这样做是匪
模仿之。而且人们为还知晓这是伪的,但他俩已经习以为常了。后来,随着盗取身份犯罪案件的增
加以,我现之大学校园正痛苦地于平特别摊数据被管SSN 删除。

  1. 永不为此用户的键
    在规定以什么字段作为表底键的时刻,可一定要小心用户即将编辑的字段。通常的情事下不苟
    分选用户可编制的字段作为键。这样做会迫使你用以下简单个法子:
    ·
    在创造记录下对用户编辑字段的表现施加限制。假如你如此做了,你或会见发觉而的应用程
    先后在商务需求突然发生变化,而用户需编制那些不可编辑的字段时少足够的油滑。当用
    户在输入数据以后直到保存记录才意识系发出了问题他们该怎么想?删除重建?假如记录不可
    重建是否为用户走起来?
    ·
    提出一些检测和纠正键冲突之法子。通常,费点精力为即弄定矣,但是从性质达到来拘禁这么做的
    代价就是较大了。还有,键的拨乱反正或者会见迫使你突破你的数与经贸/用户界面层之间的隔
    离。
    用还是再次提一句子古语:你的统筹要服用户若非是让用户来适应你的计划性。

勿为主键具有可更新性的故是在提到模式下,主键实现了不同表之间的关系。比如,
Customer 表有一个主键CustomerID,而客户之定单则存放于其余一个表里。Order
表的主键可能
举凡OrderNo 或者OrderNo、CustomerID
和日期的重组。不管您挑哪种键设置,你还需要在
Order 表中存放CustomerID 来保管你可以为下定单的用户找到其定单记录。
倘你当Customer 表里窜了CustomerID,那么你要寻找来Order
表中之持有有关记录对其上
实行修改。否则,有些定单就会见无属其他客户——数据库的完整性就算完蛋了。
假如找引完整性规则施加到说明一级,那么当匪修大量代码和附加删除记录之情状下几乎无容许
改变有同长达记下之键和数据库内享有涉的记录。而立等同历程反复错误丛生所以应该尽量避免。

  1. 可选键有时只是举行主键
    切记,查询数据的未是机械要是口。
    一旦你发可选键,你恐怕一发把它用做主键。那样的话,你不怕所有了建强有力索引的能力。这
    种种可以阻碍使用数据库的人口只好连续数据库从而方便的过滤数据。在严格控制域表的数据库
    达成,这种负荷是于强烈的。如果只是选键真正产生因此,那就是是上了主键的档次。
    本身的意见是,假如你发可选键,比如国家表内的state_code,你不要以存活不可知改的绝无仅有键直达
    创办后续之键。你要举行的仅是创造毫无价值的多寡。比如以下的事例:
    Select count(*)
    from address, state_ref
    where
    address.state_id = state_ref.state_id
    and state_ref.state_code = ‘TN’
    自的做法是这样的:
    Select count(*)
    from address
    where
    and state_code = ‘TN’
    假若你以过度使用表的后续键建立这种表的关系,操作负载真得用考虑一下了。

  2. 转变忘了外键
    多数数据库索引自动创建的主键字段。但别忘了目录外键字段,它们以您想查询主表中之笔录
    连同涉及记录时老是都见面因此到。还有,不要索引memo/notes
    字段而且不用索引大型文本字段
    (许多字符),这样做会吃您的目占据大量底数据库空间。         


第4 部分— 保证数据的完整性

  1. 就此绳而无商务规则强制数据完整性
    假若你按照商务规则来处理需,那么你该检查商务层次/用户界面:如果商务规则之后发生转移
    变成,那么就需要展开更新即可。
    若是需求来维护数据完整性的要,那么在数据库层面达到待施加限制法。
    如您于数据层确实以了约,你如确保有点子将创新不能够通过自律检查的由来下用户了解
    的言语通知用户界面。除非您的字段命名很冗长,否则字段名本身还不够。

如果有或,请用数据库系统实现多少的完整性。这不仅仅包括通过标准实现的完整性而且还
包括数据的功能性。在描写多少的时刻还好加触发器来保证数据的正确。不要借助让商务层
保证数据完整性;它不能够保证表之间(外键)的完整性所以未可知强加给任何完整性规则之上。

  1. 分布式数据系统
    本着分布式系统而言,在你决定是否当一一站点复制所有数据要拿数据保存在一个地方之前应
    估计一下前景5 年要10
    年的数据量。当你拿数据传送至其它站点的时刻,最好当数据库字段
    遭受安有符号。在目的站点收到你的多少后更新您的记。为了拓展这种多少传,请写下
    你自己的批判处理还是调度程序为一定时刻距离运行而不要让用户以每天的行事后传输数据。本地
    拷贝你的保护数据,比如计算常数和利息等,设置版本号保证数据在每个站点都完全一致。

  2. 强制指示完整性
    莫好方式能以有害数据上数据库后排其,所以您当当其进入数据库之前以该删除。激
    在数据库系统的指令完整性特性。这样好保持数据的干干净净而会强迫开发人员投入还多之时间处
    料理错误条件。

  3. 关系
    比方少单实体之间在多对平关系,而且还有可能转正为多针对多关系,那么您无比好同一开头就安装
    成多针对大多涉及。从现有的多对同一关系转移也多针对大多涉及比同方始即是大半对准几近干而麻烦得多。

  4. 采取视图
    以以公的数据库暨您的应用程序代码之间提供任何一样重合抽象,你可以为汝的应用程序建立专门的
    视图而不用非要应用程序直接看数据表。这样做还相当于在处理数据库变更时被你提供了双重多之
    自由。

  5. 为数有所和死灰复燃制定计划
    设想数据具有策略并含有在规划过程中,预先设计而的数据恢复过程。采用可以宣布为用户/开发
    人员之数码字典实现好的数额识别而确保对数据源文档化。编写在线更新来“更新查询”供
    以后万同样数量丢失可重新处理更新。

  6. 故存储过程为系统做重活
    釜底抽薪了众多辛苦来有一个存有高度完整性的数据库解决方案以后,我所于的团组织决定封装一些
    关联表的功能组,提供一整套正常化的囤积过程来走访各组以便加快速度和简化客户程序代码的开端
    发作。在此期间,我们发现3GL
    编码器设置了颇具或的错误条件,比如以下所示:
    SELECT Cnt = COUNT (*)
    FROM [

<>]
WHERE [ ] =
IF Cnt = 0
BEGIN
INSERT INTO [ >

<>]
( [< primary key column>] )
VALUES ( )
END
ELSE
BEGIN

END
若果一个非3GL 编码器是这么做的:
INSERT INTO [ >

<>]
( [< primary key column>] )
VALUES
( )
IF @@ERROR = 2627 — Literal error code for Primary Key Constraint
BEGIN

END
第2
个程序简单多了,而且实际,利用了咱给数据库的效果。虽然本人个人无喜下嵌入文
配(2627)。但是那样可以充分便利地用一点先期处理来取代。数据库不仅是一个存放数据的地
正在,它呢是简化编码之地。

  1. 运查找
    控制数据完整性的最佳艺术尽管是限量用户之挑三拣四。只要发生或还应该提供于用户一个鲜明的值
    列表供其选择。这样将回落键入代码的一无是处和误解而提供数据的一致性。某些公共数据特别正
    联合查找:国家代码、状态代码等。

第5 部分— 各种小技巧

  1. 文档、文档、文档
    对具备的快捷方式、命名规范、限制和函数都如编写文档。

利用让表、列、触发器等加注的数据库工具。是的,这有接触费事,但自从老来拘禁,这样做对始发
发作、支持与钉修改十分实惠。

有赖于你下的数据库系统,可能发一些软件会给你有的供您快速上手的文档。你恐怕希望先开始
发端在说,然后取更加多之底细。或者您恐怕想周期性的预排,在输入新数据同时就你的
拓展对各级一样有细节化。不管您挑选啊种方法,总要本着您的数据库文档化,或者当数据库自身之
其中或独立成立文档。这样,当你过了同样年差不多工夫晚又回过头来做第2
单本子,你犯错的时
拿大大减少。

  1. 动常用英语(或者其他任何语言)而不要采取编码
    何以咱们常应用编码(比如9935A 可能是墨水笔的供代码,4XF788-Q
    可能是帐目编
    堆)?理由很多。但是用户日常还因此英语进行思考要休是编码。工作5
    年底会计或许知道
    4XF788-Q
    是呀东西,但新来的只是即便非自然了。在开创下拉菜单、列表、报表时最为好照英语
    名排序。假如你需要编码,那尔得以编码旁沾满用户了解的英语。

  2. 保存常用信息
    于一个表专门存放一般数据库信息异常实用。我不时于斯表里存放数据库时版、最近检查/修
    复(对Access)、关联设计文档的称号、客户等信息。这样可实现均等栽简易机制跟踪数据
    库房,当客户抱怨他们的数据库没有达成梦想之渴求要与你联系时,这样做对非客户机/服务器环境
    特意发因此。

  3. 测试、测试、反复测试
    建立或者修订数据库后,必须用用户新输入的数据测试数据字段。最着重之凡,让用户展开测量
    摸索并且与用户一起保险你拣的数据类型满足商业要求。测试需要在管新数据库投入实际服务的
    前完成。

  4. 自我批评计划
    每当支付期间检查数据库设计之常用技术是经过其所支持之应用程序原型检查数据库。换句话说,
    针对各个一样种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。

  5. Access 设计技术
    针对复杂的Microsoft Access
    数据库应用程序而言,可以拿具有的主表放在一个数据库文件里,然
    晚长其他数据库文件以及装同旧数据库有关的异样函数。根据需要为此这些函数连接到主文件
    遭的主表。比如数据输入、数据QC、统计分析、向管理层要政府部门提供报表及各只读
    查询等。这同一方简化了用户与组权限的分红,而且好应用程序函数的分组和细分,从而以
    先后必须修改的当儿容易管理。

14:32 | 评论
(0)

MS
SQL数据库备份和回复存储过程

if exists(
select * from sysobjects
where name=””””pr_backup_db”””” and xtype=””””p””””
)
begin
drop proc pr_backup_db
end

go

/*备份数据库*/
create proc pr_backup_db
@flag varchar(10) out,
@backup_db_name varchar(128),
@filename varchar(1000) –路径+文件名字
as
declare @sql nvarchar(4000),@par nvarchar(1000)
select @par=””””@filename varchar(1000)””””
select @sql=””””BACKUP DATABASE ””””+@backup_db_name+””””
to disk=@filename with init””””
execute sp_executesql @sql,@par,@filename
select @flag=””””ok””””
go

if exists(
select * from sysobjects
where name=””””fn_GetFilePath”””” and
xtype=””””fn””””
)
begin
drop function fn_GetFilePath
end
go

/*缔造函数,得到文件得路径*/
create function fn_GetFilePath(@filename nvarchar(260))
returns nvarchar(260)
as
begin
declare @file_path nvarchar(260)
declare @filename_reverse nvarchar(260)
select @filename_reverse=reverse(@filename)
select
@file_path=substring(@filename,1,len(@filename)+1-charindex(””””\””””,@filename_reverse))
return @file_path
end

go

if exists(
select * from sysobjects
where name=””””pr_restore_db”””” and xtype=””””p””””
)
begin
drop proc pr_restore_db
end
go

create proc pr_restore_db /*卷土重来数据库*/
@flag varchar(20) out, /*过程运行的状态标志,是输入参数*/
@restore_db_name nvarchar(128), /*若果东山再起的数目名字*/
@filename nvarchar(260) /*备份文件存放的门道+备份文件名字*/
as
declare @proc_result tinyint
/*回来系统存储过程xp_cmdshell运行结果*/
declare @loop_time smallint /*巡回次数*/
declare @max_ids smallint /*@tem表的ids列最深屡屡*/
declare @file_bak_path nvarchar(260) /*原来数据库存放路径*/
declare @flag_file bit /*文件存放标志*/
declare @master_path nvarchar(260) /*数据库master文件路径*/
declare @sql nvarchar(4000),@par nvarchar(1000)
declare @sql_sub nvarchar(4000)
declare @sql_cmd nvarchar(4000)
/*
判断参数@filename文件格式合法性,以防止用户输入类似d: 或者 c:\a\
等不法文件称
参数@filename里面要出””””\””””并且不坐””””\””””结尾
*/
if right(@filename,1)<>””””\”””” and
charindex(””””\””””,@filename)<>0
begin
select @sql_cmd=””””dir ””””+@filename
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
IF (@proc_result<>0)
/*网存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
begin
select @flag=””””not exist”””” /*备份文件不设有*/
return /*退过程*/
end
/*创立临时表,保存由备份集内包含的数据库暨日志文件列表组成的结果集*/
create table #tem(
LogicalName nvarchar(128), /*文件的逻辑名称*/
PhysicalName nvarchar(260) , /*文本的物理名称或者操作系统名称*/
Type char(1), /*数据文件 (D) 或日志文件 (L)*/
FileGroupName nvarchar(128), /*寓文件之文书组称*/
[Size] numeric(20,0), /*眼下大小(以字节为单位)*/
[MaxSize] numeric(20,0) /*兴的最好酷尺寸(以字节为单位)*/
)
/*
始建表变量,表结构和临时表基本一样
就是是基本上了点儿排,
列ids(自增编号列),
列file_path,存放文件的途径
*/
declare @tem table(
ids smallint identity, /*自增编号列*/
LogicalName nvarchar(128),
PhysicalName nvarchar(260),
File_path nvarchar(260),
Type char(1),
FileGroupName nvarchar(128)
)
insert into #tem
execute(””””restore filelistonly from
disk=””””””””””””+@filename+””””””””””””””””)
/*拿临时表导入表变量中,并且计算起相应得路径*/
insert into
@tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
select
LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
from #tem
if @@rowcount>0
begin
drop table #tem
end
select @loop_time=1
select @max_ids=max(ids) /*@tem表的ids列最老屡屡*/
from @tem
while @loop_time<=@max_ids
begin
select @file_bak_path=file_path
from @tem where ids=@loop_time
select @sql_cmd=””””dir ””””+@file_bak_path
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
/*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
IF (@proc_result<>0)
select @loop_time=@loop_time+1
else
BREAK /*没有找到备份前数据文件原有存放路径,退出循环*/
end
select @master_path=””””””””
if @loop_time>@max_ids
select @flag_file=1 /*备份前数据文件原有存放路径有*/
else
begin
select @flag_file=0 /*备份前数据文件原有存放路径不在*/
select @master_path=dbo.fn_GetFilePath(filename)
from master..sysdatabases where name=””””master””””
end
select @sql_sub=””””””””
/*type=””””d””””是数据文件,type=””””l””””是日记文件
*/
/*@flag_file=1时新的数据库文件要存放于原先路线,否则存放路径和master数据库路径一样*/
select @sql_sub=@sql_sub+””””move
””””””””””””+LogicalName+”””””””””””” to
””””””””””””
+case type
when ””””d”””” then case @flag_file
when 1 then File_path
else @master_path
end
when ””””l”””” then case @flag_file
when 1 then File_path
else @master_path
end
end
+case type
when ””””d”””” then
@restore_db_name+””””_””””+LogicalName+””””_data.mdf””””””””,””””
when ””””l”””” then
@restore_db_name+””””_””””+LogicalName+””””_log.ldf””””””””,””””
end
from @tem
select @sql=””””RESTORE DATABASE @db_name FROM DISK=@filename with
””””
select @sql=@sql+@sql_sub+””””replace””””
select @par=””””@db_name nvarchar(128),@filename
nvarchar(260)””””
print @sql
execute sp_executesql
@sql,@par,@db_name=@restore_db_name,@filename=@filename
select @flag=””””ok”””” /*操作成*/
end
else
begin
SELECT @flag=””””file type error””””
/*参数@filename输入格式错误*/
end

–备份数据库test_database
declare @fl varchar(10)
execute pr_backup_db @fl
out,””””test_database””””,””””c:\test_database.bak””””
select @fl

–恢复数据库,输入的参数错误
declare @fl varchar(20)
exec pr_restore_db @fl out,””””sa””””,””””c:\””””
select @fl

–恢复数据库,即开立数据库test_database的复本test_db
declare @fl varchar(20)
exec pr_restore_db @fl
out,””””test_db””””,””””c:\test_database.bak””””
select @fl

地方写了MS SQL数据库备份和死灰复燃存储过程

自从感觉效果未太齐全,就重新勾了扳平加强版本,经过测试成功!
先用代码发布出来,大家共享。
假若发生察觉BUG,请大家指教或EMAIL:aierong@vip.sina.com

/**//*备份数据库*/
create proc pr_backup_db
@flag varchar(20) out,
@backup_db_name varchar(128),
@filename varchar(1000)  –路径+文件名字
as
declare @sql nvarchar(4000),@par nvarchar(1000)
if not exists(
select * from master..sysdatabases
  where name=@backup_db_name
  )
begin
select @flag=””””db not exist””””  /**//*数据库不存在*/
return
end
else
begin
if right(@filename,1)<>”””””””” and
charindex(””””””””,@filename)<>0
begin
  select @par=””””@filename varchar(1000)””””
  select @sql=””””BACKUP DATABASE ””””+@backup_db_name
                         +”””” to disk=@filename with init””””
  execute sp_executesql @sql,@par,@filename
  select @flag=””””ok””””
  return
end
else
begin
  select @flag=””””file type
error””””  /**//*参数@filename输入格式错误*/
  return
end
end

GO

/**//*创建函数,得到文件得路径*/
create function fn_GetFilePath(@filename nvarchar(260))
returns nvarchar(260)   
as
begin
declare @file_path nvarchar(260)
declare @filename_reverse nvarchar(260)
select @filename_reverse=reverse(@filename)
select
@file_path=substring(@filename,1,len(@filename)+1-charindex(””””””””,@filename_reverse))
return @file_path
end

GO

/**//*回复数据库*/
CREATE  proc pr_restore_db    

/**//*

Create Time:    2004-03-20
Update Time:    2004-03-29 11:05
Author:         aierong
Remark:         恢复数据库

  

*/
/**//*经过运行的状态标志,是输入参数*/      
@flag varchar(20) out,    
/**//*若过来的数名字*/
@restore_db_name nvarchar(128),
/**//*备份文件存放的途径+备份文件名字*/
@filename nvarchar(260)         
as
/**//*回系统存储过程xp_cmdshell运行结果*/
declare @proc_result tinyint
/**//*巡回次数*/
declare @loop_time smallint  
/**//*@tem表的ids列最充分勤*/
declare @max_ids smallint    
/**//*本数据库存放路径*/
declare @file_bak_path nvarchar(260)  
/**//*文件存放标志*/
declare @flag_file bit   
/**//*数据库master文件路径*/
declare @master_path nvarchar(260)  
declare @sql nvarchar(4000),@par nvarchar(1000)
declare @sql_sub nvarchar(4000)
declare @sql_cmd nvarchar(100)
declare @sql_kill nvarchar(100)
/**//*
认清参数@filename文件格式合法性,以戒用户输入类似d: 或者 c:a
等地下文件称
参数@filename里面要出””””””””并且不以””””””””结尾
*/
if right(@filename,1)<>”””””””” and
charindex(””””””””,@filename)<>0
begin
select @sql_cmd=””””dir ””””+@filename
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
/**//*系存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
IF (@proc_result<>0)  
begin
  /**//*备份文件不设有*/
  select @flag=””””not exist””””   
  /**//*离过程*/
  return  
end
/**//*始建临时表,保存由备份集内包含的数据库与日志文件列表组成的结果集*/
create table #tem(
     /**//*文本之逻辑名称*/
     LogicalName nvarchar(128),
     /**//*文件的情理名称或操作系统名称*/
     PhysicalName nvarchar(260) ,
            /**//*数据文件 (D) 或日志文件 (L)*/
     Type char(1),  
     /**//*包含文件的文件组称*/
     FileGroupName nvarchar(128),
                          /**//*眼前高低(以字节为单位)*/
     [Size] numeric(20,0),  
     /**//*兴的无限可怜尺寸(以字节为单位)*/
     [MaxSize] numeric(20,0)  
   )
/**//*
创表变量,表结构以及临时表基本雷同
即使是基本上了一定量排列,
列ids(自增编号列),
列file_path,存放文件之门道
*/
declare @tem table(       
     /**//*自从增编号列*/
     ids smallint identity,  
     LogicalName nvarchar(128),
     PhysicalName nvarchar(260),
     File_path nvarchar(260),
     Type char(1),  
     FileGroupName nvarchar(128)
   )
insert into #tem
  execute(””””restore filelistonly from
disk=””””””””””””+@filename+””””””””””””””””)
/**//*用现表导入表变量中,并且计算出相应得路径*/
insert into
@tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)  
  select
LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
   from #tem
if @@rowcount>0
begin
  drop table #tem
end
select @loop_time=1
/**//*@tem表的ids列最充分累*/
select @max_ids=max(ids)  
  from @tem
while @loop_time<=@max_ids
begin
  select @file_bak_path=file_path
   from @tem where ids=@loop_time
  select @sql_cmd=””””dir ””””+@file_bak_path
  EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
  /**//*网存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
  IF (@proc_result<>0)
   select @loop_time=@loop_time+1  
  else
   /**//*莫找到备份前数据文件原有存放路径,退出循环*/
   BREAK
end
select @master_path=””””””””
if @loop_time>@max_ids
  /**//*备份前数据文件原有存放路径在*/
  select @flag_file=1   
else
begin
  /**//*备份前数据文件原有存放路径不在*/
  select @flag_file=0  
  select @master_path=dbo.fn_GetFilePath(filename)
   from master..sysdatabases
   where name=””””master””””
end
select @sql_sub=””””””””
/**//*type=””””d””””是数据文件,type=””””l””””是日记文件
*/
/**//*@flag_file=1时初的数据库文件要存放于原本路线,否则存放路径和master数据库路径一样*/
select @sql_sub=@sql_sub+””””move
””””””””””””+LogicalName+”””””””””””” to
””””””””””””
   +case type
         when ””””d”””” then case @flag_file
             when 1 then  File_path
      else @master_path
          end    
         when ””””l”””” then case  @flag_file
      when 1 then  File_path
      else @master_path
          end    
   end
   +case type
    when ””””d”””” then @restore_db_name
           +””””_DATA””””
           /**//*叫文件编号*/
           +convert(sysname,ids)  
           +””””.””””
           /**//*让文件参加后缀名,mdf or ndf*/
           +right(PhysicalName,3)  
           +””””””””””””,””””  
    when ””””l”””” then @restore_db_name
           +””””_LOG””””
           /**//*吃文件编号*/
           +convert(sysname,ids)   
           +””””.””””
           /**//*于文件参加后缀名,mdf or ndf*/
           +right(PhysicalName,3)  
           +””””””””””””,””””  
    end
   from @tem
select @sql=””””RESTORE DATABASE @db_name ””””
                        +””””FROM DISK=@filename with ””””
select @sql=@sql+@sql_sub+””””replace””””
select @par=””””@db_name nvarchar(128),@filename
nvarchar(260)””””
/**//*闭馆相关进程,把相应进程状况导入临时表中*/
select identity(int,1,1) ids, spid
  into #temp
  from master..sysprocesses
  where dbid=db_id(@restore_db_name)
/**//*找到呼应进程*/
if @@rowcount>0
begin   
  select @max_ids=max(ids)
   from #temp
  select @loop_time=1
  while @loop_time<=@max_ids
  begin
   select @sql_kill=””””kill ””””+convert(nvarchar(20),spid)
    from #temp
    where ids=@loop_time
   execute sp_executesql @sql_kill
   select @loop_time=@loop_time+1
  end
end
drop table #temp
execute sp_executesql @sql,
                                      @par,
                                      @db_name=@restore_db_name,
                                      @filename=@filename
/**//*操作成*/
select @flag=””””ok””””   
end
else
begin
/**//*参数@filename输入格式错误*/
SELECT @flag=””””file type error””””  
end

GO

/*运行*/

–备份数据库test_database
declare @fl varchar(10)
execute pr_backup_db @fl
out,””””test_database””””,””””c:\test_database.bak””””
select @fl

–恢复数据库,输入的参数错误
declare @fl varchar(20)
exec pr_restore_db @fl out,””””sa””””,””””c:\””””
select @fl

–恢复数据库,即创办数据库test_database的复本test_db
declare @fl varchar(20)
exec pr_restore_db @fl
out,””””test_db””””,””””c:\test_database.bak””””
select @fl

具体可扣押
http://dev.csdn.net/article/28/28463.shtm

14:28 | 评论
(0)

SQL语句导入导出方法

/*******  导出到excel
EXEC master..xp_cmdshell ””bcp SettleDB.dbo.shanghu out c:\temp1.xls
-c -q -S”GNETDATA/GNETDATA” -U”sa” -P””””

/***********  导入Excel
SELECT *
FROM OpenDataSource( ””Microsoft.Jet.OLEDB.4.0””,
  ””Data Source=”c:\test.xls”;User ID=Admin;Password=;Extended
properties=Excel 5.0””)…xactions

/*动态文件称
declare @fn varchar(20),@s varchar(1000)
set @fn = ””c:\test.xls””
set @s =””””””Microsoft.Jet.OLEDB.4.0””””,
””””Data Source=”””+@fn+”””;User ID=Admin;Password=;Extended
properties=Excel 5.0””””””
set @s = ””SELECT * FROM OpenDataSource
(””+@s+””)…sheet1$””
exec(@s)
*/

SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+”” ””
转换后底别名
FROM OpenDataSource( ””Microsoft.Jet.OLEDB.4.0””,
  ””Data Source=”c:\test.xls”;User ID=Admin;Password=;Extended
properties=Excel 5.0””)…xactions

/********************** EXCEL导到长途SQL
insert OPENDATASOURCE(
         ””SQLOLEDB””,
         ””Data Source=远程ip;User ID=sa;Password=密码””
         ).库名.dbo.表名 (列名1,列名2)
SELECT 列名1,列名2
FROM OpenDataSource( ””Microsoft.Jet.OLEDB.4.0””,
  ””Data Source=”c:\test.xls”;User ID=Admin;Password=;Extended
properties=Excel 5.0””)…xactions

/** 导入文本文件
EXEC master..xp_cmdshell ””bcp dbname..tablename in c:\DT.txt -c
-Sservername -Usa -Ppassword””

/** 导出文件文件
EXEC master..xp_cmdshell ””bcp dbname..tablename out c:\DT.txt -c
-Sservername -Usa -Ppassword””

EXEC master..xp_cmdshell ””bcp “Select * from dbname..tablename”
queryout c:\DT.txt -c -Sservername -Usa -Ppassword””

导出到TXT文本,用逗号分开
exec master..xp_cmdshell ””bcp “库名..表名” out “d:\tt.txt” -c -t
,-U sa -P password””

BULK INSERT 库名..表名
FROM ””c:\test.txt””
WITH (
    FIELDTERMINATOR = ””;””,
    ROWTERMINATOR = ””\n””
)

–/* dBase IV文件
select * from
OPENROWSET(””MICROSOFT.JET.OLEDB.4.0””
,””dBase IV;HDR=NO;IMEX=2;DATABASE=C:\””,””select * from
[客户资料4.dbf]””)
–*/

–/* dBase III文件
select * from
OPENROWSET(””MICROSOFT.JET.OLEDB.4.0””
,””dBase III;HDR=NO;IMEX=2;DATABASE=C:\””,””select * from
[客户资料3.dbf]””)
–*/

–/* FoxPro 数据库
select * from openrowset(””MSDASQL””,
””Driver=Microsoft Visual FoxPro
Driver;SourceType=DBF;SourceDB=c:\””,
””select * from [aa.DBF]””)
–*/

/**************导入DBF文件****************/
select * from openrowset(””MSDASQL””,
””Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:\VFP98\data;
SourceType=DBF””,
””select * from customer where country != “USA” order by
country””)
go
/***************** 导出到DBF
***************/
倘若如导出数据及都转移结构(即现存的)FOXPRO表中,可以一直用底的SQL语句

insert into openrowset(””MSDASQL””,
””Driver=Microsoft Visual FoxPro
Driver;SourceType=DBF;SourceDB=c:\””,
””select * from [aa.DBF]””)
select * from 表

说明:
SourceDB=c:\  指定foxpro表所于的文件夹
aa.DBF        指定foxpro表的文本名.

/*************导出到Access********************/
insert into openrowset(””Microsoft.Jet.OLEDB.4.0””,
   ””x:\A.mdb””;””admin””;””””,A表) select * from
数据库名..B表

/*************导入Access********************/
insert into B表 selet * from
openrowset(””Microsoft.Jet.OLEDB.4.0””,
   ””x:\A.mdb””;””admin””;””””,A表)

文本称吧参数
declare @fname varchar(20)
set @fname = ””d:\test.mdb””
exec(””SELECT a.* FROM
opendatasource(””””Microsoft.Jet.OLEDB.4.0””””,
    ””””””+@fname+””””””;””””admin””””;””””””””,
topics) as a ””)

SELECT *
FROM OpenDataSource( ””Microsoft.Jet.OLEDB.4.0””,
  ””Data Source=”f:\northwind.mdb”;Jet OLEDB:Database
Password=123;User ID=Admin;Password=;””)…产品

*********************  导入 xml 文件

DECLARE @idoc int
DECLARE @doc varchar(1000)
–sample XML document
SET @doc =””

  
      
      Customer was very satisfied
      
   
   
      
            Important
            Happy Customer.
      
      
   

””
— Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

— Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, ””/root/Customer/Order””, 1)
      WITH (oid     char(5),
            amount  float,
            comment ntext ””text()””)
EXEC sp_xml_removedocument @idoc

???????

/**********************Excel导到Txt****************************************/
想用
select * into opendatasource(…) from opendatasource(…)
落实用一个Excel文件内容导入到一个文件文件

假设Excel中出少列,第一列为姓名,第二列为特别行帐号(16个)
还银行帐号导出到文本文件后分点儿有的,前8各类以及晚8各项分别。

邹健:
如若如为此你点的口舌插入的话,文本文件要存在,而且产生一行:姓名,银行账号1,银行账号2
接下来就足以就此脚的讲话进行扦插
专注文件称及目录根据你的莫过于状况进行修改.

insert into
opendatasource(””MICROSOFT.JET.OLEDB.4.0””
,””Text;HDR=Yes;DATABASE=C:\””
)…[aa#txt]
–,aa#txt)
–*/
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
from
opendatasource(””MICROSOFT.JET.OLEDB.4.0””
,””Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls””
–,Sheet1$)
)…[Sheet1$]

要你想直接插入并转移文书文件,就要用bcp

declare @sql varchar(8000),@tbname varchar(50)

–首先用excel表内容导入到一个大局临时表
select @tbname=””[##temp””+cast(newid() as
varchar(40))+””]””
,@sql=””select
姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
into ””+@tbname+”” from
opendatasource(””””MICROSOFT.JET.OLEDB.4.0””””
,””””Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls””””
)…[Sheet1$]””
exec(@sql)

–然后因故bcp从大局临时表导出至文本文件
set @sql=””bcp “””+@tbname+””” out “c:\aa.txt” /S”(local)” /P””
/c””
exec master..xp_cmdshell @sql

–删除ACCESS临时表
exec(””drop table ””+@tbname)

/********************传输整个数据库*********************************************/

因此bcp实现之贮存过程

/*
心想事成数量导入/导出的囤过程
         根据不同之参数,可以实现导入/导出整个数据库/单个表
调用示例:
–导出调用示例
—-导出单个表
exec file2table
””zj””,””””,””””,””xzkh_sa..域资料””,””c:\zj.txt””,1
—-导出整个数据库
exec file2table
””zj””,””””,””””,””xzkh_sa””,””C:\docman””,1

–导入调用示例
—-导入单个表
exec file2table
””zj””,””””,””””,””xzkh_sa..地面资料””,””c:\zj.txt””,0
—-导入整个数据库
exec file2table
””zj””,””””,””””,””xzkh_sa””,””C:\docman””,0

*/
if exists(select 1 from sysobjects where name=””File2Table”” and
objectproperty(id,””IsProcedure””)=1)
drop procedure File2Table
go
create procedure File2Table
@servername varchar(200)  –服务器名
,@username varchar(200)   –用户称,如果就此NT验证办法,则也空””””
,@password varchar(200)   –密码
,@tbname
varchar(500)   –数据库.dbo.表名,如果未点名:.dbo.表名,则导出数据库的所有用户表
,@filename
varchar(1000)  –导入/导出路径/文件称,如果@tbname参数指明是导出整个数据库,则这参数是文本存放路径,文件称自动用表名.txt
,@isout bit      –1为导出,0为导入
as
declare @sql varchar(8000)

if @tbname like ””%.%.%”” –如果指定了表名,则直接导出单个表
begin
set @sql=””bcp ””+@tbname
  +case when @isout=1 then ”” out ”” else ”” in ”” end
  +”” “””+@filename+””” /w””
  +”” /S ””+@servername
  +case when isnull(@username,””””)=”””” then ”””” else ””
/U ””+@username end
  +”” /P ””+isnull(@password,””””)
exec master..xp_cmdshell @sql
end
else
begin –导出全数据库,定义游标,取出所有的用户表
declare @m_tbname varchar(250)
if right(@filename,1)<>””\”” set
@filename=@filename+””\””

set @m_tbname=””declare #tb cursor for select name from
””+@tbname+””..sysobjects where xtype=””””U””””””
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
  set @sql=””bcp ””+@tbname+””..””+@m_tbname
   +case when @isout=1 then ”” out ”” else ”” in ”” end
   +”” “””+@filename+@m_tbname+””.txt ” /w””
   +”” /S ””+@servername
   +case when isnull(@username,””””)=”””” then ”””” else
”” /U ””+@username end
   +”” /P ””+isnull(@password,””””)
  exec master..xp_cmdshell @sql
  fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go

/************* Oracle **************/
EXEC sp_addlinkedserver ””OracleSvr””,
   ””Oracle 7.3””,
   ””MSDAORA””,
   ””ORCLDB””
GO

delete from openquery(mailser,””select *  from yulin””)

select *  from openquery(mailser,””select *  from yulin””)

update openquery(mailser,””select * from  yulin where id=15””)set
disorder=555,catago=888

insert into openquery(mailser,””select disorder,catago
from  yulin””)values(333,777)

补充:

对此用bcp导出,是未曾字段名的.

故而openrowset导出,需要先建造好表.

故openrowset导入,除ACCESS及EXCEL外,均无支持非本机数据导入

14:26 | 评论
(0)

2004年11月16日 #

以一个DATAGRID中实现增长、删除和更新

昨日拘留了单例子中有个主意给自己觉得怪的好用。其实深简短,关键代码在初始化DATAGRID的上加点东西。
void initialize(Object obj,DataGridItemEventArgs
e)//注意参数与其它函数不同
   {
    //e.Item.Cells[0].Text=”aaaaa”;//
    if(e.Item.ItemIndex==0)//如果是率先履行
    {
     LinkButton a0=new LinkButton();
     a0=(LinkButton)e.Item.Cells[0].Controls[0];
    
     LinkButton a1=new LinkButton();
     a1=(LinkButton)e.Item.Cells[1].Controls[0];//在grid内盖一个linkbutton控件
    
     if(a0.Text==”删 除”)
      a0.Text=””;
     if(a1.Text==”编 辑”)
      a1.Text=”[AddNew]”;
    }

意义如下:

>

    isbn author title category comments
[AddNew] Add ISBN        
删 除 编 辑 Add ISBN okkk kk kk kk
删 除 编 辑 Add ISBN        
删 除 编 辑 2e2e2we2we2 fefdw 2e2eef 324tg r3rrgeqw21
删 除 编 辑 1234345 ssdfdfe fgregre r4er43trt r3r3redqeq
删 除 编 辑 1234345 ssdfdfe fgregre r4er43trt r3r3redqeq
删 除 编 辑 0679757651 Tom Peters Circle of Innovation marketing His most recent book is his best by far!
删 除 编 辑 0884270610 Eli Goldthrait The Goal management Advocate of Theory of Constraints as applied to managment and optimization.
删 除 编 辑 068485600X Jeff Cox, Howard Stevens Selling the Wheel management Excellent Treatise/Novel on the entire Sales Cycle
删 除 编 辑 0672316498 Alan Cooper The Inmates Are Running The Asylum management The father of Visual Basic and creator of the new art of Interaction Design – very valuable in designing websites. Basically the worlds most cutting edge thinker in User Interface design aimed at simplifying software use.

相关文章