Вы можете найти триггерные объекты либо в sys.objects
представлении с xtype
= 'tr'
, либо, начиная с SQL 2008, на sys.triggers
просмотр.
Вы можете получить определение для триггеров (или любого другого объекта), присоединившись к sys.sql_modules.definition
или вызвав OBJECT_DEFINITION(object_id)
.
Только не используйте sys.syscomments.text
, потому что он ограничен nvarchar(4000)
В любой комбинации вышеперечисленного (на самом деле это не имеет значения) вы можете сгенерировать один файл для заполнения всех ваших сценариев, завершив каждое определение с помощью «Go» следующим образом:
SELECT m.definition, 'GO'
FROM sys.triggers tr
JOIN sys.sql_modules m ON tr.object_id = m.object_id
Просто возьмите полученный результат, сохраните его в одном файле и выполните, чтобы воссоздать каждый триггер.
Создание отдельных скриптов
Проблема немного сложнее, если вы хотите сгенерировать отдельные файлы для каждого скрипта.
... в основном при автоматизации генерации файлов; предыдущее решение опирается только на представление данных и их сохранение.
Вы можете использовать bcp utility
, но я нахожу SQL довольно неуклюжим при работе с файлами. В качестве альтернативы, просто возьмите данные в powershell, а затем сгенерируйте файлы оттуда, где у вас будет намного более точно настроенный доступ и контроль. Вот скрипт, который захватит все триггеры и создаст их в папки для каждой таблицы.
# config
$server = "serverName"
$database = "dbName"
$dirPath = 'C:\triggers'
# query
$query = @"
SELECT TOP 5
t.name AS TableName,
tr.name AS TriggerName,
m.definition As TriggerScript
FROM sys.triggers tr
JOIN sys.tables t ON tr.parent_id = t.object_id
JOIN sys.sql_modules m ON tr.object_id = m.object_id
"@
# connection
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Server=$server;Database=$database;Integrated Security=True"
$sqlConnection.Open()
# command
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand($query, $sqlConnection)
$sqlCmd.CommandTimeout = 10 * 60 # 10 minutes
# execute
$reader = $sqlCmd.ExecuteReader()
while ($reader.Read())
{
# get reader values
$tableName = $reader.GetValue(0)
$triggerName = $reader.GetValue(1)
$triggerScript = $reader.GetValue(2)
$filepath = "$dirPath\$tableName\$triggerName.sql"
# ensure directory exists
[System.IO.Directory]::CreateDirectory("$dirPath\$tableName\")
# write file
New-Item -Path $filepath -Value $triggerScript -ItemType File
}
$reader.Close()
$sqlConnection.Close()