2012-10-19 31 views
1

使用2.0如何使用SQL Server SMO和散列中的PowerShell設置數據庫選項?

我創建了一個hash選項,我想在一個SQL Server數據庫設置像這樣的SQL Server 2008 R2和PowerShell:

$dbopts = @{ 
    "AutoCreateStatistics"=$true; 
    "AutoUpdateStatistics"=$true; 
    "AutoShrink"=$false; 
    }; 

我想設置一個SQL這些選項服務器數據庫使用SMO。我創建了一個接受SMO數據庫對象和DatabaseOptions散列作爲輸入的函數。

function setDatabaseOptions { 
    param ($db, $opts); 

    foreach ($opt in $db.DatabaseOptions) { 
     # what to write here? 

    } 

} 

我想將散列中的選項設置爲數據庫。不確定最好的方式來做到這一點。有什麼建議麼?例如,要明確設置的選項,你會做

$db.DatabaseOptions.AutoCreateStatistics = $true

回答

1

沒有不尊重Shay在他最後的評論中試圖枚舉散列表。

function setDatabaseOptions {  
param ($db, $opts)   
    foreach ($key in $opts.Keys) { $db.DatabaseOptions.$key = $opts[$key] } 
    $db.DatabaseOptions.Alter() 
} 
1

您正確的哈希項目分配給數據庫的性能。我不使用SMO,但您可能還需要調用一種方法來應用更新。

function setDatabaseOptions { 

    param ($db, $opts) 

     $opt = $db.DatabaseOptions 

     $opt.AutoCreateStatistics = $opts['AutoCreateStatistics'] 
     $opt.AutoUpdateStatistics = $opts['AutoUpdateStatistics'] 
     $opt.AutoShrink= $opts['AutoShrink']  
} 
+0

我不希望在函數中硬編碼的選項,但從散列中讀取。即。 '$ opt。[$ myHashItem] = $ opts。['$ myHashItemValue']'我希望這足以讓人明白! –

+0

我沒跟着你,「$ opt。[$ myHashItem] = $ opts。['$ myHashItemValue']」沒有硬編碼? –

+0

'$ opt.AutoCreateStatistics'是一個硬編碼的數據庫選項。我想遍歷$ opts散列並將每個選項設置爲每個值,但不是明確聲明它。 IOW我需要一個foreach循環來遍歷每一個循環。 $ opts哈希每次調用時都會有所不同,因此我不能讓它們硬編碼。我希望這更清楚。 –

相關問題