AccessからSQL Serverへのスキルのアップサイズ |
秋月巌 AKIZUKI, Iwao
| SQL-DMOを使ったツールの作成 |
|---|

データ量が増大することへの対応やバックアップ処理などは日常的な処理である。これらを行なうユーザーに、高機能なSQL Enterpriseマネージャを使用させるのは気が重い。もっと機能を絞りこんだツールや、あるいは処理そのものが自動化されれば、Microsoft SQL Serverはもっと使いやすいデータベースサーバーになるはずである。
その理由として、SQL-DMO自体があまりわかりやすいオブジェクト構造をもっておらず、資料の不足が普及の妨げになっているといえるだろう。しかしSQL-DMOは、データベースアプリケーションを実運用していく上で非常に有意義なアイデアであり、また、COMオブジェクトの操作ツールとして優れているVisual Basicとの親和性も高い。ぜひ、本稿を読んでVisual Basicプログラムに活用していただきたい。 |

図3-b:設計中のフォーム

リスト1:Microsoft SQL Serverの起動と終了アプリケーションの全ソースコード
Dim SQLObj As New SQLOLE.SQLServer
Private Sub cb_start_Click()
SQLObj.Start Trim(txt_sqlsvr), _
Trim(txt_user), _
Trim(txt_pass)
End Sub
Private Sub cb_shutDown_Click()
SQLObj.Connect Trim(txt_sqlsvr), _
Trim(txt_user), _
Trim(txt_pass)
SQLObj.Shutdown
End Sub
Private Sub Timer1_Timer()
Dim status As String
Select Case SQLObj.status
Case 1
status = "起動中"
Case 2
status = "一時停止中"
Case 3
status = "停止中"
End Select
lbl_status = status
End Sub
|
Select Case SQLObj.status
Case 1
status = "起動中"
Case 2
status = "一時停止中"
Case 3
status = "停止中"
End Select
|
| デバイスの自動拡張ツール |
|---|

リスト2:データベースとテバイスの自動拡張アプリケーションの全ソースコード
Private Sub cb_dbExtend_Click()
Dim SQLObj As New SQLOLE.SQLServer
Dim exSize As Integer
Dim dbAvailable As Integer
Dim dvAvailable As Integer
Dim dbName As String
Dim dvName As String
' 入力した値が数値以外ならエラー
If Not (IsNumeric(txt_exSize.Text) _
And IsNumeric(txt_avSize.Text) _
And IsNumeric(txt_exDvSize.Text)) Then
MsgBox "数値を指定してください"
Exit Sub
End If
' テキスボックスの内容を変数に格納
exSize = txt_exSize.Text
dbName = CStr(Trim(txt_dbName))
dvName = CStr(Trim(txt_dvName))
' ログイン
SQLObj.Connect Trim(txt_sqlsvr), _
Trim(txt_user), _
Trim(txt_pass)
' データベースとデバイスの空き容量を確認
dbAvailable = SQLObj.Databases(dbName).SpaceAvailable
dvAvailable = SQLObj.Devices(dvName).SpaceAvailable
' データベースとデバイスの空き容量を表示
MsgBox "現在のデータベースの空き容量は :" & _
dbAvailable & "KB" & vbCrLf & _
"現在のデバイスの空き容量は :" & _
dvAvailable & "MB"
' データベースの空き容量を判断
If dbAvailable < txt_avSize.Text * 1024 Then
' デバイスの空き容量を判断
If dvAvailable <= exSize Then
' データベースを拡張するのに
' 空き容量が不足している場合はデバイスを拡張
Dim dballsize As Integer
' 拡張するデバイスのサイズをページサイズで取得
dvAllSize = _
(SQLObj.Devices(dvName).Size + _
CInt(txt_exDvSize.Text)) * 512
MsgBox CStr(dvAllSize) & _
"ページにデバイスを拡張します"
' DISK SIZEをシステムデータベースに対して実行する
SQLObj.Databases("master").ExecuteImmediate _
"DISK RESIZE name = '" & dvName & "', _
size = " & CStr(dvAllSize)
End If
SQLObj.Databases(dbName).ExtendOnDevices _
dvName & "=" & CStr(exSize)
MsgBox "データベースを拡張しました"
Else
MsgBox "まだデータベースに十分な空き" & _
"容量があるので拡張しません"
End If
Set SQLObj = Nothing
End Sub
|
| バックアップアプリケーション |
|---|

