SQL Server Management StudioでのGitHub Copilotの実行コンテキスト

SQL Server Management Studio (SSMS) のGitHub Copilotは、ログインのコンテキストでクエリとコマンドを実行します。 この記事では、既定の実行モデルと、データベースの CONSTITUTION.md を使用して特定のデータベース ユーザーまたは SQL ログインを指定し、データベースの実行コンテキストを設定する方法について説明します。

既定の実行コンテキスト

SSMS の GitHub Copilot が Ask モードと Agent モードの両方で生成して実行するすべてのクエリは、データベースへの接続時に使用したユーザーまたはログインとして実行されます。

SQL Server Management Studio (SSMS) のGitHub Copilot エージェント モードは現在プレビュー段階です。

Copilotには個別のアクセス許可がなく、昇格されたアクセス権もありません。 ユーザーまたはログインがテーブルを読み取ることができない場合、Copilotもテーブルを読み取ることはできません。

Important

エージェント モードの承認システムはセキュリティ境界ではありません。 各アクションの前に意図が確認されますが、ログインに既に付与されているアクセス許可を超えて実行できるCopilotは制限されません。 実際のセキュリティ境界は、SQL Serverのアクセス許可の適用です。 最小特権の原則を適用します。アクセスする必要がある特定のオブジェクトに対して必要な SELECTEXECUTE、およびその他のアクセス許可のみをユーザーに付与します。

CONSTITUTION.md GitHub Copilot実行コンテキストを指定する

データベース CONSTITUTION.mdを使用すると、データベース所有者は、Ask モードと Agent モードの両方について、そのデータベースのすべてのGitHub Copilot操作に適用されるデータベース ユーザーまたは SQL ログインを指定できます。 これは、データベース レベルで拡張プロパティとして格納されます。 そのデータベースに対するすべての命令の中で最も優先され、すべての AGENTS.md オブジェクト レベルの命令よりも優先されます。 構成すると、SSMS は EXECUTE AS を使用して、指定されたアカウントでCopilot生成されたクエリを実行します。

サインインしている SSMS ユーザーには、指定されたCopilot ユーザーに対する IMPERSONATE アクセス許可が必要です。 このアクセス許可がないと、Copilotはクエリを実行できません。この機能は、そのユーザーに対して機能しません。 この動作は意図された仕様です。つまり、ユーザー自身の権限(過度に広い可能性があります)に暗黙的にフォールバックするのではなく、システムは最小権限の原則を徹底します。 管理者は、Copilot実行アカウントの IMPERSONATE を、Copilotアクセスが必要なすべてのユーザーに付与する必要があります。 また、その許可がない場合は、特定のユーザーまたはロールのCopilot使用をブロックすることもできます。

クエリの実行時に使用するGitHub Copilotのデータベース ユーザーまたは SQL ログインを指定するには、agentExecuteAsUser プロパティをデータベースの CONSTITUTION.md の YAML フロント に追加します。 GitHub Copilotで認識するには、agentExecuteAsUserCONSTITUTION.md の前面に追加する必要があります。

agentExecuteAsUser フロント マター プロパティ

---
agentExecuteAsUser: <database user or SQL login>
---

agentExecuteAsUser プロパティは、データベース ユーザー名またはSQL Serverログイン名を受け入れます。 このプロパティを設定すると、GitHub Copilotは、そのデータベースに対してクエリを実行するときに、指定した ID を使用します。

  • スコープは データベースごとです。 各データベースは、異なるCONSTITUTION.md値を持つ独自のagentExecuteAsUserを持つことができます。
  • 個々のAGENTS.mdオブジェクト レベルの命令は、agentExecuteAsUserをオーバーライドできません。 構成の実行コンテキストは、データベース全体に対して優先されます。

agentExecuteAsUser を CONSTITUTION.md に追加する

CONSTITUTION.mdを使用して、sp_addextendedproperty命令をデータベースの拡張プロパティとして格納します。 @nameCONSTITUTION.mdする必要があり、@valueには YAML フロント マターを含む完全な構成コンテンツが含まれています。

次の例では、 agentExecuteAsUser を低い特権のレポート ユーザー (ReportingUser) に設定し、コーディング標準を追加します。

USE SalesDB;

EXECUTE sp_addextendedproperty
    @name = N'CONSTITUTION.md',
    @value = N'---
agentExecuteAsUser: ReportingUser

---
Any T-SQL generated for this database must comply with organizational standards.
Queries must not use SELECT *. Always use explicit column lists.
Avoid queries that modify data unless explicitly requested by the user.';

GitHub Copilotは、ユーザーがそのデータベースのGitHub Copilot セッションを開いたときに、データベースの構成を読み取ります。 この例では、GitHub Copilotはそのデータベースに対するクエリの実行コンテキストとして ReportingUser を使用します。

構成本体付フロントマター

