如何从数据库导出触发器?

时间:2011-09-25 09:24:20

标签: sql-server sql-server-2005

我想生成一个脚本/提取我在数据库中的所有触发器,以便我可以在另一个中使用它们。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可以从sys.all_objects(2000年sysobjects)获取触发器列表,然后从sp_helptext过程获取代码。

实施例: http://databases.aspfaq.com/schema-tutorials/schema-how-do-i-show-all-the-triggers-in-a-database.html

答案 1 :(得分:0)

您可以使用sys.objects = 'tr'xtype视图中找到触发器对象,或者从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()