# 機能設計書 134-Get-DbaOleDbProvider

## 概要

本ドキュメントは、dbatools PowerShellモジュールの`Get-DbaOleDbProvider`コマンドレットに関する機能設計書です。このコマンドレットは、SQL Serverに登録されているOLE DBプロバイダーの構成情報を取得する機能を提供します。

### 本機能の処理概要

**業務上の目的・背景**：リンクサーバー、分散クエリ、OPENROWSET操作などでSQL Serverが外部データソースに接続する際、OLE DBプロバイダーが必要です。プロバイダーの構成が不適切だと接続失敗や予期しない動作の原因となります。本機能は、SQL Serverが認識しているOLE DBプロバイダーの一覧とセキュリティ設定（AllowInProcess、DisallowAdHocAccessなど）を取得し、リンクサーバーの設定や分散クエリの問題診断を支援します。

**機能の利用シーン**：
- リンクサーバー設定時にどのOLE DBプロバイダーが利用可能か確認する場合
- 分散クエリ（OPENROWSET/OPENDATASOURCE）の失敗原因を調査する場合
- SQL Serverの外部接続機能を監査する場合
- 複数インスタンス間でOLE DBプロバイダー設定を比較する場合

**主要な処理内容**：
1. SQL Serverインスタンスに接続
2. SMOのOleDbProviderSettingsコレクションを取得
3. 指定されたプロバイダー名でフィルタリング（オプション）
4. 各プロバイダーにコンピュータ名などのメタデータを付加
5. デフォルト表示プロパティを設定して出力

**関連システム・外部連携**：
- SQL Server SMO（Server.Settings.OleDbProviderSettings）
- Connect-DbaInstance（SQL Server接続）

**権限による制御**：SQL ServerへのVIEW SERVER STATE権限が必要です。OLE DBプロバイダー設定の参照には特別な権限は不要ですが、接続自体が可能である必要があります。

## 関連画面

本機能はコマンドラインツールであり、画面機能マッピングに該当する関連画面はありません。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | PowerShellコマンドラインで実行 |

## 機能種別

データ取得 / 構成監査

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス | パイプライン入力可、Mandatory |
| SqlCredential | PSCredential | No | SQL Server接続用の資格情報 | - |
| Provider | string[] | No | 特定のプロバイダー名でフィルタリング | - |
| EnableException | switch | No | 例外処理を有効化 | - |

### 入力データソース

- SQL Server SMO: Server.Settings.OleDbProviderSettings

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Name | string | OLE DBプロバイダー名（例: SQLNCLI11, MSDASQL） |
| Description | string | プロバイダーの説明 |
| AllowInProcess | bool | SQL Serverプロセス内での実行を許可するか |
| DisallowAdHocAccess | bool | アドホックアクセス（OPENROWSET等）を禁止するか |
| DynamicParameters | bool | 動的パラメータをサポートするか |
| IndexAsAccessPath | bool | インデックスをアクセスパスとしてサポートするか |
| LevelZeroOnly | bool | テーブルレベルの操作のみを許可するか |
| NestedQueries | bool | ネストされたクエリをサポートするか |
| NonTransactedUpdates | bool | トランザクション外での更新をサポートするか |

### 出力先

PowerShellパイプライン（Microsoft.SqlServer.Management.Smo.OleDbProviderSettings）

## 処理フロー

### 処理シーケンス

