使用Powershell生成SQL创建表脚本

时间:2019-02-14 11:39:15

标签: powershell

我想使用powershell来使用创建表语句快速生成SQL脚本,该语句可以在现有数据库中重新创建所有表。唯一的事情是我想调整一些选项,例如关闭身份。

我只是不知道该怎么做!

我已经设置了一个$ server变量,并设置了一个名为$ tables的变量来获取该特定数据库中的所有表。 然后我使用一个循环: foreach($ tables中的$ table) {$ table.Script() }

这可行,但是我只是不知道如何添加脚本选项,例如NoIdentities = $ True

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

我曾经不得不做很多重复的打字工作,包括生成SQL脚本来 数据库中的每个表。因此,我开发了适用于此类工作的通用工具。我将按原样包含该工具,以及该工具的示例运行,旨在 为每个表和每个数据库用户类别生成一系列授权命令。

我的工具从CSV文件运行,而不是直接从数据库运行。我发现为许多不同的任务生成CSV文件和模板相当容易。你的旅费可能会改变。也许您可以从此工具开始,并使其适应您的需求。

这里是工具,还有一个示例运行。

<#
.SYNOPSIS
    Generates multiple expansions of a template,
    driven by data in a CSV file.
.DESCRIPTION
    This function is a table driven template tool. 

    It generates output from a template and
    a driver table.  The template file contains plain
    text and embedded variables.  The driver table 
    (in a csv file) has one column for each variable, 
    and one row for each expansion to be generated.
#>
function Expand-csv {


   [CmdletBinding()]
   Param(
      [Parameter(Mandatory=$true)]
      [string] $driver,
      [Parameter(Mandatory=$true)]
      [string] $template
   )
   Process
   {
      $xp = (Get-Content $template) -join "`r`n"

      Import-Csv $driver | % {
         $_.psobject.properties | % {Set-variable -name $_.name -value $_.value}
         $ExecutionContext.InvokeCommand.ExpandString($xp) 
         }
   }
}

# Now do a sample run of Expand-csv
# then display inputs and output

Expand-csv grants.csv grants.tmplt > grants.sql
get-content grants.tmplt
import-csv grants.csv
get-content grants.sql

这是运行以上命令的结果:

PS> C:\Users\David\Software\Powershell\test\sample.ps1


grant $privs 
   on $table 
   to $user;



privs       table       user                
-----       -----       ----                
ALL         Employees   DBA                 
READ        Employees   Analyst             
READ, WRITE Employees   Application         
ALL         Departments DBA                 
READ        Departments Analyst, Application


grant ALL 
   on Employees 
   to DBA;




grant READ 
   on Employees 
   to Analyst;




grant READ, WRITE 
   on Employees 
   to Application;




grant ALL 
   on Departments 
   to DBA;




grant READ 
   on Departments 
   to Analyst, Application;





PS> 

在现实生活中,我已经在$ profile文件中定义了该工具,因此只要在Powershell中,它就可以使用。

我不确定这是否适用于您的情况。这并不能解决您描述的确切情况,但是您可以调整该技术。

答案 1 :(得分:0)

如果您仍在寻找解决方案,我是否可以建议我在单个表中使用的这个小脚本。您应该能够对其进行更新以相当轻松地支持多个表。注意行“ $ scripter.Options.NoIdentities = $ true;”在下面。

param
(
  [string] $server,
  [string] $database,
  [string] $schema,
  [string] $table
)

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

$srv = New-Object "Microsoft.SqlServer.Management.SMO.Server" $server
$db = New-Object ("Microsoft.SqlServer.Management.SMO.Database")
$tbl = New-Object ("Microsoft.SqlServer.Management.SMO.Table")
$scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($server)
$db = $srv.Databases[$database]
$tbl = $db.tables | Where-object {$_.schema -eq $schema-and$_.name -eq $table}

$scripter.Options.ScriptSchema = $true;
$scripter.Options.ScriptData = $false;

$scripter.Options.NoCommandTerminator = $false;
$scripter.Options.NoCollation = $true;
$scripter.Options.NoIdentities = $true;

$scripter.EnumScript($tbl)

将其保存到“ table.ps1”并通过传递参数值在PowerShell中执行:

& table.ps1 -server SERVER\INSTANCE -database MyDB -schema dbo -table MyTable

让我知道它是否有效。