首页 > 范文大全 > 正文

基于日志的HIS系统安全策略

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于日志的HIS系统安全策略范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:针对大型医院管理信息系统(HIS)数据安全的重要性,本文提出基于日志的安全策略。充分发挥Oracle数据库的优势,通过后台有针对性的建立日志系统来实现his的安全管理,并给出了解决实例。

关键词: HIS系统Oracle日志PL/SQL

中图分类号: 文献标识码:A文章编号:1007-9416(2010)01-0000-00

A HIS System Security Strategy Based On Log

ZHAI You-hua

(The Second Affricated Hospital of Nanjing Medical University, Nanjing 210011)

Abstract :To target the importance of HIS’s data security, this passage presents a Security Strategy which based on log system. Through the backgroud log system,Bringing into full play the advantage of oracle database, also describes the detail program.

Keywords :HIS system Oracle Log PL/SQL

1 引言

HIS系统是医院信息系统的核心,而系统中的数据,更是核心中的核心。数据的安全性关系到整个系统能否正常的运行,并最终关系到医院能否提供正常的服务。所以对整个系统而言,做好数据保护至关重要,它是保证医院提供正常服务的最后一道防线。本院HIS系统除了利用oracle提供的备份恢复工具,在数据库级做好数据备份工作,我们还开发了一套针对用户操作记录,及用户跟踪的安全系统,大大提高了系统的安全性。

通常的日志系统整合到前台的应用程序中来实现,对用户登陆、修改数据的过程进行记录,同时保存到系统日志表中。目前,常用的系统开发平台.NET、PB、Delphi 和Visual Basic等提供了各种易用的控件,降低了开发人员的开发难度。但是这也使控件对数据的操作变得不完全透明,开发人员很难了解控件对数据的具体操作,从而使这种本来就不方便的日志实现越来越难。

本文针对设计、开发大型医院管理信息系统过程中应用前台实现安全日志的难度,将安全日志系统移到后台来解决,充分利用Oracle 数据库PL/SQL 的强大优势,建立一套完善的安全日志系统。

2 实现技术

PL/SQL 是一种高级数据库程序设计语言,代表面向过程化的语言与SQL 语言的结合,专门用于在各种环境下对Oracle 数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL 代码可以对数据进行快速高效的处理,PL/SQL是在SQL语言中扩充了面向过程语言中的程序结构。PL/SQL 语言实现了将过程结构与Oracle SQL的无缝集成,从而为用户提供了一种功能强大的结构化程序设计语言。

触发器类似于函数和过程,它们都具有声明部分、执行部分和异常处理部分的命名PL/SQL 块。运行触发器的方式叫做激发(Firing) 触发器, 触发事件可以是对数据库表的DML ( Insert、Update 或Delete) 操作或某种视图的操作(View)。Oracle 8i之后把触发器功能扩展到了可以激发系统事件,如数据库的启动和关闭,以及某种DDL操作。

有三种主要的触发器类型:DML、替代触发器和系统触发器。

DML 触发器由DML 语句激发,由该语句的类型决定DML 触发器的类型。可以定义DML 触发器进行Insert、Update、Delete 操作。这类触发器可以在上述操作之前或之后激发,除此之外,它们也可以在行或语句操作上激发。

替代触发器( Instead of trigger) 只能定义在视图上(可以是关系或对象)。与DML触发器不同, DML 触发器是在DML操作之外运行的,而替代触发器则代替激发它的DML语句行。

Oracle 9i提供了系统触发器。系统触发器可以在两种不同的事件即DDL或数据库上激活。DDL事件包括Create、Alter 或Drop 语句,而数据库事件包括服务器的启动或关闭,用户的登录或退出,以及服务器错误。

3 实现方法

3.1 用户登陆日志

当用户登陆或者退出数据库系统时,将触发数据库事件,用户登陆日志就通过基于数据库事件的系统触发器来实现。

