# 機能設計書 111-Get-DbaDbSharePoint

## 概要

本ドキュメントは、SharePointファームに属するデータベースを識別するための機能設計書である。SharePoint構成データベースを照会することで、SQL ServerインスタンスでSharePointが使用しているすべてのデータベースを特定する。

### 本機能の処理概要

**業務上の目的・背景**：SharePointはSQL Serverを使用して多数のデータベースを作成・管理するが、どのデータベースがSharePointファームに属しているかを特定することは、メンテナンス計画、マイグレーション、トラブルシューティングにおいて重要である。従来、DBAsは命名規則やドキュメントに頼っていたが、この機能によりプログラム的にSharePointデータベースを特定できるようになった。

**機能の利用シーン**：
- SQL Serverのメンテナンス計画において、SharePointデータベースを除外または包含する必要がある場合
- SharePointファームのマイグレーション時に、すべてのデータベースを確実に移行する必要がある場合
- SharePoint接続問題のトラブルシューティング時
- データベースの棚卸し・監査時

**主要な処理内容**：
1. SharePoint構成データベース（デフォルト：SharePoint_Config）へ接続
2. Classes テーブルから SPDatabase クラスのGUIDを取得
3. proc_getObjectsByBaseClass ストアドプロシージャを使用してSharePointデータベースのIDを取得
4. Objects テーブルからデータベース名を取得
5. Get-DbaDatabase を使用して対応するSMOデータベースオブジェクトを返却

**関連システム・外部連携**：SharePoint構成データベースの内部テーブルおよびストアドプロシージャへ依存する。SharePoint 2010以降の構成データベースに対応。

**権限による制御**：SharePoint構成データベースへの読み取り権限が必要。SharePoint内部テーブル（Classes、Objects）およびproc_getObjectsByBaseClassストアドプロシージャへのアクセス権が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | PowerShellコマンドラインインターフェースのみ |

## 機能種別

データ参照（SELECT操作）/ SharePointメタデータ取得

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | 接続可能なインスタンス名 |
| SqlCredential | PSCredential | No | 代替認証資格情報 | 有効なWindows/SQL認証資格情報 |
| ConfigDatabase | string[] | No | SharePoint構成データベース名（デフォルト：SharePoint_Config） | 存在するデータベース名 |
| InputObject | Microsoft.SqlServer.Management.Smo.Database[] | No | パイプライン経由でのデータベースオブジェクト | SMO Databaseオブジェクト |
| EnableException | switch | No | 例外を発生させるかどうか | - |

### 入力データソース

- SqlInstanceパラメータ: ユーザー入力またはパイプライン
- InputObject: Get-DbaDatabase からのパイプライン入力
- ConfigDatabase: SharePoint構成データベース名（デフォルト値あり）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名（computer\instance形式） |
| Name | string | データベース名 |
| Status | string | データベースの状態（Normal、Offline等） |
| IsAccessible | bool | データベースがアクセス可能かどうか |
| RecoveryModel | string | 復旧モデル（Full、Simple、BulkLogged） |
| LogReuseWaitStatus | string | トランザクションログの再利用待機状態 |
| Size | decimal | データベースサイズ（MB） |
| Compatibility | int | 互換性レベル |
| Collation | string | 照合順序 |
| Owner | string | データベース所有者 |
| Encrypted | bool | TDE暗号化の有無 |
| LastFullBackup | datetime | 最終フルバックアップ日時 |
| LastDiffBackup | datetime | 最終差分バックアップ日時 |
| LastLogBackup | datetime | 最終ログバックアップ日時 |

### 出力先

- PowerShellパイプライン（標準出力）
- Microsoft.SqlServer.Management.Smo.Database オブジェクトとして返却

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ SqlInstanceまたはInputObjectの有効性確認
2. SqlInstance指定時: Get-DbaDatabase で構成データベースを取得
   └─ InputObjectに追加
3. 各構成データベースについてループ処理
   ├─ 3.1 SPDatabaseクラスのGUIDを取得
   │      └─ Classes テーブルから FullName が 'Microsoft.SharePoint.Administration.SPDatabase,%' のIDを検索
   ├─ 3.2 SharePointデータベースIDを取得
   │      └─ proc_getObjectsByBaseClass ストアドプロシージャを実行
   ├─ 3.3 データベース名を取得
   │      └─ Objects テーブルから該当IDのNameを取得
   └─ 3.4 SMOデータベースオブジェクトを返却
          └─ Get-DbaDatabase で各データベースを取得
