在 进行计算机审计的过程中对于从被审计单位全库拷贝或导出的数据我们可以通过DTS工具导入SQL SERVER 2000中进行分析,但是面对几百张甚至上千张数据表如何知道哪些表有用哪些表无用呢?其中要做的一个例行的检查就是检查数据表中是否包含数据以及包含多 少数据。以下是我收集到的一些相关脚本,运用这些脚本可以让审计人员迅速地了解数据库情况,缩小分析范围。为了让普通审计人员理解脚本的含义,我为脚本作 了注释和点评。
方法一:
SELECT o.name AS " Table Name", i.rowcnt AS "Row Count " FROM sysobjects o, sysindexes i --检索系统对象表和系统索引表 WHERE i.id = o.id AND i.indid IN ( 0 , 1 ) AND o.xtype = 'u' --系统对象表的xtype为'u'值,表示对应的表为用户表而不包括系统表。这里表示只统计用户表。 AND o.name <> 'sysdiagrams' ORDER BY i.rowcnt DESC --按行降序排序 COMPUTE SUM (i.rowcnt), count (o.name); --汇总行数,表数 GO点评:该方法关联了系统对象表(sysobjects)和系统索引表(sysindexes),利用系统对象表选择所有用户表进行操作,把系统索引表中系统自动为每张表生成的行计数(rowcnt)作 为查询结果,方法简单实用,突出了对数据库系统表的应用。直接把行计数值作为结果在某种情况下会存在误差(关于这方面的讨论在网上或联机丛书中都很容易找 到),可以用DBCC UPDATEUSAGE语句消除该误差。不过对于审计应用来说,从简单出发,我们完全可以忽略这点误差。
方法二:源自: ()
--创建一张表格TableSpace用于存储查询得到的用户表情况 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TableSpace]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[TableSpace] go create table TableSpace ( TableName varchar(20), RowsCount char(11), Reserved varchar(18), Data varchar(18), Index_size varchar(18), Unused varchar(18) ) go declare @sql varchar(500) declare @TableName varchar(20) --定义一个游标用于检索所有的用户表 declare Cursor1 Cursor for select name from sysobjects where xtype='U' open Cursor1 fetch next from Cursor1 into @TableName while @@fetch_status = 0 begin set @sql = 'insert into TableSpace ' set @sql = @sql + ' exec sp_spaceused '''+ @TableName + ''' ' --利用系统存储过程sp_spaceused 得到用户表的详细情况 exec (@sql) fetch next from Cursor1 into @TableName end close Cursor1 deallocate Cursor1 go --显示结果 select * from TableSpace --order by TableName --order by TableName ASC --按表名称,用于统计表 --order by RowsCount DESC --按行数量,用于查看表行数 --order by Reserved DESC, Data DESC --按占用空间 --order by Index_size DESC, Reserved DESC --按索引空间查看 go--查看库的使用状况,可以随时执行的。 --exec sp_spaceused --go点 评:该方法主要运用了系统存储过程 sp_spaceused 和游标。sp_spaceused 中运用的原理实际上就是方法一,只不过sp_spaceused 只显示一张指定表的情况,因此存在的误差和解决方法也和方法一相同。使用游标主要是为了配合sp_spaceused 检索所有用户表的情况。运用方法二可以得到表格的更多的信息,也是不错的方法。
方法三:
exec sp_msforeachtable "exec sp_spaceused '?'"点 评:该方法只有一行语句,综合运用了sp_msforeachtable 和sp_spaceused 两个系统存储过程,确实简洁。不过sp_msforeachtable 是SQL SERVER 2000中没有正式公开的存储过程,所谓没有正式公开是说,这个存储过程是微软公司在SQL SERVER 2000中自己使用的内部存储过程,因此该存储过程在微软公司今后的产品中是否还保留或者使用方法是否发生变化微软公司都不会通知用户,在联机丛书中也查 不到该存储过程。因此我们在使用方法三时要注意SQL SERVER的版本,先做一下试验,在某些版本中也许并不能使用这个存储过程。当然,本方法也存在方法一、二中提到的误差问题。
方法四:
exec sp_msforeachtable 'select N''?'', count(*) from ?'点评:基于方法三自然可以想到本方法,本方法避免了使用sp_spaceused 存储过程,自然避免了上述三种方法中误差,不过由于不是直接从系统表中取值,所以计算时间要长一些。