Есть ли функция для сжатия файла "bak" в сценарии SQL? - PullRequest
0 голосов
/ 04 июля 2019

В SQL Server я хочу удалить личную информацию и сделать ее резервную копию

  1. Резервная копия оригинальной БД
  2. Восстановить как другое имя БД
  3. Очистить личную информацию в другой базе данных
  4. Резервное копирование другой БД
  5. Удалить остальные файлы
  6. Zip Backup DB

Я закончил 1 ~ 5. но не смог найти способ сделать 6.

Я хочу сжать файл bak, чтобы сжать здесь. Например, приведенный ниже код может быть использован в скрипте Powershell. Есть ли способ использовать эту функцию .Net в сценарии SQL?

[System.IO.Compression.ZipFile]::CreateFromDirectory($CurrentPath, $DeployHistoryFilePath)

Ниже приведен мой полный сценарий.

DECLARE @DBName NVARCHAR(MAX) = N'TestDB'
DECLARE @BackupPath NVARCHAR(MAX) = N'D:\Database\Backup'

EXEC ('master.dbo.xp_create_subdir N'''+ @BackupPath +'''')

DECLARE @BackupName NVARCHAR(MAX) = N'OnCube_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(MAX), GETDATE(), 120), N'-', N''), N':', N''), N' ', N'_')
DECLARE @DiskFile NVARCHAR(MAX) = @BackupPath + N'\' + @BackupName + N'.bak'

BACKUP DATABASE @DBName TO DISK = @DiskFile

DECLARE @SQL NVARCHAR(MAX) = 'SELECT TOP (1) @OriginalMdf = name FROM ' + @DBName + '.sys.database_files WHERE file_id = 1'
DECLARE @OriginalMdf NVARCHAR(MAX)
EXEC sp_executesql @SQL, N'@OriginalMdf NVARCHAR(MAX) OUT', @OriginalMdf out

SET @SQL = 'SELECT TOP (1) @OriginalLdf = name FROM ' + @DBName + '.sys.database_files WHERE file_id = 2'
DECLARE @OriginalLdf NVARCHAR(MAX)
EXEC sp_executesql @SQL, N'@OriginalLdf NVARCHAR(MAX) OUT', @OriginalLdf out

DECLARE @PartialMdf NVARCHAR(MAX) = @BackupPath + N'\' + @BackupName + N'.mdf'
DECLARE @PartialLdf NVARCHAR(MAX) = @BackupPath + N'\' + @BackupName + N'_0.ldf'

RESTORE FILELISTONLY FROM DISK = @DiskFile

RESTORE DATABASE @BackupName
    FROM DISK = @DiskFile
    WITH MOVE @OriginalMdf TO @PartialMdf,
    MOVE @OriginalLdf TO @PartialLdf

EXEC (N'
USE [' + @BackupName + ']
UPDATE Person
SET
    PatientNo       = NULL
,   PatientName     = N''Cleared'' + CONVERT(NVARCHAR(MAX), RawID)
,   RoomNo          = NULL
,   BedNo           = NULL
,   Birthday        = NULL
,   Sex             = NULL
,   Address         = NULL
,   AdmitDate       = NULL
,   AdmitNo         = NULL
,   Description     = NULL
,   DischargedDate  = NULL
')

DECLARE @ClearedDiskFile NVARCHAR(MAX) = @BackupPath + N'\' + @BackupName + N'_PatientInfoCleared.bak'

BACKUP DATABASE @BackupName TO DISK = @ClearedDiskFile

EXEC('DROP DATABASE [' + @BackupName + ']')
EXEC ('xp_cmdshell ''del "' + @DiskFile + '"''')

-- I Want to compress bak file to zip here
-- For instance, below code can be used in Powershell script. Is there a way to use this .Net function in SQL script?
--  [System.IO.Compression.ZipFile]::CreateFromDirectory($CurrentPath, $DeployHistoryFilePath)

PRINT N'Success to make ' + @ClearedDiskFile + '. Patient informations are all cleared'
...