リスト3:バックアップデバイス作成アプリケーションの全ソースコード
Private Sub CreateDevice(DevFileName As String)
Dim SQLObj As New SQLOLE.SQLServer
' ログイン
SQLObj.Connect Trim(txt_sqlsvr), _
Trim(txt_user), _
Trim(txt_pass)
' デバイスを作成
SQLObj.Databases("master").ExecuteImmediate _
"sp_addumpdevice 'disk', '" _
& txt_dev & "', '" & DevFileName & "'"
SQLObj.Close
Set SQLObj = Nothing
End Sub
Private Sub cb_dev_Click()
If txt_dev = "" Then
MsgBox "デバイス名を入力してください", _
vbExclamation
Exit Sub
End If
ComDialog.filename = txt_dev & ".DAT"
ComDialog.ShowSave
If ComDialog.filename <> "" _
And Mid(ComDialog.filename, 2, 2) = ":\" Then
' デバイスの作成プロシージャの呼び出し
Call CreateDevice(ComDialog.filename)
lbl1 = ComDialog.filename
End If
End Sub
|

図7:データベース名参照リスト![]() |
図8:バックアップデバイス名参照リスト
|
Private Sub cb_backup_Click()
Dim SQLObj As New SQLOLE.SQLServer
Dim BackupObj As New SQLOLE.Backup
Dim sMsg As String
' ログイン
SQLObj.Connect Trim(txt_sqlsvr), _
Trim(txt_user), _
Trim(txt_pass)
BackupObj.DumpDevices = _
CStr(Trim(txtDev)) ' バックアップデバイス名
If Check1.Value = vbChecked Then
' 初期化する
BackupObj.DumpInitDeviceBefore = True
Else
' 初期化しない
BackupObj.DumpInitDeviceBefore = False
End If
Select Case True
' データベースのバックアップ
Case OptType(0)
sMsg = "データベースのバックアップ"
SQLObj.Databases(Trim(txtDB))._
Dump BackupObj
' トランザクションログのバックアップ
Case OptType(1)
sMsg = "トランザクションログのバックアップ"
SQLObj.Databases(Trim(txtDB)). _
TransactionLog.Dump BackupObj
End Select
MsgBox sMsg & "が終了しました", vbInformation
SQLObj.Close
Set SQLObj = Nothing
End Sub
Private Sub cb_db_Click()
Form2.LoadForm 0
End Sub
' ------ 一覧フォームに記述されたコード ------------
Private LoadType As Integer
Public Sub LoadForm(TypeFlg As Integer)
Select Case TypeFlg
Case 0: DBList ' データベース
Case 1: DevList ' バックアップデバイス
End Select
LoadType = TypeFlg
Me.Show vbModal ' フォームを表示
End Sub
Private Sub DBList()
Dim SQLObj As New SQLOLE.SQLServer
Dim objDB As SQLOLE.Database
SQLObj.Connect Trim(Form1.txt_sqlsvr), _
Trim(Form1.txt_user), _
Trim(Form1.txt_pass)
' データベースの一覧を表示
For Each objDB In SQLObj.Databases
List1.AddItem objDB.Name
Next objDB
End Sub
Private Sub DevList()
Dim SQLObj As New SQLOLE.SQLServer
Dim rsQResult As SQLOLE.QueryResults
Dim rowNo As Integer
SQLObj.Connect Trim(Form1.txt_sqlsvr), _
Trim(Form1.txt_user), _
Trim(Form1.txt_pass)
Set rsQResult = SQLObj.Databases("master"). _
ExecuteWithResults("sp_helpdevice")
' バックアップデバイスの一覧を表示
For rowNo = 1 To rsQResult.Rows
If rsQResult.GetColumnString(rowNo, 3) = _
"disk, dump device" Then
List1.AddItem rsQResult.GetColumnString(rowNo, 1)
End If
Next rowNo
End Sub
Private Sub cb_CANCEL_Click()
Unload Me
End Sub
Private Sub cb_OK_Click()
If List1.ListIndex > -1 Then
Select Case LoadType
' データベース
Case 0: Form1.txtDB = _
List1.List(List1.ListIndex)
' バックアップデバイス
Case 1: Form1.txtDev = _
List1.List(List1.ListIndex)
End Select
End If
Unload Me
End Sub
|

Dim BackupObj As New SQLOLE.Backup : BackupObj.DumpDevices = CStr(Trim(txtDev)) If Check1.Value = vbChecked Then BackupObj.DumpInitDeviceBefore = True Else BackupObj.DumpInitDeviceBefore = False End If |
Select Case True
Case OptType(0)
sMsg = _
"データベースのバックアップ"
SQLObj.Databases(Trim(txtDB)). _
Dump BackupObj
Case OptType(1)
sMsg = _
"トランザクションログのバックアップ"
SQLObj.Databases(Trim(txtDB)). _
TransactionLog.Dump BackupObj
End Select
|
条件分岐しているのは、バックアップのターゲットがデータベースか、トランザクションログかで記述方法が異なるからである。Dumpメソッドが無事に終了すれば、バックアップが完了する。 |