SQL Server Management Studio 中 GitHub Copilot 的執行上下文

SQL Server Management Studio(SSMS)中的 GitHub Copilot 會在你的登入情境下執行查詢和指令。 本文說明預設執行模型,以及如何利用資料庫 CONSTITUTION.md 指定特定使用者或 SQL 登入來設定資料庫的執行上下文。

預設執行上下文

GitHub Copilot 在 SSMS 中產生並執行的所有查詢,無論是在詢問模式或代理模式下,都會以你用來連接資料庫的使用者或登入方式執行。

備註

SQL Server Management Studio(SSMS)中的 GitHub Copilot 代理模式目前處於預覽階段。

Copilot 沒有獨立權限,也沒有升階權限。 如果你的使用者或登入者無法讀取表格,Copilot 也無法讀取。

Important

代理模式下的核准系統不是安全邊界。 它會在每個動作前確認你的意圖,但不會限制 Copilot 除了已授權你登入權限外能做的事。 實際的安全邊界是 SQL Server 的權限強制執行。 遵循最小權限原則:僅授予使用者其存取特定物件所需的 SELECTEXECUTE 與其他權限。

使用 CONSTITUTION.md 指定 GitHub Copilot 的執行脈絡

資料庫 CONSTITUTION.md 可讓資料庫擁有者指定一個資料庫使用者或 SQL 登入帳戶,供該資料庫在 Ask 模式和 Agent 模式中的所有 GitHub Copilot 互動使用。 它以擴充屬性的形式儲存在資料庫層級。 它在該資料庫中擁有最高優先順序:它覆蓋所有 AGENTS.md 物件層級指令。 設定後,SSMS 使用 EXECUTE AS 在該指定帳號下執行Copilot產生的查詢。

已登入的 SSMS 使用者必須對指定的 Copilot 使用者具有 IMPERSONATE 權限。 沒有這個權限,Copilot 無法執行查詢,而該功能對該使用者也無法運作。 這是刻意的設計:系統不會悄悄退回使用者自身的權限(這些權限可能過於寬鬆),而是強制執行最小權限原則。 管理員應在 Copilot 執行帳戶上將 IMPERSONATE 授予所有需要 Copilot 存取權限的使用者。 他們也可以利用未授與該權限這一點,封鎖特定使用者或角色使用 Copilot。

若要指定供 GitHub Copilot 在執行查詢時使用的資料庫使用者或 SQL 登入,請將 agentExecuteAsUser 屬性加入資料庫 CONSTITUTION.md 的 YAML 前置資料中。 必須將 agentExecuteAsUser 加入 CONSTITUTION.md 的前置內容中,GitHub Copilot 才能識別。

agentExecuteAsUser 前件屬性

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

agentExecuteAsUser 屬性可接受資料庫使用者名稱或 SQL Server 登入名稱。 當你設定這個屬性時,GitHub Copilot 在對該資料庫執行查詢時會使用指定的身份。

  • 範圍是 依資料庫而定。 每個資料庫都可以有自己的 CONSTITUTION.md,且具有不同的 agentExecuteAsUser 值。
  • 個別 AGENTS.md 物件層級指令 無法 覆寫 agentExecuteAsUser。 憲法的執行上下文對整個資料庫具有優先權。

將 agentExecuteAsUser 加入 CONSTITUTION.md

使用 sp_addextendedpropertyCONSTITUTION.md 指示儲存為資料庫上的擴充屬性。 @name必須為CONSTITUTION.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 登入
範圍 專屬於單一資料庫 伺服器範圍的身份
使用時機 當你想在資料庫層級設定權限時 當您想要設定伺服器層級身分的權限時
Recommendation 提供更細緻的控制 當需要伺服器層級身份時使用

對大多數部署而言,指定資料庫使用者能提供最細緻的控制。 為 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.md 中設定 agentExecuteAsUser: GHCP_DB_User

最佳實務

  • 使用專屬且低權限的帳號:請為 GitHub Copilot 建立專用的資料庫使用者或登入帳號,而非重複使用現有的使用者帳號。 此方法可降低若使用者或登入被用於其他用途,錯誤分配權限給 GitHub Copilot 用戶的風險。

  • 只授予所需的權限:檢視資料庫的典型Copilot使用案例,並只授予所需的權限。 先用唯讀(SELECT)存取,然後刻意增加修改權限。

  • 避免使用高權限帳號:除非使用情境明確要求,否則不要設 agentExecuteAsUsersa、 或 dbo任何擁有高權限的帳號。

  • 定期稽核:隨著資料庫與團隊需求變化,定期檢視帳號權限 agentExecuteAsUser

  • 請記得執行邊界:設定 agentExecuteAsUser 控制Copilot使用的身份,但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';