2011-12-20 2 views
1

매일 밤 서버에 모든 SQL Server 2008 정책 및 조건을 스크립트 아웃하고 파일을 내 버전 제어 시스템과 비교하고 싶습니다. UI에서 정책을 마우스 오른쪽 단추로 클릭하고 정책 내보내기를 선택하여 개별 정책을 스크립팅 할 수 있습니다. SMO 또는 PowerShell을 통해 정책 및 조건을 스크립팅 할 수 있습니까?스크립트 내보내기 정책 및 조건

이상적으로는 다른 모든 서버 및 데이터베이스 개체에 대한 스크립트를 생성하는 기존 PowerShell 스크립트에 통합하고 싶습니다. 현재이 작업을 수행하는 스크립트는 다음과 같습니다.

# Load needed assemblies 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMOExtended")| Out-Null; 

#Specify target server and databases. 
$sql_server = "SomeServerName" 
$SMOserver = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList "$sql_server" 
$databases = $SMOserver.Databases 
$BaseSavePath = "T:\SomeFilePath\" + $sql_server + "\" 

#Remove existing objects. 
Remove-Item $BaseSavePath -Recurse 

#Script server-level objects. 
$ServerSavePath = $BaseSavePath 
$ServerObjects = $SMOserver.BackupDevices 
$ServerObjects += $SMOserver.Endpoints 
$ServerObjects += $SMOserver.JobServer.Jobs 
$ServerObjects += $SMOserver.LinkedServers 
$ServerObjects += $SMOserver.Triggers 

foreach ($ScriptThis in $ServerObjects | where {!($_.IsSystemObject)}) 
{ 
    #Need to Add Some mkDirs for the different $Fldr=$ScriptThis.GetType().Name 
    $scriptr = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
    $scriptr.Options.AppendToFile = $True 
    $scriptr.Options.AllowSystemObjects = $False 
    $scriptr.Options.ClusteredIndexes = $True 
    $scriptr.Options.DriAll = $True 
    $scriptr.Options.ScriptDrops = $False 
    $scriptr.Options.IncludeHeaders = $False 
    $scriptr.Options.ToFileOnly = $True 
    $scriptr.Options.Indexes = $True 
    $scriptr.Options.Permissions = $True 
    $scriptr.Options.WithDependencies = $False 

    <#Script the Drop too#> 
    $ScriptDrop = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
    $ScriptDrop.Options.AppendToFile = $True 
    $ScriptDrop.Options.AllowSystemObjects = $False 
    $ScriptDrop.Options.ClusteredIndexes = $True 
    $ScriptDrop.Options.DriAll = $True 
    $ScriptDrop.Options.ScriptDrops = $True 
    $ScriptDrop.Options.IncludeHeaders = $False 
    $ScriptDrop.Options.ToFileOnly = $True 
    $ScriptDrop.Options.Indexes = $True 
    $ScriptDrop.Options.WithDependencies = $False 

    <#This section builds folder structures. Remove the date folder if you want to overwrite#> 
    $TypeFolder=$ScriptThis.GetType().Name 
    if ((Test-Path -Path "$ServerSavePath\$TypeFolder") -eq "true") ` 
      {"Scripting Out $TypeFolder $ScriptThis"} ` 
     else {new-item -type directory -name "$TypeFolder"-path "$ServerSavePath"} 
    $ScriptFile = $ScriptThis -replace ":", "-" -replace "\\", "-" 
    $ScriptDrop.Options.FileName = $ServerSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 
    $scriptr.Options.FileName = $ServerSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 

    #This is where each object actually gets scripted one at a time. 
    $ScriptDrop.Script($ScriptThis) 
    $scriptr.Script($ScriptThis) 
} #This ends the object scripting loop at the server level. 


