# 通知設計書 112-権限チェック

## 概要

本ドキュメントは、sp_Blitzストアドプロシージャにおいて、ユーザーがsysadmin権限を持っていない場合に権限チェックを開始することを通知するデバッグメッセージの設計を定義します。

### 本通知の処理概要

sp_Blitz実行時に、実行ユーザーがsysadminロールのメンバーでない場合、代替の権限チェック処理を開始することをデバッグメッセージとして通知します。

**業務上の目的・背景**：SQL Serverのヘルスチェックを行うsp_Blitzは、多くのシステム情報にアクセスするため、通常sysadmin権限で実行されることが想定されています。しかし、セキュリティポリシーによりsysadmin権限を付与できない環境では、VIEW SERVER STATE等の限定された権限でも一部の機能を利用可能です。この通知は、デバッグモードにおいて権限確認プロセスの開始をDBAに伝え、権限不足による動作制限の原因を特定しやすくします。

**通知の送信タイミング**：sp_Blitz実行開始後、IS_SRVROLEMEMBER('sysadmin')の評価結果が0（非sysadmin）である場合に送信されます。これはsp_Blitzの初期化フェーズで発生します。

**通知の受信者**：sp_Blitzを@Debug = 1または@Debug = 2で実行しているデータベース管理者がSSMS（SQL Server Management Studio）のメッセージタブで受信します。

**通知内容の概要**：「User not SA, checking permissions」というメッセージで、sysadminではないユーザーの権限を確認する処理が開始されたことを伝えます。

**期待されるアクション**：デバッグ目的の通知であり、通常は特別なアクションは不要です。ただし、期待した機能が動作しない場合、この通知を手がかりに権限不足の可能性を検討できます。

## 通知種別

コンソール出力（RAISERROR WITH NOWAIT）- デバッグモード専用

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（RAISERROR WITH NOWAIT） |
| 優先度 | 低（デバッグ情報） |
| リトライ | なし |

### 送信先決定ロジック

sp_Blitzを@Debug IN (1, 2)で実行しているクライアントセッションに対して、RAISERRORによるメッセージ出力として送信されます。@Debug = 0の場合、このメッセージは出力されません。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| メッセージ形式 | RAISERROR |
| 重大度 | 0（情報メッセージ） |
| 状態 | 1 |

### 本文テンプレート

```
User not SA, checking permissions
```

### 添付ファイル

なし

## テンプレート変数

なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sysadminチェック失敗 | @Debug IN (1, 2) AND IS_SRVROLEMEMBER('sysadmin') = 0 | デバッグモードかつ非sysadminユーザー |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @Debug = 0 | デバッグモードが無効の場合 |
| IS_SRVROLEMEMBER('sysadmin') = 1 | sysadminロールメンバーの場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_Blitz実行] --> B{IS_SRVROLEMEMBER sysadmin}
    B -->|= 1| C[sysadminとして処理続行]
    B -->|= 0 or NULL| D{@Debug IN 1,2?}
    D -->|Yes| E[RAISERROR User not SA, checking permissions]
    D -->|No| F[権限チェック処理へ]
    E --> F
    F --> G{VIEW SERVER STATE権限?}
    G -->|あり| H[制限付きで処理続行]
    G -->|なし| I[エラー終了]
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.fn_my_permissions | ユーザー権限の確認 | VIEW SERVER STATE等 |

### テーブル別参照項目詳細

#### sys.fn_my_permissions

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| permission_name | 権限確認 | N'VIEW SERVER STATE', N'ALTER TRACE'等 |

### 更新テーブル一覧

なし（読み取り専用処理）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 権限不足 | VIEW SERVER STATE権限なし | エラーメッセージを出力して処理終了 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

なし

### 配信時間帯

制限なし

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

- デバッグ情報であるため、実運用環境での使用には注意が必要です
- 権限情報の詳細は含まれていませんが、権限確認プロセスの存在を示します
- @Debugパラメータを1または2に設定した場合のみ出力されます

## 備考

- この通知後、@sa変数が0に設定され、DBCC COMMANDS等のsysadmin専用機能がスキップされます
- 続いてVIEW SERVER STATE、ALTER TRACE、xp_fixeddrives、xp_cmdshell等の個別権限チェックが行われます
- 必要な権限がない場合、対応する機能がスキップされる設計になっています

---

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

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

### 推奨読解順序

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

権限チェック関連の変数を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_Blitz.sql | `sp_Blitz.sql` | @sa変数、@SkipTrace変数等の宣言箇所 |

**読解のコツ**: T-SQLのストアドプロシージャでは、DECLARE文でローカル変数を宣言します。@saはsysadmin権限の有無を示すフラグです。

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

権限チェック処理の開始部分を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz.sql | `sp_Blitz.sql` | IS_SRVROLEMEMBER('sysadmin')のチェック部分 |

**主要処理フロー**:
1. **行265-269**: IS_SRVROLEMEMBER('sysadmin')の評価
2. **行271**: RAISERROR('User not SA, checking permissions', 0, 1)
3. **行273**: @sa = 0の設定

#### Step 3: 個別権限チェックを理解する

sysadminでない場合の代替権限チェック処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_Blitz.sql | `sp_Blitz.sql` | fn_my_permissionsを使用した権限チェック処理 |

**主要処理フロー**:
- **行275-285**: VIEW SERVER STATE権限チェック（必須）
- **行287-296**: ALTER TRACE権限チェック（オプショナル）
- **行298-307**: xp_fixeddrives実行権限チェック
- **行309-314**: xp_cmdshell実行権限チェック

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

```
sp_Blitz
    |
    +-- IS_SRVROLEMEMBER('sysadmin') 評価
            |
            +-- (= 0 or NULL)
                    |
                    +-- RAISERROR('User not SA, checking permissions')
                    |
                    +-- SET @sa = 0
                    |
                    +-- VIEW SERVER STATE チェック
                    |       |
                    |       +-- (なし) RAISERROR & RETURN
                    |
                    +-- ALTER TRACE チェック
                    |       |
                    |       +-- (なし) @SkipTrace = 1
                    |
                    +-- xp_fixeddrives 権限チェック
                    |       |
                    |       +-- (なし) @SkipXPFixedDrives = 1
                    |
                    +-- xp_cmdshell 権限チェック
                            |
                            +-- (なし) @SkipXPCmdShell = 1
```

### データフロー図

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

IS_SRVROLEMEMBER結果 --> 権限評価 --> @sa (0 or 1)

@Debug                --> 条件分岐 --> RAISERRORメッセージ

fn_my_permissions    --> 権限チェック --> @SkipTrace
                                       --> @SkipXPFixedDrives
                                       --> @SkipXPCmdShell
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | 本通知を発行するストアドプロシージャ |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | sp_Blitzを含むインストールスクリプト |