```
1. processブロック: 各インスタンスに対して処理
   ├─ Connect-DbaInstanceで接続
   ├─ Server.Settings.OleDbProviderSettingsを取得
   ├─ Provider指定時はWhere-Objectでフィルタリング
   └─ 各プロバイダーにメタデータ付加して出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{各SqlInstanceに対して}
    B --> C[Connect-DbaInstance]
    C --> D{接続成功?}
    D -->|No| E[Stop-Function]
    E --> B
    D -->|Yes| F[OleDbProviderSettings取得]
    F --> G{Provider指定?}
    G -->|Yes| H[Where-Objectでフィルタ]
    G -->|No| I[全プロバイダー]
    H --> J{各プロバイダーに対して}
    I --> J
    J --> K[Add-Memberでメタデータ付加]
    K --> L[Select-DefaultViewで出力]
    L --> J
    J -->|完了| B
    B -->|完了| M[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | プロバイダーフィルタリング | Provider指定時、Name -in $Provider でフィルタリング | Provider指定時 |
| BR-002 | デフォルト表示制御 | 12個のプロパティをデフォルト表示 | 常時 |
| BR-003 | メタデータ付加 | ComputerName, InstanceName, SqlInstanceを動的追加 | 常時 |

### 計算ロジック

特別な計算ロジックはありません。

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

本機能はデータベースへの直接操作を行いません。SMO経由でサーバー設定を参照します。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 接続エラー | SQL Serverへの接続失敗 | Stop-Function (ConnectionError) で処理継続 |

### リトライ仕様

リトライ処理は実装されていません。

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

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

## パフォーマンス要件

- 各インスタンスに対してSMO経由でプロバイダー情報取得
- 通常数秒以内で完了

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

- SQL Server接続にはWindows認証またはSQL認証をサポート
- SqlCredentialで認証情報を安全に取り扱い

## 備考

- OLE DBプロバイダーの設定変更にはSET OLE_DB_PROVIDER権限が必要
- AllowInProcess=trueのプロバイダーはSQL Serverプロセス内で実行され、パフォーマンスは向上するがクラッシュリスクがある
- DisallowAdHocAccess=trueのプロバイダーはOPENROWSET/OPENDATASOURCEで使用不可

---

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

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

### 推奨読解順序

#### Step 1: SMOオブジェクト構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaOleDbProvider.ps1 | `public/Get-DbaOleDbProvider.ps1` | 40-66行目: .OUTPUTS セクションで出力型の説明 |

**読解のコツ**: 出力がMicrosoft.SqlServer.Management.Smo.OleDbProviderSettingsオブジェクトであり、Add-Memberでカスタムプロパティを追加している点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaOleDbProvider.ps1 | `public/Get-DbaOleDbProvider.ps1` | 77-84行目: パラメータ定義 |

**主要処理フロー**:
1. **79行目**: SqlInstanceはMandatoryパラメータ
2. **82行目**: Providerは複数指定可能（string[]）

#### Step 3: メイン処理フローを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaOleDbProvider.ps1 | `public/Get-DbaOleDbProvider.ps1` | 85-107行目: processブロック全体 |

**主要処理フロー**:
- **87-91行目**: Connect-DbaInstanceで接続、失敗時はStop-Function
- **94行目**: Server.Settings.OleDbProviderSettingsを取得
- **96-98行目**: Provider指定時はWhere-Objectでフィルタリング
- **100-105行目**: 各プロバイダーにメタデータ付加して出力

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

```
Get-DbaOleDbProvider
    │
    └─ process ブロック
           │
           └─ foreach ($instance in $SqlInstance)
                  │
                  ├─ Connect-DbaInstance
                  │      └─ [失敗時] Stop-Function
                  │
                  ├─ $server.Settings.OleDbProviderSettings
                  │
                  ├─ [Provider指定時] Where-Object
                  │
                  └─ foreach ($oledbprovider in $providers)
                         │
                         ├─ Add-Member (ComputerName)
                         ├─ Add-Member (InstanceName)
                         ├─ Add-Member (SqlInstance)
                         │
                         └─ Select-DefaultView
```

### データフロー図

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

SqlInstance ───────▶ Connect-DbaInstance
                           │
                           ▼
                    $server.Settings ──▶ OleDbProviderSettings
                           │
                           ▼
         [Provider指定時] Where-Object フィルタ
                           │
                           ▼
                    Add-Member ──▶ メタデータ付加
                           │
                           ▼
                    Select-DefaultView ───────▶ パイプライン出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaOleDbProvider.ps1 | `public/Get-DbaOleDbProvider.ps1` | ソース | メイン処理 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Select-DefaultView.ps1 | `private/functions/Select-DefaultView.ps1` | ソース | デフォルト表示制御 |
| Stop-Function.ps1 | `private/functions/flowcontrol/Stop-Function.ps1` | ソース | エラー処理 |
| Write-Message.ps1 | `private/functions/flowcontrol/Write-Message.ps1` | ソース | ログ出力 |