#Script database-level objects. 
foreach ($db in $databases) 
{ 
    $DatabaseObjects = $db.ApplicationRoles 
    $DatabaseObjects += $db.Assemblies 
    $DatabaseObjects += $db.ExtendedStoredProcedures 
    $DatabaseObjects += $db.ExtendedProperties 
    $DatabaseObjects += $db.PartitionFunctions 
    $DatabaseObjects += $db.PartitionSchemes 
    $DatabaseObjects += $db.Roles 
    $DatabaseObjects += $db.Rules 
    $DatabaseObjects += $db.Schemas 
    $DatabaseObjects += $db.StoredProcedures 
    $DatabaseObjects += $db.Synonyms 
    $DatabaseObjects += $db.Tables 
    $DatabaseObjects += $db.Triggers 
    $DatabaseObjects += $db.UserDefinedAggregates 
    $DatabaseObjects += $db.UserDefinedDataTypes 
    $DatabaseObjects += $db.UserDefinedFunctions 
    $DatabaseObjects += $db.UserDefinedTableTypes 
    $DatabaseObjects += $db.UserDefinedTypes 
    $DatabaseObjects += $db.Users 
    $DatabaseObjects += $db.Views 

    #Build this portion of the directory structure out here. Remove the existing directory and its contents first. 
    $DatabaseSavePath = $BaseSavePath + "Databases\" + $db.Name 

    new-item -type directory -path "$DatabaseSavePath" 

    foreach ($ScriptThis in $DatabaseObjects | where {!($_.IsSystemObject)}) 
    { 
     #Need to Add Some mkDirs for the different $Fldr=$ScriptThis.GetType().Name 
     $scriptr = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
     $scriptr.Options.AppendToFile = $True 
     $scriptr.Options.AllowSystemObjects = $False 
     $scriptr.Options.ClusteredIndexes = $True 
     $scriptr.Options.DriAll = $True 
     $scriptr.Options.ScriptDrops = $False 
     $scriptr.Options.IncludeHeaders = $False 
     $scriptr.Options.ToFileOnly = $True 
     $scriptr.Options.Indexes = $True 
     $scriptr.Options.Permissions = $True 
     $scriptr.Options.WithDependencies = $False 

     <#Script the Drop too#> 
     $ScriptDrop = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
     $ScriptDrop.Options.AppendToFile = $True 
     $ScriptDrop.Options.AllowSystemObjects = $False 
     $ScriptDrop.Options.ClusteredIndexes = $True 
     $ScriptDrop.Options.DriAll = $True 
     $ScriptDrop.Options.ScriptDrops = $True 
     $ScriptDrop.Options.IncludeHeaders = $False 
     $ScriptDrop.Options.ToFileOnly = $True 
     $ScriptDrop.Options.Indexes = $True 
     $ScriptDrop.Options.WithDependencies = $False 

     <#This section builds folder structures. Remove the date folder if you want to overwrite#> 
     $TypeFolder=$ScriptThis.GetType().Name 
     if ((Test-Path -Path "$DatabaseSavePath\$TypeFolder") -eq "true") ` 
       {"Scripting Out $TypeFolder $ScriptThis"} ` 
      else {new-item -type directory -name "$TypeFolder"-path "$DatabaseSavePath"} 
     $ScriptFile = $ScriptThis -replace ":", "-" -replace "\\", "-" 
     $ScriptDrop.Options.FileName = $DatabaseSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 
     $scriptr.Options.FileName = $DatabaseSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 

     #This is where each object actually gets scripted one at a time. 
     $ScriptDrop.Script($ScriptThis) 
     $scriptr.Script($ScriptThis) 

    } #This ends the object scripting loop. 
} #This ends the database loop. 

답변

0

SMO/Powershell에서 몇 가지 항목을 선택할 수 있습니다.

1 : SQL과 SQLPS/PowerShell을로드 SQLSERVER : \ SQLPolicy \\ DEFAULT 당신이 다음을 통해 발굴 할 수

정책 \, 나는 "내보내기"를 참조 didnt는하지만 certianly 그것에서 정보를 얻을 수 있습니다 .

2 : SMO 기본적으로 SMO에는 여러 정책 개체 (사용자가 PowerShell 쪽에서 끝내는 대상) 정책, PolicyStore, PolicyCondition 등을 포함하는 Microsoft.SqlServer.Management.DMF 네임 스페이스가 있습니다. 예를 들어 여기서 찾을 수 있습니다. http://rdbmsexperts.com/Blogs/archives/295

다시 "수출"방법은 어디에도 없습니다. 그러나 당신은 쉽게 충분히 필요한 것을 뱉어 낼 수있었습니다.

+0

sqlps를 검사했지만 거기에서 개체를 스크립트 아웃 할 수있는 방법이 없다고 표시됩니다. SMO는 아마도 당신이 그것으로 정책을 만들 수 있기 때문에 아마도 해결책 일 것입니다. (당신의 링크에서 볼 수 있듯이) 나의 예제는 SMO를 사용하여 다른 모든 데이터베이스 객체를 스크립트합니다. 그러나 SMO를 통한 정책을 어떻게 스크립트화하는지 아직 보지 못했습니다. SMO를 통해 정책 및 조건을 스크립트하는 방법에 대한 예를 얻을 수 있다면 행복하게 대답으로 받아 들일 것입니다. –

+0

당신은 그것을 손으로해야 할 것입니다, 수출은 없습니다. 기본적으로 그들은 모든 객체와 각각의 문자열을 노출합니다. 그래서 기본적으로 당신은 정책을 끌어 당깁니다. 그런 다음 정책의 속성 (주로 조건)을 가져옵니다. – jrich523