SQLServer 2008 でPowerShellを使おう~DB&テーブル作成編~

はじめまして、私、けろ-みお と申します。

元々、管理人のHIROさんとは長い付き合いでして、

techbank.jp / techbank.jp コミュニティ! というところでも一緒にコミュニティ運営しております。

この度、SQL Server 2008 で標準搭載されたPowerShellを実践でも活用して頂きたく思い、初投稿することにしました。

元々、私の専門がASP/ASP.NET、SQLServerなもので、まだまだPowerShellは不慣れですが、どうぞ皆様宜しくお願いします。

◆PowerShellを使ってSQL Server 2008上にDB(データベース)を作成する

###################################################################
# 新しいDBを作成する
###################################################################
$NewDb = New-Object [Microsoft.SqlServer.Management.SMO.Database]
$NewDb.Parent = (Get-Item SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名])
$NewDb.Name = "[新しく作成したいDB名]"
$NewDb.Create()

###################################################################
# []内は環境に応じて変えて下さい。(その際、[]の文字部分も不要)
# [サーバー名]は、localhostなどのSQLServerがインストールされているマシン名かIPアドレス
# [SQLServerサービスインスタンス名]は、「MSSQLSERVER」等の名前
# [新しく作成したいDB名]は、新規作成したいDB名を任意で入れてください。
###################################################################

実行結果:

◆PowerShellを使って、SQL Server 上に簡単なテーブルを作成してみよう!

###################################################################################
# 新しいテーブルを作成する
###################################################################################
$table = New-Object Microsoft.SqlServer.Management.Smo.Table
$table.Parent = (Get-Item SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名]\Databases\[DB名])
$table.Name = "NewTableName"

###################################################################################
# 作成するテーブル列を作成する
# (必ずNameプロパティで列名を定義してから、DataTypeプロパティで列の型を定義すること!
# そうしないと
# 「"DataType" の設定中に例外が発生しました: "列 '' のDataType の設定に失敗しました。"」
# とエラーになる)
###################################################################################

# int型の列を作成する
$column1 = New-Object Microsoft.SqlServer.Management.Smo.Column
$column1.Parent = $table
$column1.Name = "column1"
$column1.DataType = ([Microsoft.SqlServer.Management.Smo.DataType]::Int)

# 作成した列をテーブルに追加
$table.Columns.Add($column1)

# nvarchar型の列を作成する
$column2 = New-Object Microsoft.SqlServer.Management.Smo.Column
$column2.Parent = $table
$column2.Name = "column2"
$column2.DataType = ([Microsoft.SqlServer.Management.Smo.DataType]::NVarChar(100))

# 作成した列をテーブルに追加
$table.Columns.Add($column2)

# テーブル作成実行
$table.Create()

実行結果:

◆PowerShellを使って、主キーや項目のNULL制御されているきちんとしたテーブルをSQLServer上に作成してみよう!

##################################################################################
# 主キーやNOT NULL項目ありのテーブルを作成する
##################################################################################

$table = New-Object Microsoft.SqlServer.Management.Smo.Table
$table.Parent = (Get-Item SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名]\Databases\[DB名])
$table.Name = "NewTableName2"

# まずはテーブルに追加する列を作成する
$column1 = New-Object Microsoft.SqlServer.Management.Smo.Column
$column1.Parent = $table
$column1.Name = "column1"
$column1.DataType = ([Microsoft.SqlServer.Management.Smo.DataType]::Int)

# 列はNULLを許可しないよう設定
$column1.Nullable = ([System.Boolean]::false)

# IDENTITYに対応させる(1から自動採番されるよう列を設定する)
$column1.IdentitySeed = 1
$column1.IdentityIncrement = 1

# 作成した列をテーブルに追加
$table.Columns.Add($column1)

# 主キーを作成する
$index = New-Object Microsoft.SqlServer.Management.Smo.Index
$index.Parent = $table
$index.Name = "PK_NewTable2"

# 主キーとして認識させるためにClustered Indexを作成する
$indexedColumn = New-Object Microsoft.SqlServer.Management.Smo.IndexedColumn
$indexedColumn.Parent = $index
$indexedColumn.Name = "column1"

# Clustered Indexを適用する
$index.IndexedColumns.Add($indexedColumn)
$index.IndexKeyType = ([Microsoft.SqlServer.Management.Smo.IndexKeyType]::DriPrimaryKey)

# 作成したClustered Indexをテーブルに追加
$table.Indexes.Add($index)

# テーブルを作成する
$table.Create()

実行結果:

◆まとめ

Microsoft.SqlServer.Management.Smoアセンブリ&名前空間の使い方がわかれば、

PowerShellじゃなくても活用はできると思いますが、 バッチ処理でDBやテーブルを作成しなきゃいけないとか、

ちょっとしたツールとしてDBを作らなきゃいけないとかそういった場合、

PowerShellコマンドレットで処理させると、 実務での活用どころも期待できると思っています。

どうぞお役立て頂きたく存じます。

◆その他

同様の記事を自身のBlog

http://techbank.jp/Community/blogs/mymio/default.aspx

にもクロスポストしています。予めご了承ください。

コメント

  1. YokoKen より:

    はじめまして

    今まで SQL Server 2008 に大した興味なかったけど、PowerShell で簡単に扱えるとなると魅力的です。
    SQL Server 2008 使う時は PowerShell 活用したいと思います。

  2. kero_mio より:

    >よこけんさん

    はじめまして!どうぞ、宜しくお願いします!
    SQL ServerでPowerShellを使えるメリットとして
    階層イメージでサーバー、DB、テーブル、
    各サービス(AgentやMailなど)にアクセスできる点ですね。
    cd SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名]\Databases\[DB名]
    とした後、DIRとかやるとテーブルの一覧を簡単に列挙できたりするので便利です。
    過去のSQL ServerでPowerShellがなかった時代は、
    こんなに簡単にテーブルの一覧を列挙することはできませんでしたので、
    それだけでも価値はあると思っています。

    元々、Web開発系の人間なのでPowerShellは本当ど素人ですが、
    今後ともよろしくお願いします。

  3. HIRO より:

    けろ-みおさん
    投稿ありがとうございます。

    待ってましたSQL-Serverネタ。
    ネット上でSQL-Server + PowerShellに書かれた記事はまだほとんどないですから、とても貴重です。しかもわかりやすいです。(SQL-Serverど素人の自分にも理解できました)

    これは関数化しておくといいかもしれませんね。
    そうすればいろんなバッチからの呼び出しにも使えそうですし、ちょっとテーブル作りたいときなんかにも便利そう。

    またSQL-Serverネタ(それ以外も)お願いします。

  4. kero_mio より:

    >HIROさん

    IDをもらってからだいぶ経つのに、投稿が遅くなってしまってすいませんでした。
    確かに日本ではまだPowerShell + SQL Serverの組み合わせで実装された記事って
    少ないですよね。ググってみてビックリしました。

    それから、こういったコードは汎用的なコマンドレットとして関数化しておくと
    いいかもしれませんね。
    他にもPowerShellがあったからこそ、SQLServerで便利に使えるようになった機能が
    たくさんあるので、時間を見てPowerShell from Japan!!にも記事を投函したいと
    思います。どうぞ宜しくお願いします!

タイトルとURLをコピーしました