YAML フロント マターと Markdown 本文は、同じ CONSTITUTION.md 値で共存します。 フロントマターは、コンテンツの開始時に --- マーカーで区切られます。 終了---の後のすべてが命令本体として扱われ、すべてのCopilot操作のガイダンスとして適用されます。

USE SalesDB;

EXECUTE sp_addextendedproperty
    @name = N'CONSTITUTION.md',
    @value = N'---
agentExecuteAsUser: GHCP_DB_User

---
## Database Constitution: SalesDB

This database stores customer orders, product catalog, and revenue data.

### Coding standards
- Always use explicit column lists. Do not use SELECT *.
- Use schema-qualified object names (e.g., Sales.Orders, not Orders).
- Wrap multi-statement scripts in a transaction with TRY/CATCH error handling.

### Restricted operations
- Do not generate TRUNCATE TABLE statements.
- Do not generate DROP statements without an existence check.
- Revenue calculations must use SUM(NetAmount) from Sales.Transactions, excluding rows where RefundFlag = 1.';

データベース ユーザーと SQL ログイン

agentExecuteAsUser プロパティは、データベース ユーザーまたはSQL Server ログインを受け入れます。 次のガイダンスを使用して、環境に最も適したものを選択します。

データベース ユーザー SQL ログイン
Scope 1 つのデータベースに固有 サーバー全体の ID
いつ使用するか データベース レベルで権限を設定する場合 サーバー レベルの ID のアクセス許可を設定する場合
推奨事項 より詳細な制御を提供します サーバー レベルの ID が必要な場合に使用する

ほとんどのデプロイでは、データベース ユーザーを指定すると、最も細かい制御が提供されます。 GitHub Copilot専用の低特権データベース ユーザーを作成し、そのデータベースで予想されるCopilot操作に必要なアクセス許可のみを付与します。

例: アクセス許可が制限された専用データベース ユーザーを作成する

/* Create a database user that is not mapped to a SQL login */
USE SalesDB;

CREATE USER GHCP_DB_User WITHOUT LOGIN;

/* Grant only the permissions Copilot needs */
GRANT SELECT ON SCHEMA::Sales TO GHCP_DB_User;
GRANT SELECT ON SCHEMA::Reporting TO GHCP_DB_User;
GRANT EXECUTE ON SCHEMA::Sales TO GHCP_DB_User;

/* Do not grant DDL permissions unless schema modification is expected */

次に、SalesDB データベースの CONSTITUTION.mdagentExecuteAsUser: GHCP_DB_User を設定します。

ベスト プラクティス

  • 専用の低特権アカウントを使用する: 既存のユーザーを再利用するのではなく、GitHub Copilot用に特定のデータベース ユーザーまたはログインを作成します。 この方法により、ユーザーまたはログインが別の目的で使用される場合に、GitHub Copilotユーザーにアクセス許可が誤って割り当てられるリスクが最小限に抑えられます。

  • 必要なもののみが表示されます: データベースの一般的なCopilotユース ケースを確認し、必要なアクセス許可のみを付与します。 読み取り専用 (SELECT) アクセスから開始し、意図的に変更アクセス許可を追加します。

  • 高い特権を持つアカウントを避ける: ユース ケースで明示的に要求されない限り、 agentExecuteAsUsersadbo、または高いアクセス許可を持つアカウントに設定しないでください。

  • 定期的に監査する: データベースとチームの要件の変化に応じて、 agentExecuteAsUser アカウントのアクセス許可を定期的に確認します。

  • 実行境界を覚えておいてください: agentExecuteAsUser の設定によって Copilot がどの ID を使用するかが決まりますが、実際のセキュリティ境界は SQL Server によるアクセス許可の適用です。 指定したアカウントに必要な最小限のアクセス許可のみを持っていることを確認します。

agentExecuteAsUser の更新または削除

agentExecuteAsUser値を変更したり、構成の他の部分を更新したりするには、次のsp_updateextendedpropertyを使用します。

USE SalesDB;

EXECUTE sp_updateextendedproperty
    @name = N'CONSTITUTION.md',
    @value = N'---
agentExecuteAsUser: New_GHCP_User

---
Updated constitution content here.';

CONSTITUTION.md命令を完全に削除するには、sp_dropextendedpropertyを使用します。

USE SalesDB;

EXECUTE sp_dropextendedproperty @name = N'CONSTITUTION.md';

削除後、GitHub Copilot接続されたユーザーのログインでクエリが実行され、データベース レベルの構成は適用されません。

現在の構成を確認する

データベースに CONSTITUTION.md 指示が設定されているかどうかを確認するには、Copilot に次のように質問します:

Does this database have a constitution set?

または、拡張プロパティに直接クエリを実行します。

USE SalesDB;

SELECT name,
       CAST (value AS NVARCHAR (MAX)) AS ConstitutionContent
FROM sys.extended_properties
WHERE class = 0
      AND name = N'CONSTITUTION.md';