Сохраненный Proc: резервное копирование таблиц сервера Sql - PullRequest
0 голосов
/ 29 января 2019

Мне нужно зациклить список таблиц из INFORMATION_SCHEMA.TABLES, и для каждого вывода table_name мне нужно создать отдельную новую таблицу с данными.

Ex : SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where table_Name in 
('EMP','DEPT','SAL')

Моя процедура должна удалить старые имена таблиц, если они существуют, исоздайте три новые таблицы с добавлением systemdate из приведенных выше результатов

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> ;

Не могли бы вы помочь

1 Ответ

0 голосов
/ 29 января 2019

Пример логики.

Некоторые настройки все еще можно выполнить, например, обработку ошибок, улучшение регистрации или дополнительный параметр для передачи - список таблиц.Но может стать отправной точкой для дальнейших шагов

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
...