存储过程:Sql 服务器表备份
Stored Proc : Sql server tables backup
我需要循环 INFORMATION_SCHEMA.TABLES 中的 table 列表
对于每个 table_name 输出,我需要用数据创建一个单独的新 table。
Ex : SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where table_Name in
('EMP','DEPT','SAL')
我的程序应该删除旧的 table 名称(如果它们存在)并创建三个新的 tables,并根据上述结果添加系统日期
drop BKP_<Table_Name>_* //*Drop Old tables which are one week older with
systemdate <=(sysdate-7))
select * into BKP_<Table_Name>_<SYSTEMDATE> FROM <Table_Name> ;
你能帮忙吗
逻辑示例。
仍然可以进行一些调整,例如错误处理、更好的日志记录或要传递的额外参数 - table 列表。但可以作为进一步步骤的起点
CREATE PROCEDURE usp_BackupTable
@RetentionDays int = 7
AS
DECLARE @_tbl sysname, @_schema sysname, @_sql_Backup VARCHAR(400), @_sql_Drop VARCHAR(400);
-- first part: create backups of listed tables
DECLARE ct CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN ('ETLSettings') AND TABLE_TYPE = 'BASE TABLE'
OPEN ct
FETCH NEXT FROM ct INTO @_schema, @_tbl
WHILE @@FETCH_STATUS = 0
BEGIN
SET @_sql_Backup = 'SELECT * INTO ['+@_schema+'].BKP_'+@_tbl+'_'+CONVERT(varchar(20), GETDATE(), 112)+' FROM ['+@_schema+'].['+@_tbl+'] ;'
EXEC (@_sql_Backup)
PRINT 'Backup of table ' + @_tbl + ' has been created'
FETCH NEXT FROM ct INTO @_schema, @_tbl
END
CLOSE ct
DEALLOCATE ct
-- second part: cleanup of backups
DECLARE ct CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'BKP%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' AND TABLE_TYPE = 'BASE TABLE'
AND TRY_CAST(RIGHT(TABLE_NAME, 8) AS DATETIME ) < CAST(GETDATE()-@RetentionDays AS DATE)
OPEN ct
FETCH NEXT FROM ct INTO @_schema, @_tbl
WHILE @@FETCH_STATUS = 0
BEGIN
SET @_sql_Drop = 'DROP TABLE ['+@_schema+'].['+@_tbl+'] ;'
EXEC (@_sql_Drop)
PRINT 'Table ' + @_tbl + ' has been deleted'
FETCH NEXT FROM ct INTO @_schema, @_tbl
END
CLOSE ct
DEALLOCATE ct
我需要循环 INFORMATION_SCHEMA.TABLES 中的 table 列表 对于每个 table_name 输出,我需要用数据创建一个单独的新 table。
Ex : SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where table_Name in
('EMP','DEPT','SAL')
我的程序应该删除旧的 table 名称(如果它们存在)并创建三个新的 tables,并根据上述结果添加系统日期
drop BKP_<Table_Name>_* //*Drop Old tables which are one week older with
systemdate <=(sysdate-7))
select * into BKP_<Table_Name>_<SYSTEMDATE> FROM <Table_Name> ;
你能帮忙吗
逻辑示例。
仍然可以进行一些调整,例如错误处理、更好的日志记录或要传递的额外参数 - table 列表。但可以作为进一步步骤的起点
CREATE PROCEDURE usp_BackupTable
@RetentionDays int = 7
AS
DECLARE @_tbl sysname, @_schema sysname, @_sql_Backup VARCHAR(400), @_sql_Drop VARCHAR(400);
-- first part: create backups of listed tables
DECLARE ct CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN ('ETLSettings') AND TABLE_TYPE = 'BASE TABLE'
OPEN ct
FETCH NEXT FROM ct INTO @_schema, @_tbl
WHILE @@FETCH_STATUS = 0
BEGIN
SET @_sql_Backup = 'SELECT * INTO ['+@_schema+'].BKP_'+@_tbl+'_'+CONVERT(varchar(20), GETDATE(), 112)+' FROM ['+@_schema+'].['+@_tbl+'] ;'
EXEC (@_sql_Backup)
PRINT 'Backup of table ' + @_tbl + ' has been created'
FETCH NEXT FROM ct INTO @_schema, @_tbl
END
CLOSE ct
DEALLOCATE ct
-- second part: cleanup of backups
DECLARE ct CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'BKP%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' AND TABLE_TYPE = 'BASE TABLE'
AND TRY_CAST(RIGHT(TABLE_NAME, 8) AS DATETIME ) < CAST(GETDATE()-@RetentionDays AS DATE)
OPEN ct
FETCH NEXT FROM ct INTO @_schema, @_tbl
WHILE @@FETCH_STATUS = 0
BEGIN
SET @_sql_Drop = 'DROP TABLE ['+@_schema+'].['+@_tbl+'] ;'
EXEC (@_sql_Drop)
PRINT 'Table ' + @_tbl + ' has been deleted'
FETCH NEXT FROM ct INTO @_schema, @_tbl
END
CLOSE ct
DEALLOCATE ct