


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用触发器自动记录数据的变化 一、 需求的产生在以数据为主的企业应用中,有时需要记录敏感数据的变化。比如有关职工的个人信息,需要保证信息的准确性和安全性,不能够随意更改,每次的更改都要详细的记录下修改时间,修改前后字段的内容,操作员等。下面让我们看看如何在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东广州医学院第一附属医院住院医师规范化培训招生33人(第二批)模拟试卷及答案详解(夺冠系列)
- 2025辽宁盘锦汇鑫招商运营有限公司招聘招商人员人员模拟试卷及答案详解(有一套)
- 2025年吉林省高校毕业生三支一扶计划招募模拟试卷附答案详解(黄金题型)
- 2025年河北中医药大学选聘工作人员25名模拟试卷及答案详解(易错题)
- 2025年成都市武侯区公开选调事业单位工作人员10人考前自测高频考点模拟试题附答案详解(典型题)
- 2025辽宁沈阳市城市建设投资集团有限公司所属二级公司沈阳客运集团有限公司拟聘用人员模拟试卷及答案详解(历年真题)
- 2025年浙江大学医学院附属儿童医院招聘眼科劳务派遣特检1人考前自测高频考点模拟试题及答案详解(网校专用)
- 2025湖南省人民医院(湖南师范大学附属第一医院)高层次人才公开招聘78人模拟试卷及参考答案详解一套
- 家居装饰市场深度洞察报告
- 2025江苏南京市浦口区中医院招聘42人模拟试卷及1套完整答案详解
- 《道路勘测设计》课件-第三章 平面设计
- 学堂在线 英文科技论文写作与学术报告 期末考试答案
- 护理安全警示教育案例
- 车辆损坏和解协议书
- 品控管理制度大全
- 洗衣房院感知识培训课件
- XX附属学校职称评聘及岗位聘任实施办法(完整版)
- DBJ51-T 040-2021 四川省工程建设项目招标代理操作规程
- 创新方法大赛理论知识考核试题题库及答案
- 电机车点检表及点检标准
- 高一英语必修一单词表默写版
评论
0/150
提交评论