# dbatools

## 概要

dbatools は SQL Server 管理者のためのコミュニティ製 PowerShell モジュールです。データベース開発とサーバー管理を自動化し、手動の SQL Server 管理作業を強力で楽しい自動化に置き換えます。700 近くのコマンドを備え、SQL Server インスタンスのマイグレーション、バックアップテスト、データベース検索などを数分で実行できます。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| マイグレーション | SQL Server インスタンス全体のマイグレーション、ログイン、エージェントジョブ、資格情報などのコピー |
| バックアップ/リストア | データベースのバックアップ、リストア、バックアップの自動検証テスト |
| 可用性グループ (AG) | Always On 可用性グループの構成、管理、フェイルオーバー |
| SQL Agent | ジョブ、スケジュール、オペレーター、アラートの管理 |
| データベース管理 | データベースの作成、設定、圧縮、暗号化、スナップショット管理 |
| レプリケーション | パブリケーション、サブスクリプション、ディストリビューターの管理 |
| セキュリティ | ログイン、ユーザー、ロール、権限、証明書の管理 |
| パフォーマンス監視 | 待機統計、クエリ実行時間、診断クエリの実行 |
| 拡張イベント (XE) | セッションの作成、管理、テンプレートのエクスポート/インポート |
| サーバー構成 | sp_configure、最大メモリ、MaxDOP などの設定管理 |

## 技術スタック

### コア

- フレームワーク: PowerShell Module
- 言語: PowerShell v3+ (Windows) / PowerShell Core 7.4+ (Linux/macOS)
- 依存モジュール: dbatools.library (SMO、Azure ライブラリ含む)
- 対応サーバー: SQL Server 2000 - 2022、Azure SQL Database、Azure SQL Managed Instance

### 主要ライブラリ

- SMO (SQL Server Management Objects) - SQL Server オブジェクトの操作
- Microsoft.Data.SqlClient - データベース接続
- Azure SDK - Azure SQL / Azure 認証対応

## ディレクトリ構成

```
dbatools-development/
├── dbatools.psd1              # モジュールマニフェスト
├── dbatools.psm1              # メインモジュールファイル
├── public/                    # 公開コマンド (698 関数)
│   ├── Add-DbaAgDatabase.ps1
│   ├── Backup-DbaDatabase.ps1
│   ├── Connect-DbaInstance.ps1
│   └── ...
├── private/                   # 内部関数
│   ├── configurations/        # 設定関連
│   ├── dynamicparams/         # 動的パラメーター
│   ├── functions/             # 内部ヘルパー関数 (123 関数)
│   ├── maintenance/           # メンテナンス関連
│   ├── scripts/               # スクリプト
│   └── testing/               # テスト用内部関数
├── tests/                     # Pester テストファイル (729 ファイル)
│   ├── Get-DbaDatabase.Tests.ps1
│   └── ...
├── bin/                       # バイナリ・リソースファイル
│   ├── XEtemplates/           # 拡張イベントテンプレート
│   ├── diagnosticquery/       # 診断クエリ
│   ├── maintenancesolution/   # Ola Hallengren メンテナンスソリューション
│   └── ...
├── xml/                       # 型定義・フォーマット定義
├── en-us/                     # 英語ヘルプファイル
├── opt/                       # オプション機能
├── .github/                   # GitHub Actions/Workflows
├── .devcontainer/             # 開発コンテナ設定
├── appveyor.yml               # AppVeyor CI 設定
├── CONTRIBUTING.md            # コントリビューションガイド
└── CLAUDE.md                  # AI 開発支援用スタイルガイド
```

## セットアップ

### 必要条件

- **Windows**: PowerShell v3 以上
- **Linux/macOS**: PowerShell Core 7.4.0 以上
- **依存モジュール**: dbatools.library (自動インストール)

### インストール

```powershell
# 実行ポリシーの設定 (初回のみ)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# PowerShell Gallery を信頼 (初回のみ)
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

# 現在のユーザーにインストール (推奨)
Install-Module dbatools -Scope CurrentUser

# 全ユーザーにインストール (管理者権限が必要)
Install-Module dbatools
```

### オフラインインストール

```powershell
# インターネット接続のあるマシンで
Save-Module -Name dbatools -Path C:\temp

# ターゲットマシンにコピー後
Import-Module dbatools
```

### 基本的な使用例

```powershell
# データベース一覧の取得
Get-DbaDatabase -SqlInstance localhost

# 最終バックアップ状態の確認
Get-DbaLastBackup -SqlInstance localhost | Format-Table

# バックアップのテスト
Test-DbaLastBackup -SqlInstance localhost

# インスタンス間のマイグレーション
Start-DbaMigration -Source sql01 -Destination sql02 -BackupRestore -SharedPath '\\nas\temp'
```

## 開発

### フォーマッター

プロジェクトでは OTBS (One True Brace Style) を採用しています。

```powershell
# コードフォーマットの適用
Invoke-DbatoolsFormatter -Path .\public\Get-DbaDatabase.ps1
```

### テストの実行

テストフレームワークには Pester を使用しています。

```powershell
# 依存モジュールのインストール
Install-Module Pester -MinimumVersion 5.0 -Scope CurrentUser

# 特定のコマンドのテスト実行
Invoke-Pester -Path .\tests\Get-DbaDatabase.Tests.ps1

# タグ指定でテスト実行
Invoke-Pester -Path .\tests\ -Tag 'UnitTests'
```

### CI/CD

- **AppVeyor**: コミットごとに自動テスト実行
- **シナリオ**: SINGLE、MULTI、COPY、HADR、RESTART など複数環境
- **Codecov**: テストカバレッジレポート

### コーディング規約

- パラメーター: PascalCase、単数形 (例: `$SqlInstance`)
- 変数: camelCase (例: `$currentLogin`)
- ハッシュテーブル: 値の `=` を整列
- スプラッティング: 3 つ以上のパラメーターは `$splat<Purpose>` 形式で使用
- PowerShell v3 互換: `::new()` は使用禁止、`New-Object` を使用
