|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 工作中,我們有時需要分析一個現有軟件的數據庫結構,簡單的說,就是想知道兩點 1 、各種數據保存在哪個表 2 、在什么情況下,表中的數據會發生更新 下面我把自己的方法寫出來,如果您有更好的方法,請與我討論。 1、為數據庫中的每一個業務表建立對應的更新表 當相應業務表的數據被更新時,觸發器會把更新的類型和記錄寫進相應的更新表 更新表的字段除了包括相應業務表的所有字段,還添加了三個字段 (1) 一個自增的ID (2) 更新類型(I 插入;D 刪除;U 更新) (3) 更新時間 2、在數據庫中建立一個總更新表 當任何一個業務表的數據被更新時,觸發器會把更新的類型和表名寫進總更新表,作用是快速找到當前發生數據更新的表 總更新表有四個字段 (1) 一個自增的ID (2) 更新類型(I 插入;D 刪除;U 更新) (3) 更新的表名 (4) 更新時間 3、為每一個業務表建立三個觸發器,分別對應插入、刪除、修改三種操作 當業務表發生更新時,會把更新前的記錄、更新后的記錄、刪除的記錄、插入的記錄寫入相應更新表 為此我專門寫了兩個存儲過程,適用于SQL Server 2000,如果您的數據庫不是SQL Server 2000,也可供您參考 為了新建立的表和觸發器和數據庫中原有的表和觸發器同名,采用了加后綴方法,比如 表名為 Users的表,相應的更新表為Users+后綴,當后綴為_1234567時,更新表的表名為Users_1234567 下面是存儲過程P_Analysis和P_ClearUp的腳本 /*========================================================================= 存儲過程 P_Analysis 作用 為分析建立一個總的更新表 UPDATE+后綴+后綴 為每個表建立一個更新表 原表名+后綴 為每個表建立三個觸發器 TR_表名_+觸發器類型(I:插入 D:刪除 U:更新)+后綴 輸入參數 @postfix,以免分析用表和業務表名稱重復,分析用觸發器和原由觸發器重復 使用舉例 EXEC P_Analysis ’_1234567’ ============================================================================*/ CREATE PROCEDURE P_Analysis @postfix char(8) AS --測試是否會和數據庫原有的對象名(字段名)重復 if exists(SELECT * from sysobjects where right(name,8)=@postfix) OR exists(SELECT * from syscolumns where right(name,8)=@postfix) print ’對象名重復,請使用不同的后綴民名’ else begin --為每個表建立更新記錄表 declare @TableName nvarchar(128) declare @columns varchar(8000) declare cur INSENSITIVE cursor FOR SELECT name from sysobjects where xtype=’U’ and status>0 OPEN cur FETCH NEXT FROM cur INTO @TableName while(@@fetch_status=0) BEGIN set @columns=’’ --建立更新表 EXEC(’SELECT * into ’+@TableName+@postfix+’ FROM ’+@TableName+’ WHERE 1=0’) --為更新表增加三個字段 EXEC(’alter table ’+@TableName+@postfix + ’ add ID’+@postfix+’ INT IDENTITY(1,1),OprType’+@postfix+’ char(2),OprTime’+@postfix+’ datetime default getdate()’) --為每個業務表建立三個觸發器 SELECT @columns=@columns+’,’+name from syscolumns where ID=object_id(@TableName) --插入觸發器 EXEC(’CREATE TRIGGER TR_’+@TableName+’_I’+@postfix+’ ON ’+@TableName+’ FOR INSERT AS’+ ’ INSERT UPDATE’+@postfix+@postfix+’(TableName,OprType)’+ ’ VALUES(’’’+@TableName+’’’,’’I’’)’+ ’ INSERT ’+@TableName+@postfix+’(OprType’+@postfix+@columns+’)’+ ’ SELECT ’’I’’’+@columns+’ FROM INSERTED’) --刪除觸發器 EXEC(’CREATE TRIGGER TR_’+@TableName+’_D’+@postfix+’ ON ’+@TableName+’ FOR DELETE AS’+ ’ INSERT UPDATE’+@postfix+@postfix+’(TableName,OprType)’+ ’ VALUES(’’’+@TableName+’’’,’’D’’)’+ ’ INSERT ’+@TableName+@postfix+’(OprType’+@postfix+@columns+’)’+ ’ SELECT ’’D’’’+@columns+’ FROM DELETED’) [page_break] --更新觸發器 EXEC(’CREATE TRIGGER TR_’+@TableName+’_U’+@postfix+’ ON ’+@TableName+’ FOR UPDATE AS’+ ’ INSERT UPDATE’+@postfix+@postfix+’(TableName,OprType)’+ ’ VALUES(’’’+@TableName+’’’,’’U’’)’+ ’ INSERT ’+@TableName+@postfix+’(OprType’+@postfix+@columns+’)’+ ’ SELECT ’’BU’’’+@columns+’ FROM DELETED’+ ’ INSERT ’+@TableName+@postfix+’(OprType’+@postfix+@columns+’)’+ ’ SELECT ’’AU’’’+@columns+’ FROM INSERTED’) fetch next from cur into @TableName END CLOSE cur DEALLOCATE cur --建立總記錄更新表 EXEC(’CREATE TABLE UPDATE’+@postfix+@postfix+’(ID numeric(18,0) IDENTITY(1,1),TableName varchar(256),OprType char(1),OprTime datetime default GETDATE())’) END GO /*================================================================== 存儲過程 P_ClearUp 作用:清除新建的表\觸發器 輸入參數: @postfix 默認值 _1234567 使用例子: 使用舉例 EXEC P_ClearUp ’_1234567’ ====================================================================*/ CREATE PROCEDURE P_ClearUp @postfix char(8)=’_1234567’ AS --刪除總更新表 EXEC(’if exists (select * from sysobjects where name =’’UPDATE’+@postfix+@postfix+’’’ AND type=’’U’’)’+ ’DROP TABLE UPDATE’+@postfix+@postfix) declare @TableName nvarchar(128) declare cur cursor FOR SELECT name from sysobjects where xtype=’U’ and status>0 OPEN cur FETCH NEXT FROM cur INTO @TableName while(@@fetch_status=0) BEGIN --刪除更新表 EXEC(’if exists (select * from sysobjects where name =’’’+@TableName+@postfix+’’’ AND type=’’U’’)’+ ’DROP TABLE ’+@TableName+@postfix) --刪除插入觸發器 EXEC(’if exists (select * from sysobjects where name =’’TR_’+@TableName+’_I’+@postfix+’’’ AND type=’’TR’’)’+ ’DROP TRIGGER TR_’+@TableName+’_I’+@postfix) --刪除刪除觸發器 EXEC(’if exists (select * from sysobjects where name =’’TR_’+@TableName+’_D’+@postfix+’’’ AND type=’’TR’’)’+ ’DROP TRIGGER TR_’+@TableName+’_D’+@postfix) --刪除更新觸發器 EXEC(’if exists (select * from sysobjects where name =’’TR_’+@TableName+’_U’+@postfix+’’’ AND type=’’TR’’)’+ ’DROP TRIGGER TR_’+@TableName+’_U’+@postfix) fetch next from cur into @TableName END CLOSE cur DEALLOCATE cur GO 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!