首先要设计一个记录登陆日志的数据表Log_user ,用来保存用户的登陆信息。这个表的结构定义:(表1 数据表Log_user)

字段 名称 字段类型 是否主键 是否为空

Id 序列号 Number (14) Y No

UserId 用户名 Varchar2(30) N No

Time 时间 date N No

Operation 操作类型 Varchar2(50) N No

创建一个序列,自动生成相关的顺序号:

create sequence Log_sequence

minvalue 1

maxvalue 99999999999999

start with 1

increment by 1;

创建程序包,将相关的过程进行封装:

Create or replace package UserPkg is

Procedure UserLogin(p_UserID IN Varchar2) ;

Procedure UserLogout(p_UserID IN Varchar2) ;

END UserPkg ;

创建程序包包体,记录相关的信息到登陆日志的数据表中:

Create or Replace Package BodyUserPkg AS

Procedure UserLogin(p_UserID IN Varchar2) IS

Begin --将用户登陆的信息写入到登陆日志的数据表中

Insert into Log_user (id , userid , time , operation)

Values (Log_sequence.nextval , p_USerID , SYSDATE , ‘LOGIN’) ;

End UserLogin

Procedure UserLogout (p_UserID IN Varchar2)IS

Begin --将用户退出的信息写入到登陆日志的数据表中

InsertInto Log_user (id , userid , time , operation)

Values (Log_sequence.nextval , p_USerID , SYSDATE ,’LOGOUT’) ;

End UserLogout ;

End UserPkg ;

创建触发器,当用户登陆、退出数据库时触发相应的过程:

Create or Replace Trigger UserLogin --用户登陆时触发

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

After logon on database

Call UserPkg.UserLogin(SYS.Login_User);

Create or Replace Trigger UserLogout--用户退出时触发

Before Logoff on Database

Call UserPkg.UserLogout (SYS.Login_User)

由于UserLogin 和UserLogout 都是系统数据库触发器,创建上述触发器必须具有系统权限Administer Database Trigger。因此还要授予当前创建用户系统权限:

Grant Administer Database Trigger to UserAdmin ;

当不同的用户以不同的用户名登陆数据库时,就可以从表Log_user 获得每个用户进入和离开数据库系统的信息。

3.2 数据表日志

数据表日志是通过DML 触发器来实现的。DML触发器是由对数据库表进行Insert、Update、Delete 操作而激发的触发器。该类触发器可以在上述操作之前或之后激发运行,也可以按每个变更行激发一次,或每个语句激发一次进行。

考虑到在实际的医院管理信息系统中,(住院)固定项目表是很重要的。本文就以(住院)固定项目表为例,给出具体的(住院)固定项目表维护日志实现。 表2 是系统(住院)固定项目表。

表2 (住院)固定项目表(gdxm)

字段 名称 类型 是否主键 是否为空

Cwdm 床位代码 Char (8) Y No

Bqdm 病区代码 Char (8) Y No

Xmdm 项目代码 Char (8) Y No

Zxcs 默认次数 Int N No

Jlzt 记录状态 Ut_bz(用户自定义) N No

BZ 备注 Varchar2 (50) N No

表3 (住院)固定项目表的日志表(Log_gdxm)

字段 名称 类型 是否主键 是否为空

ID 顺序号 Number(14) Y No

Xmdm 项目代码 char (8) N No

UserId 用户名 Varchar2 (30) N No

Operation 操作类型 Varchar2(50) N No

Date 操作时间 date N No

首先创建一个序列,自动生成相关的顺序号:

create sequence gdxm_sequenc

minvalue 1

maxvalue 99999999999999

start with 1

increment by 1;

创建程序包,将相关的过程进行封装:

Create or Replace Package GdxmPkg is

Procedure GdxmInsert(p_UserID IN Varchar2 ,p_Xmdm IN Char(8));

Procedure GdxmUpdate(p_UserID IN Varchar2 ,p_Xmdm IN Char(8));

