by Alexey Knyazev
7. апреля 2009 18:29
Продолжая тему "полезные скрипты", предлагаю вариант скриптования объектов Базы Данных на PowerShell.
Для доступа к серверу БД использую набор объектов SMO (http://msdn.microsoft.com/ru-ru/library/ms162169.aspx). Скриптование объектов с помощью консольного приложения я писал больше года назад (SQLDMOScripter / SQLSMOScripter).
Теперь нечто подобное, но уже в виде скрипта на PoSh. Указал не все объекты, но вы всегда сможете этот код дополнить.
#Входные пар-ы:
$ServerName=Read-Host "Укажите имя сервера БД"
$DatabaseName=Read-Host "Имя БД"
$ObjectType=Read-Host "Тип объектов для скриптования"
$OutFileName=Read-Host "Вывести результат в файл"
#Используем SMO (http://msdn.microsoft.com/ru-ru/library/ms162557.aspx)
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
$server=new-object("Microsoft.SqlServer.Management.Smo.Server") $ServerName
#Имя БД, с которой работаем
$db = $server.Databases[$DatabaseName]
#Скриптуем Таблицы
if ($ObjectType -eq “TABLES”)
{
foreach ($tbl in $db.Tables)
{
$s =$s+"–Table ["+$tbl.name+"]"+[char]13+[char]10
$sc = $tbl.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
#Скриптуем триггеры текущей таблицы
foreach ($tr in $tbl.Triggers)
{
$s =$s+"–Trigger ["+$tr.name+"]"+[char]13+[char]10
$sc = $tr.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
#Скриптуем индексы текущей таблицы
foreach ($in in $tbl.Indexes)
{
$s =$s+"–Index ["+$in.name+"]"+[char]13+[char]10
$sc = $in.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
#Скриптуем правила текущей таблицы
foreach ($ch in $tbl.Checks)
{
$s =$s+"–Check ["+$ch.name+"]"+[char]13+[char]10
$sc = $ch.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
#Скриптуем ключи текущей таблицы
foreach ($fk in $tbl.ForeignKeys)
{
$s =$s+"–ForeignKey ["+$fk.name+"]"+[char]13+[char]10
$sc = $fk.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
}
#Скриптуем синонимы
if ($ObjectType -eq "SYNONYMS")
{
foreach ($syn in $db.Synonyms)
{
$s =$s+"–Synonym ["+$syn.name+"]"+[char]13+[char]10
$sc = $syn.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем представления
if ($ObjectType -eq "VIEWS")
{
foreach ($v in $db.Views)
{
$s =$s+"–View ["+$v.name+"]"+[char]13+[char]10
$sc = $v.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
#Скриптуем триггеры текущего представления
foreach ($tr in $v.Triggers)
{
$s =$s+"–Trigger ["+$tr.name+"]"+[char]13+[char]10
$sc = $tr.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
#Скриптуем индексы текущего представления
foreach ($in in $v.Indexes)
{
$s =$s+"–Index ["+$in.name+"]"+[char]13+[char]10
$sc = $in.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
}
#Скриптуем процедуры
if ($ObjectType -eq "SP")
{
foreach ($sp in $db.StoredProcedures)
{
$s =$s+"–StoredProcedure ["+$sp.name+"]"+[char]13+[char]10
$sc = $sp.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем пользовательские функции
if ($ObjectType -eq "UDF")
{
foreach ($udf in $db.UserDefinedFunctions)
{
$s =$s+"–UserDefinedFunction ["+$udf.name+"]"+[char]13+[char]10
$sc = $udf.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем схемы
if ($ObjectType -eq "SCH")
{
foreach ($sch in $db.Schemas)
{
$s =$s+"–Schema ["+$sch.name+"]"+[char]13+[char]10
$sc = $sch.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем пользователей
if ($ObjectType -eq "US")
{
foreach ($us in $db.Users)
{
$s =$s+"–User ["+$us.name+"]"+[char]13+[char]10
$sc = $us.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем DDL-триггера
if ($ObjectType -eq "TR")
{
foreach ($tr in $db.Triggers)
{
$s =$s+"–Trigger ["+$tr.name+"]"+[char]13+[char]10
$sc = $tr.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем сборки
if ($ObjectType -eq "ASM")
{
foreach ($asm in $db.Assemblies)
{
$s =$s+"–Assemblie ["+$asm.name+"]"+[char]13+[char]10
$sc = $asm.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Скриптуем расширенные процедуры
if ($ObjectType -eq "XP")
{
foreach ($xp in $db.ExtendedStoredProcedures)
{
$s =$s+"–ExtendedStoredProcedure ["+$xp.name+"]"+[char]13+[char]10
$sc = $xp.Script()
$se = $sc.GetEnumerator()
while ($se.MoveNext())
{
$s =$s+$se.Current+[char]13+[char]10
}
}
}
#Выводим результат в файл
$s | Out-File $OutFileName
ScriptObjects.ps1 (скачать)