在MS SQLSERVER数据库中,游标能从包括多条数据记录的结果集中每次提取一条记录,也能使应用程序对查询语select返回的行结果集中每一行进行批量操作。合理运用数据库内置系统表、存储过程及游标对被审计单位数据库结构进行批量汉化,能快速提高审计人员对原始数据库的理解,从而提高审计分析速度。本文以某一业务数据库为例,介绍利用游标对表进行批量汉化的方法。 步骤一:分析被审计单位有效用户表。审计人员取得被审计单位原始数据库后,利用系统表sysobjects、sysindexes、syscolumns及行数字段rowcnt取得有效用户表原始表名及列名,查询语句如下: USE PLHH select o.name as原始表名,c.name as原始列名from sysobjects o join sysindexes i on o.id=i.id and xtype='u' join syscolumnsc on c.id=o.id and i.rowcnt>0 order by 1 查询结果:
原数据库部分表结构如下:
步骤二:获取被审计单位数据库对应数据字典表。采集被审计单位数据库时,原数据库中如果没有数据字典表,审计人员应主动与被审计单位沟通取得数据字典表。 本例子数据字典表如下:select*from FEILDMANGER order by 1
步骤三:运用双层游标及系统内置存储过程,对照数据字典表对原始表结构进行批量汉化。在双层游标中调用sp_rename存储过程批量汉化表名及列名,游标具体如下。 declare cl cursor for 定义存放原始表名的游标: select o.name as old_tabname from sysobjects o join sysindexesi on o.id=i.id and xtype='u' and i.rowcnt>0 open c1 declare @old_tabname varchar(100) fetch cl into @old_tabname while @@FETCH_STATUS=0 begin if @old tabname in(select distinct TABEL NAME from FEILDMANGER) begin declare @new tabname varchar(100)select distinct @new_tabname=tabs from FEILDMANGER where tabel_name=@old_tabname 批量汉化表名: exec sp_rename@old_tabname,@new tabname declare c2 cursor for 定义存储原始列名的游标: select c.name as old_colname from sysobjects o join syscolumnsc on c.id=o.id and o.name=@new_tabname open c2 declare @old_colname varchar(100) fetch c2 into @old_colname while @@FETCH_STATUS=0 begin if @ old colname in(select field_namefrom FEILDMANGER where tabs=@new_tabname) begin declare@new_colname varchar(100), @replace_colname varchar(100) select@new_colname=FIELDMS from FEILDMANGER where TABS=@new_tabname and FIELD_NAME=@old_colname set@replace_colname=@new tabname+'.'+@old_colname 批量汉化列名: exec sp_rename@replace_colname,@new colname,‘COLUMN’ fetch c2 into@old colname