SQL Server Management Studio(SSMS)中的GitHub Copilot在登录上下文下执行查询和命令。 本文介绍默认执行模型,以及如何使用数据库 CONSTITUTION.md 指定特定的数据库用户或 SQL 登录名来设置数据库的执行上下文。
默认执行上下文
SSMS 中的 GitHub Copilot 在 Ask 模式和 Agent 模式下生成并执行的所有查询,均以你用于连接到数据库的用户或登录名身份运行。
Note
GitHub Copilot 在 SQL Server Management Studio(SSMS)中的代理模式当前处于预览阶段。
Copilot没有单独的权限,也没有提升的访问权限。 如果您的用户或登录账户无法读取表中的数据,Copilot 也同样无法读取。
Important
代理模式下的审批系统不是安全边界。 它会在每个操作之前确认你的意图,但它不会限制Copilot可以执行的操作超出已授予登录名的权限。 实际的安全边界是 SQL Server 的权限强制执行。 遵循最小权限原则:仅向用户授予其访问特定对象所需的 SELECT、EXECUTE 及其他权限。
使用 CONSTITUTION.md 指定GitHub Copilot执行上下文
通过数据库 CONSTITUTION.md,数据库所有者可以指定一个数据库用户或 SQL 登录,用于该数据库中所有 GitHub Copilot 交互,并同时适用于 Ask 和 Agent 模式。 它以数据库级扩展属性的形式存储。 它具有该数据库的任何指令的最高优先级:它覆盖所有 AGENTS.md 对象级指令。 配置后,SSMS 使用 EXECUTE AS在该指定帐户下运行Copilot生成的查询。
已登录 SSMS 用户必须对指定的Copilot用户具有 IMPERSONATE 权限。 如果没有此权限,Copilot无法执行查询,并且该功能不适用于该用户。 此行为是设计造成的:系统不以无提示方式回退到用户自己的权限(可能过于广泛),而是强制实施最低权限原则。 管理员应向所有需要 Copilot 访问权限的用户授予 Copilot 执行帐户上的 IMPERSONATE。 他们还可以利用缺少该授权这一点,来阻止特定用户或角色使用 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
使用 CONSTITUTION.md.. 将sp_addextendedproperty指令存储为数据库上的扩展属性。
@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 */
然后在 CONSTITUTION.md 中为 SalesDB 数据库设置 agentExecuteAsUser: GHCP_DB_User。
最佳做法
使用专用的低特权帐户:为GitHub Copilot创建特定数据库用户或登录名,而不是重用现有用户。 如果 user 或登录名被用于其他用途,这种方法可将向 GitHub Copilot 用户错误分配权限的风险降至最低。
仅授予所需权限:查看数据库的 Copilot 典型使用场景,并且仅授予所需的权限。 从只读(
SELECT)访问权限开始,再审慎地添加修改权限。避免使用高权限账户:请勿将
agentExecuteAsUser设置为sa、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';