数据表定时清理数据和日志设计原理

数据库数据和日志设置定时清理原理(适用于数据仓库,累积历史性数据库表)

1.新建一个记录需要清理数据的表

select * from mid.[dbo].t_clear_data_table
--插入数据脚本
INSERT INTO mid.[dbo].[t_clear_data_table]
           ([dbName]	--数据库名称
           ,[schName]	--表架构
           ,[tbName]	--表名称
           ,[syn_column]	--判断清理数据时间字段
           ,[keepdays]	--数据保留天数
           ,[isEnable]	--这条记录是否可用
           ,[date_insert])	--数据插入时间
     VALUES
           ('ODS'
           ,'dbo'
           ,'t_etl_log'
           ,'start_time'
           ,60
           ,1
           ,getdate())

建表语句

CREATE TABLE [dbo].[t_clear_data_table](
	[id] [int] IDENTITY(1,1) NOT NULL,--自增id
	[dbName] [nvarchar](100) NULL,    --数据库名称
	[schName] [nvarchar](10) NULL,    --表架构
	[tbName] [nvarchar](100) NULL,    --表名称
	[syn_column] [nvarchar](50) NULL, --判断清理数据字段
	[keepdays] [int] NULL,            --数据保留天数
	[isEnable] [int] NULL,            --这条记录是否可用
	[date_insert] [datetime] NULL     --数据插入时间
)

 

2.设计一个SQL脚本

定时读取以上表内容,循环执行清理数据SQL脚本

declare @dbName nvarchar(100)='MID'
declare @schName nvarchar(100)='dbo'
declare @tableName nvarchar(100)  
declare @syn_column nvarchar(100) 
declare @keepdays int = 31    

declare @num int =0   --接收查询到的表数据
declare @loop int = 1 --初始值
--1.读取可清理列表数据,id排序
select ROW_NUMBER() OVER ( ORDER BY id ) AS id,
dbname,schname,tbname,syn_column,keepdays
into #list 
from t_clear_data_table with(nolock) where isenable=1
--2.判断,进行循环
set @num=@@rowcount

while @loop<=@num
begin
    select @dbname=dbname ,@schname=schname,@tableName=tbname,@syn_column=syn_column,@keepdays=keepdays 
    from #list 
    where id=@loop
    exec [dbo].[sp_clear_data] @dbname=@dbname,@schname=@schname,@tableName=@tableName
    ,@syn_column=@syn_column,@keepdays=@keepdays
    
    SET @loop = @loop+1
    SELECT @Message = @Message + cast(@loop as nvarchar(4))+' ok'
end

3.清理数据脚本

declare @time datetime 
declare @rowcount int 
declare @sql nvarchar(1000)
declare @ParmDefinition nvarchar(500)
declare @message nvarchar(1000)=''

set @time = dateadd(d,-@keepdays,getdate()) 
set @sql = 'delete from '+ @dbName +'.'+ @schName +'.'+ @tableName +' where cast('+@syn_column+' as datetime) <'''+convert(nvarchar(20),@time,120)+''''
set @sql = @sql +' select @num1=@@rowcount' 
set @ParmDefinition=N'@num1 as int output'
exec sp_executesql @sql,@ParmDefinition,@num1=@rowcount output
set @Message = @Message+' table:'+@tableName+'; time:'+convert(nvarchar(20),@time,120)+'; delcount:'+cast(@rowcount as nvarchar(10))+';'

 

你可能感兴趣的:(数据库和数据仓库,sqlserver)