Как экспортировать триггеры из базы данных? - PullRequest
2 голосов
/ 25 сентября 2011

Я хотел бы сгенерировать скрипт / извлечь все триггеры, которые у меня есть в базе данных, чтобы я мог использовать их в другом. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2016

Вы можете найти триггерные объекты либо в 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()
0 голосов
/ 25 сентября 2011

Вы можете получить список триггеров из sys.all_objects (sysobjects в 2000), а затем код из процедуры sp_helptext.

Пример: http://databases.aspfaq.com/schema-tutorials/schema-how-do-i-show-all-the-triggers-in-a-database.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...