# 画面設計書 266-SharePoint DB

## 概要

本ドキュメントは、dbatoolsのSharePointデータベース識別機能に関する画面設計書です。SharePointファームに属するすべてのデータベースを識別し、DBAがSQL Server上のSharePoint関連データベースを効率的に管理できるよう支援するPowerShellコマンドを定義します。

### 本画面の処理概要

本機能は、SharePoint構成データベースの内部テーブルとストアドプロシージャをクエリすることで、SharePointファームに属するすべてのデータベースを検出し、データベースオブジェクトを返すGet-DbaDbSharePointコマンドを提供します。

**業務上の目的・背景**：SQL Serverインスタンスにあるデータベースのうち、どれがSharePointによってアクティブに使用されているかを特定することは、メンテナンス計画、マイグレーション、SharePoint接続のトラブルシューティングにおいて重要です。本機能により、推測に頼らずSharePointデータベースを正確に識別できます。

**画面へのアクセス方法**：PowerShellコンソールから以下のコマンドを実行してアクセスします。
```powershell
Get-DbaDbSharePoint -SqlInstance <インスタンス名>
```

**主要な操作・処理内容**：
1. SharePoint構成データベース（デフォルト: SharePoint_Config）への接続
2. Classesテーブルからデータベース基底クラスのGUIDを取得
3. proc_getObjectsByBaseClassストアドプロシージャで登録済みデータベースを取得
4. Objectsテーブルからデータベース名を取得
5. 対応するSMOデータベースオブジェクトを返却

**画面遷移**：
- `Connect-DbaInstance`で接続を確立後に実行可能
- `Get-DbaDatabase`からパイプライン入力可能
- 取得結果はSMO Databaseオブジェクトとして他のdbatools関数に渡せる

**権限による表示制御**：
- SharePoint構成データベースへの接続権限が必要
- 構成データベース内のClasses、Objectsテーブルへのアクセス権限が必要
- proc_getObjectsByBaseClassストアドプロシージャの実行権限が必要

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 111 | Get-DbaDbSharePoint | 主機能 | SharePointデータベースの取得 |

## 画面種別

CLI（コマンドラインインターフェース）- PowerShellコマンド

## URL/ルーティング

PowerShellコマンド: `Get-DbaDbSharePoint`

## 入出力項目

### パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| ConfigDatabase | string[] | No | SharePoint構成データベース名（デフォルト: SharePoint_Config） |
| InputObject | Database[] | No | パイプライン入力（Get-DbaDatabase出力） |
| EnableException | switch | No | 例外を有効化 |

## 表示項目

### 出力オブジェクト（Microsoft.SqlServer.Management.Smo.Database）

デフォルト表示プロパティ:

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

追加プロパティ（Select-Object * で表示）:
- IsCdcEnabled: CDC有効化の有無
- その他すべてのSMO Databaseプロパティ

## イベント仕様

### 1-Get-DbaDbSharePoint実行

1. SqlInstance指定時はGet-DbaDatabase経由で構成データベースを取得
2. InputObject指定時は直接構成データベースを処理
3. 各構成データベースに対して以下を実行:
   - Classesテーブルからデータベース基底クラスのGUIDを取得
   - proc_getObjectsByBaseClassでオブジェクトIDを取得
   - ObjectsテーブルからデータベースNameを取得
   - Get-DbaDatabase でSMOオブジェクトを取得

### 2-SharePoint内部クエリ

実行されるクエリ:
```sql
-- ステップ1: データベース基底クラスのGUID取得
SELECT Id FROM Classes WHERE FullName LIKE 'Microsoft.SharePoint.Administration.SPDatabase,%'

-- ステップ2: 登録済みデータベースのID取得
EXEC [dbo].[proc_getObjectsByBaseClass] @BaseClassId = '$guid', @ParentId = NULL

-- ステップ3: データベース名の取得
SELECT [Name] FROM [dbo].[Objects] WHERE Id IN ('$dbid')
```

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaDbSharePoint | dbo.Classes | SELECT | データベース基底クラスGUIDの取得 |
| Get-DbaDbSharePoint | dbo.proc_getObjectsByBaseClass | EXEC | 登録済みオブジェクトIDの取得 |
| Get-DbaDbSharePoint | dbo.Objects | SELECT | データベース名の取得 |

