全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用触发器自动记录数据的变化 一、 需求的产生在以数据为主的企业应用中,有时需要记录敏感数据的变化。比如有关职工的个人信息,需要保证信息的准确性和安全性,不能够随意更改,每次的更改都要详细的记录下修改时间,修改前后字段的内容,操作员等。下面让我们看看如何在SQL SERVER数据库上实现这个功能。我的应用环境是WinForm的C/S结构,没有测试其他环境。二、 如何有效的保存数据变化产生的信息 如果另外新建一个和原数据表结构一样的数据表用来保存数据的变化,这显然不是一个好主意,数据冗余量大,不利于以后的查看,并且不能记录额外的信息。我们可以设计一个通用的数据表结构来保存数据的变化信息:CREATE TABLE dbo.DataRecorder( ID int IDENTITY(1,1) NOT NULL, TableName nvarchar(50) NOT NULL, KeyValue varchar(50) NOT NULL, FieldName nvarchar(50) NOT NULL, OldValue nvarchar(500) NULL, NewValue nvarchar(500) NULL, RecordDate smalldatetime NOT NULL CONSTRAINT DF_LIIInsuInfo_RecordDateDEFAULT (getdate(),Recorder nvarchar(20) NOT NULL)字段的说明:TableName指存在数据变化的数据表名称,既然是通用的表,就要区分是记录的哪个表。KeyValue 指存在数据变化的数据表中的关键字段值,用于知道记录的是哪条记录。FieldName指哪个字段存在数据变化。OldValue记录数据变化前的值,重要,如果想改回以前的值,这个必须要记录。NewValue记录数据变化后的新值。Recorder记录是谁操作的。嘿嘿,想偷偷提高自己的工资标准?小样,后台记着呢。三、 如何不受人为影响自动记录,降低程序设计的复杂性,提高通用性 既然自动记录,首先想到的当然是利用触发器了。 首先遇到的第一个难点是,如何记录操作员。参考前人做法,建一个记录用户登录的数据表(UserLogin),只需要三个字段,记录用户名(UserName)、登录机器的名称(HostName)和登录时间(LoginTime).这儿假定数据操作是由同一台PC最近登录的用户进行的。第二个问题是字段名,我们有时需要直观的字段名称,如果直接给出缩写后的字段名,可能会引起混淆,这儿可以利用列属性中的说明来解决,在创建数据表时在每个列属性中的说明中指定直观有意义的名称,只要取出这个说明就可以保存有意义的字段名称。第三个问题是有些字段不需要进行记录,比如一些内容较多的说明性的大字段。需要在程序中排除。好了,下面让我们看看触发器的主要部分:CREATETRIGGERdbo.tr_UpdateONAFTERUPDATEASBEGINSETNOCOUNTON;SELECTmid=IDENTITY(int,1,1),*INTO#iFROMinsertedIFrowcount=0RETURNSELECTmid=IDENTITY(int,1,1),*INTO#dFROMdeletedDECLARETableNamenvarchar(10),Recordernvarchar(20),snvarchar(4000)SELECTTOP1TableName=职工信息表,Recorder=UserNameFROMUserLoginWHEREHostName=host_name()ORDERBYLoginTimeDESCDECLARE#tbCURSORLOCALFORSELECTINSERTDataRecorder(TableName,KeyValue,FieldName,OldValue,NewValue,Recorder)SELECTTableName,CAST(i.EmployeeIDASnvarchar),+CAST(ISNULL(b.value,)ASchar(50)+,CAST(d.++ASnvarchar),CAST(i.++ASnvarchar),RecorderFROM#dd,#iiWHEREi.mid=d.midANDi.++d.++FROMsyscolumnsaLEFTJOINsys.extended_propertiesbONa.id=b.major_idANDa.colid=b.minor_idWHEREa.id=object_id(Employee)AND(Substring(columns_updated(),(a.colid-1)/8+1,1)&power(2,(a.colid-1)%8)=power(2,(a.colid-1)%8)ANDNOTIN(Remarks,Address)ORDERBYa.colidOPEN#tbFETCH#tbINTOsWHILEfetch_status=0BEGINEXECsp_e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- “月历中的数学”教学设计
- 春季注册土木工程师(建筑)考试模拟试题及答案解析
- 月嫂职业技能培训与考核试题及答案
- 杭州西湖区蒋村街道社区工作者招聘考试真题
- 档案法试题及答案
- 母婴护理师理论考试题库及答案
- 常用应急预案会议记录(3篇)
- 2025-2026学年湖北省荆州市沙市中学高一上学期9月月考英语试题含答案
- 2025年生育政策知识测试题附答案
- 人力资源管理六大板块的详细内容
- 长安CS55汽车说明书
- 《虚拟现实(VR)制作与应用》考试复习题库(汇总)
- 110kV变电站调试方案
- HSF技术标准解析
- 保障农民工工资支付协调机制和工资预防机制
- 健康照护师-国家职业技能标准
- 港口幼儿园观察记录表
- (9.5.1)-10.5失血性休克病理生理学
- GB/T 2423.1-2008电工电子产品环境试验第2部分:试验方法试验A:低温
- 大学生理学呼吸系统课件
- 不稳定型心绞痛教学查房共37张课件
评论
0/150
提交评论