Procedure GdxmDelete(p_UserID IN Varchar2 ,p_Xmdm IN Char(8));

END GdxmPkg ;

创建包体的存储过程,记录相关的信息到物料编码表的日志表中:

Create or Replace Package Body GdxmPkg AS

Procedure GdxmInsert(p_UserID In Varchar2 ,p_Xmdm In Char(8)) IS

BEGIN --将插入数据时的信息写入到日志表

Insert Into Log_gdxm(id , xmbm , userid , operation , date)

Values(Gdxm_sequence.Nextval,p_Xmdm,p_UserID,′Insert′,SYSDATE) ;

END GdxmInsert;

Procedure GdxmUpdate(p_UserID IN Varchar2 ,p_Xmdm IN Char(8) ) IS

BEGIN --将更新数据时的信息写入到日志表

Insert Into Log_gdxm(id , xmbm , userid , operation , date)

Values(Gdxm_sequence.nextval,p_Xmdm,p_UserID,′Update′,SYSDATE);

END GdxmUpdate;

Procedure GdxmDelete(p_UserID IN Varchar2 ,p_Xmdm IN Char(8) ) IS

BEGIN --将删除数据时的信息写入到日志表

Insert Into Log_gdxm(id , xmbm , userid , operation , date)

Values(Gdxm_sequence.nextval , p_Xmbm , p_UserID ,′Delete′, SYSDATE) ;

END GdxmDelete;

END GdxmPkg;

创建触发器,在进行Insert、Update、Delete操作时触发相应的过程:

Create or Replace Trigger GdxmInsert--插入数据时触发

After Insert On Gdxm

For Each ROW

declare

P_Xmbm Char(8);

Begin

P_Xmbm: = :new.xmbm;

CALL GdxmPkg.GdxmInsert(SYS.Login_User, p_Xmbm);

End GdxmInsert ;

Create or Replace Trigger GdxmUpdate--更新数据时触发

After Update On Gdxm

FOR EACH ROW

declare

P_gdxm Char(8);

Begin

P_gdxm: = :old.gdxm;

CALL GdxmPkg.GdxmInsert (SYS.Login_User, p_gdxm);

End GdxmUpdate;

Create or Replace Trigger GdxmDelete--删除数据时触发

After Delete On Gdxm

FOR EACH ROW

declare

P_gdxm Char(8)

Begin

P_Xmbm: = :old.Xmbm;

CALL GdxmPkg.GdxmInsert (SYS.Login_User, p_Xmbm);

End GdxmDelete ;

当用户对(住院)固定项目表进行Insert、Update、Delete操作时,建立的后台触发器会将用户名、操作的固定编码、操作类型和具体时间记录到日志表中。在数据发生问题时,可以立刻获得对数据误操作的具体操作用户。

如果在系统中需要对内容进行详细记录,可以扩充日志表,将(住院)固定项目表的相关字段建立到日志表中。在进行Update、Delete 操作时,将(住院)固定项目表的历史信息也保存下来。

4 结语

按照这套实现方法,能够在数据库后台建立一套完整的日志系统,对用户的登陆信息进行记录,同时也可以对重要的基础数据表建立日志,保证整个系统及后台数据的安全。同时应该指出,数据库后台的资源是有限的,没有必要对所有的表建立日志,特别当数据库本身负荷很重的情况下,会导致系统性能下降。我们医院管理信息系统(HIS)开发过程中,按以上方案建立的日志安全系统运行正常,为系统数据安全提供了有效的保障。

参考文献:

[1]Ron Hardman.Oracle PL/SQL专家指南:高级PL/SQL解决方案的设计与开发[M].北京:清华大学出版社,2006.

[2]Scott Urman. Oracle8i PL/SQL 高级程序设计[M].北京:机械工业出版社,2001.

[3]William G,Page Jr. Oracle 8P8i 开发使用手册[M].北京:机械工业出版社,2000.

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文