12 Mayıs 2013 Pazar

Windows PowerShell ile SQL Server 2012 (2. Bölüm)




    Merhaba arkadaşlar, geçen hafta Windows PowerShell ile SQL Server 2012 konusuna giriş yapmıştım. Bugün yine aynı konudan devam edeceğim. Bazı önemli veri tabanı işlemlerinden ve bu işlemlerin Windows PowerShell ile nasıl kontrol edildiğinden bahsedeceğim.


    İlk olarak temel veri tabanı işlemlerini Windows PowerShell'den nasıl yapacağımızı anlatmak istiyorum. Bu işlemler veri tabanı oluşturma, tablo ekleme, tablo silme ve veri tabanını silme gibi temel işlemlerdir.


Veri Tabanı Oluşturma


    Öncelikle SQLPS modülünü yüklüyoruz (import). Daha sonra veri tabanı ile bağlantıyı sağlamak için SQL Server SMO nesnesi yaratıyoruz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server
 -ArgumentList $instanceName

    Çıktısı aşağıdaki gibi olursa sorun yok demektir.

PS SQLSERVER:\> Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName
VERBOSE: Importing cmdlet 'Add-SqlAvailabilityDatabase'.
VERBOSE: Importing cmdlet 'Add-SqlAvailabilityGroupListenerStaticIp'.
VERBOSE: Importing cmdlet 'Backup-SqlDatabase'.
VERBOSE: Importing cmdlet 'Convert-UrnToPath'.
VERBOSE: The 'Decode-SqlName' command in the SQLPS' module was imported, but because its name does not include
 an approved verb, it might be difficult to find. For a list of approved verbs, type Get-Verb.
VERBOSE: Importing cmdlet 'Decode-SqlName'.
VERBOSE: Importing cmdlet 'Disable-SqlAlwaysOn'.
VERBOSE: Importing cmdlet 'Enable-SqlAlwaysOn'.
VERBOSE: The 'Encode-SqlName' command in the SQLPS' module was imported, but because its name does not include
 an approved verb, it might be difficult to find. For a list of approved verbs, type Get-Verb.
VERBOSE: Importing cmdlet 'Encode-SqlName'.
VERBOSE: Importing cmdlet 'Invoke-PolicyEvaluation'.
..............................

VERBOSE: Importing cmdlet 'Switch-SqlAvailabilityGroup'.
VERBOSE: Importing cmdlet 'Test-SqlAvailabilityGroup'.
VERBOSE: Importing cmdlet 'Test-SqlAvailabilityReplica'.
VERBOSE: Importing cmdlet 'Test-SqlDatabaseReplicaState'.
VERBOSE: Importing function 'SQLSERVER:'.
VERBOSE: Importing variable 'm'.


    Daha sonra aşağıdaki kodla veri tabanını oluşturuyoruz.


$dbName = "TestDB"
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($server,$dbName)
$db.Create()

$server.Databases | Select Name, Status, Owner, CreateDate


Oluşturulan veri tabanı görüntüsü (PowerShell)

Oluşturulan veri tabanı görüntüsü (SQL Server)


Veri Tabanını Silme


    Veri tabanı oluşturmada yaptığımız gibi SQLPS modülünü yüklüyoruz. Ardından yeniden bağlantı sağlamak için SMO nesnesini yaratıyoruz ve veri tabanını silmek için gerekli kodları yazıp çalıştırıyoruz. Hata ile karşılaşmamak için sileceğimiz veri tabanının var olup olmadığını kontrol etmemiz gerekiyor. Aşağıdaki örneği inceleyebilirsiniz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server 
-ArgumentList $instanceName

$dbName = "TestDB"

#veri tabanı var ise sil, yok ise hiçbişey yapma
$db = $server.Databases[$dbName]
if ($db)
{
    $server.KillDatabase($dbName)
}


Tablo Oluşturma


    Veri tabanı oluşturma ve silme işlemlerini göstermek için oluşturduğum "TestDB" veri tabanını sildiğim için tekrardan "SIS" adında bir veri tabanı oluşturdum. Tablo oluşturma ve diğer veri tabanı işlemleri için bu veri tabanını kullanacağım. Windows PowerShell'de yapacağımız her veri tabanı işlemlerinde SQLPS modülünü yüklememiz ve yeni bir SMO nesnesi yaratmamız gerekiyor.

    "Student" isminde bir tablo oluşturuyorum. Hata ile karşılaşmamak için tablonun var olup olmadığını kontrol etmemiz gerekiyor. Ardından oluşturacağımız tablonun her bir kolonunun özelliklerini yazıyoruz ve kod parçacığını çalıştırarak tabloyu oluşturuyoruz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"

$tableName = "Student"
$db = $server.Databases[$dbName]
$table = $db.Tables[$tableName]

#tablo var ise sil
if($table)
{
$table.Drop()
}

#istenilen tabloyu oluştur
$table = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Table -ArgumentList $db, $tableName

#column 1
$col1Name = "StudentID"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::Int;
$col1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col1Name, $type
$col1.Nullable = $false
$col1.Identity = $true
$col1.IdentitySeed = 1
$col1.IdentityIncrement = 1
$table.Columns.Add($col1)

#column 2 - İsim
$col2Name = "FName"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::VarChar(50)
$col2 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col2Name, $type
$col2.Nullable = $true
$table.Columns.Add($col2)

#column 3 - Soyisim (default değeri var)
$col3Name = "LName"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::VarChar(50)
$col3 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col3Name, $type
$col3.Nullable = $false
$col3.AddDefaultConstraint("DF_Student_LName").Text = "'Doe'"
$table.Columns.Add($col3)

#column 4 Yaş
$col4Name = "Age"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::Int;
$col4 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col4Name, $type
$col4.Nullable = $true
$table.Columns.Add($col4)
$table.Create()


    Oluşturduğumuz bu tablonun "primary key"'i yoktur. "StudentId" kolonunu "primary key" yapmak için aşağıdaki kodu kullanabilirsiniz.


$PK=New-Object -TypeName Microsoft.SqlServer.Management.SMO.Index -ArgumentList $table, "PK_Student_StudentID"
$PK.IsClustered = $true
$PK.IndexKeyType = [Microsoft.SqlServer.Management.SMO.IndexKeyType]::DriPrimaryKey

#hangi kolonu primary key yapacağımızı belirtiyoruz
$PKcol = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn -ArgumentList $PK, $col1Name
$PK.IndexedColumns.Add($PKcol)
$PK.Create()


Veri tabanı ve tabloların görüntüsü


"View" Oluşturma


    Soyadlarına göre sıralanmış ilk 10 öğrencinin listesini getiren bir "view" oluşturdum. Aşağıdaki örneği inceleyebilirsiniz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"
$db = $server.Databases[$dbName]
$viewName = "viewStudent"
$view = $db.Views[$viewName]

#varsa sil
if ($view)
{
    $view.Drop()
}
$view = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View 
-ArgumentList $db, $viewName, "dbo"
$view.TextMode = $false
$view.TextBody = "SELECT TOP 10 StudentId, LName, FName 
FROM SIS.Student WHERE LName = 'IN' ORDER BY LName"
$view.Create()


Bu hafta anlatacaklarım bu kadar. Haftaya görüşürüz.


Referanslar:

Kitap: "SQL Server 2012 with PowerShell V3 Cookbook"

Hiç yorum yok:

Yorum Gönder