本コマンドは読み取り専用操作のみを行い、データベースの変更は行いません。

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|--------------|---------|
| MSG001 | エラー | Failure | 接続エラーまたはクエリ実行エラー |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 構成データベース接続エラー | Stop-Functionでエラーレコードと共に報告 |
| クエリ実行エラー | Stop-Functionでエラーレコードと共に報告 |
| 構成データベースが見つからない | Get-DbaDatabase で空の結果を返す |

## 備考

- SharePoint構成データベースのデフォルト名は「SharePoint_Config」
- 複数のSharePointバージョンが同一インスタンスにある場合は、ConfigDatabaseで構成データベースを明示的に指定
- 出力はSMO Databaseオブジェクトなので、他のdbatools関数にパイプライン入力可能
- SharePoint固有の内部ストアドプロシージャ（proc_getObjectsByBaseClass）を使用
- 内容データベース、サービスアプリケーションデータベース等、すべてのSharePoint関連データベースを返す

---

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

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

### 推奨読解順序

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

SharePoint構成データベースの内部構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | 行101-103の3つのクエリ |

**読解のコツ**: SharePoint構成データベースのClasses、Objects、proc_getObjectsByBaseClassの関係を理解します。

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

processブロックでの処理フローを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | 行94-109のprocessブロック |

**主要処理フロー**:
1. **95-97行**: SqlInstance指定時のGet-DbaDatabase呼び出し
2. **99-108行**: 各構成データベースの処理
3. **101行**: Classesテーブルからデータベース基底クラスのGUID取得
4. **102行**: proc_getObjectsByBaseClassでオブジェクトID取得
5. **103行**: ObjectsテーブルからName取得
6. **104行**: Get-DbaDatabase でSMOオブジェクト取得

#### Step 3: 出力オブジェクトを理解する

SMO Databaseオブジェクトの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | 行56-82のドキュメント |

**主要処理フロー**:
- 出力はMicrosoft.SqlServer.Management.Smo.Database型
- Select-DefaultViewによりデフォルト表示プロパティが設定
- すべてのSMO Databaseプロパティがアクセス可能

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

```
Get-DbaDbSharePoint
    |
    +-- process block
            |
            +-- foreach ($instance in $SqlInstance)
            |       |
            |       +-- Get-DbaDatabase -Database $ConfigDatabase
            |               |
            |               +-- $InputObject += （構成データベース）
            |
            +-- foreach ($db in $InputObject)
                    |
                    +-- $db.Query("SELECT Id FROM Classes...")
                    |       |
                    |       +-- $guid = ベースクラスのGUID
                    |
                    +-- $db.Query("[dbo].[proc_getObjectsByBaseClass]...")
                    |       |
                    |       +-- $dbid = データベースオブジェクトのID配列
                    |
                    +-- $db.Query("SELECT [Name] FROM [dbo].[Objects]...")
                    |       |
                    |       +-- $dbName = SharePointデータベース名配列
                    |
                    +-- Get-DbaDatabase -SqlInstance $db.Parent -Database $dbName
                            |
                            +-- SMO Database オブジェクト配列
```

### データフロー図

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

SqlInstance/         +------------------+
ConfigDatabase   -->| Get-DbaDatabase  |
                     | (構成DB取得)    |
                     +--------+---------+
                              |
                              v
InputObject          +------------------+
                 -->| Query:           |
                     | Classes.Id       |
                     +--------+---------+
                              |
                              v
                     +------------------+
                     | Query:           |
                     | proc_getObjects  |
                     | ByBaseClass      |
                     +--------+---------+
                              |
                              v
                     +------------------+
                     | Query:           |
                     | Objects.Name     |
                     +--------+---------+
                              |
                              v
                     +------------------+
                     | Get-DbaDatabase  |---> SMO Database[]
                     | (SharePoint DB)  |     (SharePointデータベース)
                     +------------------+
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbSharePoint.ps1 | `public/Get-DbaDbSharePoint.ps1` | ソース | SharePointデータベース取得の主要ロジック |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | 依存 | データベースオブジェクト取得 |
