Удалить файл резервной копии в transact-sql во время копирования / восстановления базы данных - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть хранимая процедура копирования для базы данных. Во время копирования я делаю резервную копию базы данных с чем-то вроде:

exec('backup database [' + @source + '] ' + 
      'to disk = N''' + @backupdir + '\copybackup'' ' +
      'with noformat, noinit, name=N''copybackup-full'', ' + 
      'SKIP, NOREWIND, NOUNLOAD,  STATS = 10;');

А затем создайте и очистите базу данных, и восстановите ее:

exec('create database [' + @dest + '];');

exec('restore database [' + @dest + '] ' + 
      'from disk = N''' + @backupdir + '\copybackup'' ' + 
      'with file = 1, ' +
      'move N''' + @source + ''' to N''' + @dbdir + '\' + @dest + 
                 '.mdf'', ' +
      'move N''' + @source + '_log'' to N''' + @dbdir + '\' + @dest +
                 '_log.ldf'', ' +
      'NOUNLOAD,  REPLACE,  STATS = 10;');

Так что все хорошо. За исключением того, что теперь у меня остался файл в @backupdir \ copybackup, который мне действительно не нужен. Как мне от этого избавиться?

Так как это хранимая процедура, я на самом деле не хочу, чтобы ей пришлось оборачивать все это в пакетный файл или какую-то другую хоккейную вещь на самом сервере. Я хотел бы позаботиться об этом из T-SQL прямо здесь, когда я создаю беспорядок в первую очередь. Я просмотрел MS Docs, но не радости. (SQL Server 2005, пожалуйста)

Идеи

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Я пытался использовать следующее:

exec sp_addumpdevice 'disk', 'temp backup device', 'temp_backup_device.bak'

BACKUP DATABASE [XXX] TO  [temp backup device] WITH NOFORMAT, NOINIT,  NAME = N'backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

RESTORE DATABASE [bububu] FROM  [abcosting temporary backup] WITH  FILE = 1,  KEEP_REPLICATION,  NOUNLOAD,  REPLACE,  STATS = 10

exec sp_dropdevice 'temp backup device', 'delfile'

Но из-за некоторой ошибки (вероятно) sp_dropdevice даже с опцией 'delfile' не удаляет основной файл, и об ошибке не сообщается. Но это может работать в вашей конфигурации.

0 голосов
/ 12 февраля 2009

Вы не сможете использовать T-SQL прямо для этого. Если бы T-SQL мог удалить файлы в файловой системе, это было бы очень плохо.

У вас есть два варианта, если вы хотите сохранить это в SQL Server. Скорее всего, библиотека сценариев Microsoft установлена. Вы можете использовать хранимые процедуры sp_OA * для создания экземпляра Scripting.FileSystemObject, а затем удалить файл.

Однако это плохая идея, поскольку в этом случае SQL Server не может реально защитить себя от вредоносного кода и не может диктовать управление памятью в процессе сервера.

Предпочтительным решением будет создание хранимой процедуры CLR, которая будет брать путь к файлу, который вы хотите удалить, и затем использовать классы в пространстве имен System.IO для удаления файла (используя классы File или FileInfo) .

Таким образом, SQL Server может изолировать выполнение хранимой процедуры CLR, а также контролировать управление памятью CLR.

...