SQL скрипт для создания подкаталогов, если они не существуют

#sql #tsql

#sql #tsql

Вопрос:

Ниже у меня есть тестовый скрипт для резервного копирования баз данных, который не исключен. Сначала мне нужно проверить, существуют ли эти каталоги по этому пути, а затем создать их, если они не существуют. Тогда путь резервного копирования должен был бы создавать резервные копии каждого файла в соответствующий каталог. Я немного запутался в том, как это сделать, и в соответствии с нашими требованиями среды я не могу использовать план обслуживания SSMS для этой работы. Приветствуются любые советы.

Спасибо

     DECLARE @name VARCHAR(50) -- database name  
DECLARE @path VARCHAR(256) -- path for backup files  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @Datapath varchar(500)
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT)



-- specify database backup directory
SET @path = '\nas01Adminbbeldentest' 
SET @Datapath = '\nas01Adminbbeldentest'   @name

-- specify filename format
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 

INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @Path

IF NOT EXISTS (SELECT * FROM @DirTree WHERE subdirectory = @Name)
EXEC master.dbo.xp_create_subdir @DataPath

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master',
                    'model',
                    'msdb',
                    'tempdb',
                    'PracticaSd-Dallasmetro')  -- exclude these databases



OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   


WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @fileName = @path   @name   '_'   @fileDate   '.BAK'  
       BACKUP DATABASE @name TO DISK = @fileName WITH COMPRESSION


       FETCH NEXT FROM db_cursor INTO @name   
END   



CLOSE db_cursor   
DEALLOCATE db_cursor

RESTORE VERIFYONLY FROM DISK = @FileName 
  

Комментарии:

1. Предупреждение: Предстоящие недокументированные процедуры: Скрипт SQL Server для создания каталогов Windows

2. Я отредактировал скрипт, но я все еще не могу создать каталог

Ответ №1:

Это часть ответа

Создание каталога, который уже существует, не приводит к ошибкам или удалению файлов, поэтому продолжайте создавать его в каждом цикле независимо. Вы не потеряете никаких резервных копий, все довольны.

 declare 
     @dirPath varchar(1024) 
    ,@msg varchar(1024) 
    ,@bkUp varchar(1024) 
    ,@fileDate VARCHAR(20) = CONVERT(VARCHAR(20),GETDATE(),112) 
    ,@name VARCHAR(128) -- database name  128 is max for sql objects

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master',
                    'model',
                    'msdb',
                    'tempdb',
                    'PracticaSd-Dallasmetro')  -- exclude these databases

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   

WHILE @@FETCH_STATUS = 0   
BEGIN   
        set @dirPath = '\nas01Adminbbeldentest'   @name
        --set @dirPath = 'D:SQL ServerMSSQLBackup'   @name --my home path
        begin try
            exec xp_create_subdir @dirPath;
            set @msg = 'Created directory: '   @dirPath
            raiserror(@msg,0,0);
            set @bkUp = 'backup database '   quotename(@name)   ' to disk = '''   @dirPath   ''   @name   '_'   @fileDate   '.bak'' with compression';
            exec(@bkUp);
            set @bkUp = 'RESTORE VERIFYONLY FROM DISK = '''   @dirPath   ''   @name   '_'   @fileDate   '.bak''';
            exec(@bkUp);
        end try
        begin catch
            set @msg = 'something went wrong!!! with: '   @name   '    '   error_message()
            raiserror(@msg,0,0);
        end catch
       FETCH NEXT FROM db_cursor INTO @name   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

  

Это скорее комментарий с некоторым скриптом.

Также имейте в виду, что пользователь, пытающийся получить доступ / создать файлы или папки, является учетной записью службы.

для проверки вы можете

 sp_configure 'advanced',1;
reconfigure;
GO
sp_configure 'xp_cmdshell', 1;
reconfigure;
GO
xp_cmdshell 'echo %USERDOMAIN%%USERNAME%';
  

и, как и в предыдущем первом комментарии, существует множество недокументированных хранимых процедур для операций с файловой системой.

  • xp_delete_file
  • xp_dirtree
  • xp_fileexist
  • xp_fixeddrives
  • xp_subdirs
  • xp_create_subdir

Комментарии:

1. Расположение — это модуль NAS, который позволяет гостям полностью контролировать эту папку. Следующая команда создаст каталог: ВЫПОЛНИТЕ master.dbo.xp_create_subdir ‘\nas01adminbbeldentesttest1’. Я просто не знаю, как заставить его создавать по одному для каждой базы данных, которую я копирую.

2. @bbelden В чем, по-видимому, проблема? Вы уже выполняете итерацию по каждой базе данных, которую хотите создать для резервного копирования. Запустите master.sys.xp_dirtree SP для каждого из них.

3. Прошу прощения. Сценарии TSQL не моя сильная сторона. Я просто не уверен, как создать эти каталоги для каждой базы данных на устройстве NAS.

4. добавлен рабочий скрипт, попробуйте, он должен соответствовать вашим заявленным целям.

5. Спасибо, это работает для создания каталога, указанного вами. Однако сейчас я сталкиваюсь с одной ошибкой. Ниже приведена следующая ошибка: Созданный каталог: \nas01AdminbbeldentestATL-OctopusDeploy что-то пошло не так!!! с помощью: ATL-OctopusDeploy Неверный синтаксис рядом с ‘-‘. Каталог будет создан, но по какой-то причине ему, похоже, не нравится дефис между двумя словами.