Как администратор SQL Server или консультант, вы часто сталкиваетесь с большим количеством скриптов для различных задач. Эти скрипты могут быть разбросаны по разным компьютерам и папкам, что затрудняет их управление и поиск в нужный момент. В этой статье мы рассмотрим простой и эффективный способ архивирования и управления скриптами SQL Server с использованием центральной базы данных-репозитория.
Решение: Создание репозитория скриптов
Один из эффективных способов – создать репозиторий скриптов с использованием базы данных SQL Server. Текстовые скрипты, такие как T-SQL, пакеты, PowerShell и VBScript, могут быть легко сохранены в обычной таблице SQL Server с столбцом varchar(max). Это позволяет легко создавать резервные копии, переносить и эффективно искать скрипты.
Вот логика решения:
- Используйте команду
get-childitemPowerShell для рекурсивного сканирования папки с интересующими вас файлами скриптов. - Прочитайте содержимое файла с помощью
get-contentи вставьте содержимое, вместе с другой собранной информацией, в предопределенную таблицу базы данных.
Давайте посмотрим на код:
if object_id('dbo.ScriptRepository', 'U') is not null
drop table dbo.ScriptRepository;
create table dbo.ScriptRepository (
id int identity primary key,
Folder varchar(300),
[FileName] varchar(300),
Script varchar(max),
LogDate DateTime default Current_Timestamp
);
Затем мы можем использовать скрипт PowerShell для архивирования файлов:
#requires -version 3.0;
$folder ='c:\DBAdmin\'; #измените на свою папку
[string[]]$include ="*.sql", "*.ps1"; # вы можете добавить другие типы файлов
#create a System.DataTable object for the file uploading
$dt = New-Object System.Data.DataTable;
$dc = New-Object System.Data.DataColumn('Folder', [System.String]);
$dt.Columns.Add($dc);
$dc = New-Object System.Data.DataColumn('FileName', [System.String]);
$dt.Columns.Add($dc);
$dc = New-Object System.Data.DataColumn('Script', [System.String]);
$dt.Columns.Add($dc);
dir -LiteralPath $folder -Include $include -File -Recurse |
foreach {
$dr = $dt.NewRow();
$dr.Folder = $_.Directory;
$dr.FileName = $_.name;
$dr.Script = (gc -path $_.FullName -raw);
$dt.Rows.Add($dr);
}
Save-DataTable -SQLInstance tp_w520 -DestinationDB mssqltips -DestinationTable 'dbo.ScriptRepository' -SourceData $dt `
-ColumnMapping @{Folder='Folder'; FileName='FileName'; Script='Script'; }
Извлечение скриптов из репозитория
Когда вам нужно извлечь конкретный скрипт из репозитория на локальный диск, вы можете сделать это, следуя этим шагам:
- Определите запрос для извлечения интересующего вас скрипта(ов).
- Определите папку назначения, в которую вы хотите сохранить скрипт(ы).
- Запустите скрипт PowerShell.
Вот пример:
Import-Module sqlps -DisableNameChecking; #это применимо только к версиям SQL Server 2012+
set-location c:
[string]$destPath = 'c:\temp\'; # измените на свою папку назначения
[string]$qry = "select filename, script from dbo.ScriptRepository where id in (1, 3)"; # измените запрос по своим потребностям
$db = get-item sqlserver:\sql\tp_w520\default\databases\mssqltips #измените tp_w520\default на свой собственный экземпляр SQL Server
$ds = $db.ExecuteWithResults($qry);
$ds.tables[0].rows | % { $_.script | out-file -FilePath "$destPath\$($_.filename)" -Force}
Резюме
Создавая репозиторий скриптов в базе данных SQL Server, вы можете легко архивировать и управлять своими скриптами SQL Server. Это решение позволяет легко создавать резервные копии, переносить и эффективно искать скрипты. Оно особенно полезно в командной среде, где все члены команды могут загружать свои скрипты в центральный репозиторий, вместо использования общих папок хранения или SharePoint.
Важно отметить, что если длина полного имени файла превышает 260 символов, возможно, возникнет ошибка. В таких случаях вам потребуется сократить имя файла или имя каталога, чтобы соответствовать ограничению на количество символов.
С помощью этого простого и эффективного решения вы можете быть уверены, что ваши скрипты организованы, легко доступны и могут быть найдены в нужный момент.