4. エラー処理
   └─ 失敗時は Stop-Function でメッセージ出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定あり?}
    B -->|Yes| C[Get-DbaDatabase で構成DB取得]
    C --> D[InputObjectに追加]
    B -->|No| D
    D --> E{InputObjectをループ}
    E --> F[SPDatabase クラスGUID取得]
    F --> G[proc_getObjectsByBaseClass 実行]
    G --> H[Objects テーブルからDB名取得]
    H --> I[Get-DbaDatabase でSMOオブジェクト取得]
    I --> J{次のInputObject?}
    J -->|Yes| E
    J -->|No| K[終了]
    F --> L{エラー?}
    L -->|Yes| M[Stop-Function]
    M --> K
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | デフォルト構成DB | 構成データベースが指定されない場合、SharePoint_Config を使用 | ConfigDatabaseパラメータ未指定時 |
| BR-002 | パイプライン優先 | InputObject経由で渡されたデータベースも処理対象に含める | InputObject指定時 |
| BR-003 | SMOオブジェクト返却 | 結果は完全なSMO Databaseオブジェクトとして返却 | 常時 |

### 計算ロジック

特になし。本機能はメタデータ参照のみを実行。

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| SPDatabaseクラスGUID取得 | Classes | SELECT | SharePointデータベースクラスの識別子を取得 |
| SharePointDB ID取得 | Objects | SELECT (ストアドプロシージャ経由) | ファームに登録されたデータベースIDを取得 |
| DB名取得 | Objects | SELECT | データベース名を取得 |

### テーブル別操作詳細

#### Classes テーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | Id | FullName LIKE 'Microsoft.SharePoint.Administration.SPDatabase,%' | GUIDとして取得 |

#### Objects テーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | Name | Id IN (取得したデータベースID) | データベース名を取得 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 接続エラー | SQL Serverインスタンスに接続できない | Stop-Functionでエラーメッセージを表示、処理継続 |
| - | クエリエラー | SharePoint構成テーブルが存在しない | try-catchで捕捉し、Stop-Functionで通知 |
| - | 権限エラー | 構成データベースへのアクセス権がない | エラーメッセージで権限確認を促す |

### リトライ仕様

リトライ処理は実装されていない。接続エラー時は当該インスタンスをスキップして次のインスタンスを処理。

## トランザクション仕様

読み取り専用操作のため、トランザクション管理は不要。

## パフォーマンス要件

- SharePoint構成データベースへの3回のクエリを実行
- 大規模ファーム（数百データベース）でも数秒以内に完了することが期待される

## セキュリティ考慮事項

- SharePoint構成データベースの内部テーブルへのアクセス権が必要
- SQL認証使用時は資格情報の安全な管理が必要
- Get-Credential を使用した安全な資格情報入力をサポート

## 備考

- SharePoint 2010以降の構成データベース構造に対応
- マルチファーム環境では、各構成データベースを個別に指定可能
- 戻り値はフルのSMO Databaseオブジェクトであるため、追加のプロパティへのアクセスが可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本機能ではSharePoint構成データベースの内部テーブル構造を使用する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | 出力がMicrosoft.SqlServer.Management.Smo.Databaseオブジェクトであることを確認 |

**読解のコツ**: SharePointの内部テーブル構造（Classes、Objects）はSharePoint SDKのドキュメントを参照。dbatools固有の型定義は使用していない。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | 関数のパラメータ定義と処理開始点 |

**主要処理フロー**:
1. **86-93行目**: パラメータ定義 - SqlInstance、SqlCredential、ConfigDatabase、InputObject、EnableException
2. **94-97行目**: processブロック開始、SqlInstance指定時のInputObject取得
3. **99-108行目**: 各構成データベースに対するループ処理

#### Step 3: SharePoint構成データベースクエリを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | SharePoint内部テーブルへのクエリロジック |

**主要処理フロー**:
- **101行目**: Classes テーブルから SPDatabase クラスのGUIDを取得
- **102行目**: proc_getObjectsByBaseClass ストアドプロシージャでデータベースIDを取得
- **103行目**: Objects テーブルからデータベース名を取得
- **104行目**: Get-DbaDatabase でSMOオブジェクトを返却

### プログラム呼び出し階層図

```
Get-DbaDbSharePoint
    │
    ├─ Get-DbaDatabase (SqlInstance指定時)
    │      └─ Connect-DbaInstance
    │
    └─ $db.Query() (3回実行)
           ├─ Classes テーブルへのSELECT
           ├─ proc_getObjectsByBaseClass の実行
           └─ Objects テーブルへのSELECT
           │
           └─ Get-DbaDatabase (結果返却用)
```

### データフロー図

```
[入力]                    [処理]                         [出力]

SqlInstance ───────▶ Get-DbaDatabase ───▶ InputObject
                            │
ConfigDatabase ─────────────┘

InputObject ───────▶ SharePoint構成DB ───▶ Classes テーブル
                            │
                            ▼
                     proc_getObjectsByBaseClass
                            │
                            ▼
                     Objects テーブル
                            │
                            ▼
                     Get-DbaDatabase ───▶ SMO Database オブジェクト
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | ソース | メイン関数の実装 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベースオブジェクト取得のヘルパー関数 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続機能 |
| Get-DbaDbSharePoint.Tests.ps1 | `tests/Get-DbaDbSharePoint.Tests.ps1` | テスト | 単体テスト |
