Contexto de execução para o GitHub Copilot no SQL Server Management Studio

O GitHub Copilot no SQL Server Management Studio (SSMS) executa consultas e comandos no contexto do seu login. Este artigo explica o modelo de execução padrão e como usar bases de dados CONSTITUTION.md para especificar um utilizador específico da base de dados ou login SQL para definir o contexto de execução da base de dados.

Contexto de execução padrão

Todas as consultas que o GitHub Copilot no SSMS gera e executa, tanto no modo Ask como no modo Agente, são executadas no utilizador ou login que usou para se ligar à base de dados.

Note

O modo GitHub Copilot Agent no SQL Server Management Studio (SSMS) está atualmente em pré-visualização.

O Copilot não tem permissões separadas nem acesso elevado. Se o teu utilizador ou login não consegue ler uma tabela, o Copilot também não a consegue ler.

Importante

O sistema de aprovação no modo Agente não é um limite de segurança. Confirma a tua intenção antes de cada ação, mas não restringe o que o Copilot pode fazer para além das permissões já concedidas ao teu login. O limite real de segurança é a aplicação de permissões do SQL Server. Aplique o princípio do privilégio mínimo: conceda aos utilizadores apenas as permissões SELECT, EXECUTE e outras de que necessitem nos objetos específicos a que devem aceder.

Especifique o contexto de execução do GitHub Copilot com CONSTITUTION.md

A base de dados CONSTITUTION.md permite aos proprietários da base de dados especificar um utilizador de base de dados ou login SQL que se aplica a todas as interações GitHub Copilot dessa base de dados tanto para o modo Ask como para o modo Agente. É armazenado como uma propriedade estendida ao nível da base de dados. Tem a precedência mais elevada de todas as instruções dessa base de dados: sobrepõe-se a todas as instruções ao nível do objeto AGENTS.md. Quando configurado, o SSMS utiliza EXECUTE AS para executar consultas geradas por Copilot sob essa conta especificada.

O utilizador SSMS iniciado deve ter permissão IMPERSONATE sobre o utilizador Copilot designado. Sem esta permissão, o Copilot não pode executar consultas e a funcionalidade não funciona para esse utilizador. Este comportamento é intencional: em vez de recorrer silenciosamente às próprias permissões do utilizador (que podem ser demasiado amplas), o sistema aplica o princípio do privilégio mínimo. Os administradores devem conceder IMPERSONATE na conta de execução do Copilot a todos os utilizadores que necessitem de acesso ao Copilot. Também podem usar a ausência dessa subvenção para bloquear o uso do Copilot para utilizadores ou funções específicas.

Para especificar um utilizador de base de dados ou login SQL para GitHub Copilot usar ao executar consultas, adicione a propriedade agentExecuteAsUser à parte inicial YAML do CONSTITUTION.md da base de dados. O agentExecuteAsUser deve ser adicionado aos metadados iniciais do CONSTITUTION.md para que o GitHub Copilot o reconheça.

Propriedade da matéria frontal agentExecuteAsUser

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

A propriedade agentExecuteAsUser aceita ou um nome de utilizador da base de dados ou um nome de login SQL Server. Quando defines esta propriedade, o GitHub Copilot usa a identidade especificada ao executar consultas nessa base de dados.

  • O âmbito de aplicação é para cada base de dados. Cada base de dados pode ter a sua própria CONSTITUTION.md com um valor diferente agentExecuteAsUser .
  • Instruções individuais AGENTS.md ao nível do objeto não podem sobrepor agentExecuteAsUser. O contexto de execução da constituição tem prioridade para toda a base de dados.

Adicionar agentExecuteAsUser à CONSTITUTION.md

Armazene a CONSTITUTION.md instrução como uma propriedade estendida na base de dados usando sp_addextendedproperty. O @name tem de ser CONSTITUTION.md e o @value contém o conteúdo completo da constituição, incluindo o front matter em YAML.

O exemplo seguinte define agentExecuteAsUser para um utilizador de reporte de baixo privilégio (ReportingUser) e acrescenta um padrão de programação:

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.';

O GitHub Copilot lê a constituição de uma base de dados quando um utilizador abre uma sessão do GitHub Copilot para essa base de dados. Neste exemplo, GitHub Copilot usa ReportingUser como contexto de execução para consultas nessa base de dados.

Matéria preliminar com o órgão constitucional

Os metadados iniciais em YAML e o corpo em Markdown coexistem no mesmo valor CONSTITUTION.md. Os elementos preliminares são delimitados pelos marcadores --- no início do conteúdo. Tudo o que aparece após a etiqueta de fecho --- é considerado o corpo da instrução e é aplicado como orientação a todas as interações do 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.';

Utilizador de base de dados versus login SQL

A propriedade agentExecuteAsUser aceita tanto um utilizador da base de dados como um login SQL Server. Use as seguintes orientações para escolher o que é mais adequado para o seu ambiente:

Utilizador da base de dados SQL Login
Scope Específico de uma base de dados Identidade a nível de servidor
Quando utilizar Quando queres definir permissões ao nível da base de dados Quando quiser definir permissões para uma identidade ao nível do servidor
Recommendation Oferece um controlo mais granular Use quando é necessária uma identidade ao nível do servidor

Para a maioria das implementações, especificar um utilizador de base de dados fornece o controlo mais granular. Crie um utilizador dedicado de base de dados de baixo privilégio para o GitHub Copilot e conceda-lhe apenas as permissões necessárias para as interações esperadas com o Copilot nessa base de dados.

Exemplo: criar um utilizador dedicado à base de dados com permissões limitadas

/* 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 */

Em seguida, defina agentExecuteAsUser: GHCP_DB_User em CONSTITUTION.md para a base de dados SalesDB.

Melhores práticas

  • Use uma conta dedicada e de baixo privilégio: Crie um utilizador específico da base de dados ou faça login para GitHub Copilot em vez de reutilizar um utilizador existente. Esta abordagem minimiza o risco de atribuir permissões incorretamente aos utilizadores do GitHub Copilot se o utilizador ou login for usado para outro propósito.

  • Conceda apenas o que for necessário: Reveja os casos de uso típicos de Copilot para a sua base de dados e conceda apenas as permissões necessárias. Comece com acesso apenas de leitura (SELECT) e adicione permissões de modificação deliberadamente.

  • Evite contas altamente privilegiadas: Não defina agentExecuteAsUser para sa, dbo, ou qualquer conta com permissões elevadas, a menos que o caso de uso o exija explicitamente.

  • Audite regularmente: Revise periodicamente as permissões da agentExecuteAsUser conta à medida que a sua base de dados e os requisitos da sua equipa mudam.

  • Lembre-se do limite de execução: Definir agentExecuteAsUser controla que identidade Copilot utiliza, mas a aplicação de permissões da SQL Server é o limite real de segurança. Certifique-se de que a conta especificada tem apenas as permissões mínimas necessárias.

Atualizar ou remover agentExecuteAsUser

Para alterar o agentExecuteAsUser valor ou atualizar outras partes da constituição, utilize sp_updateextendedproperty:

USE SalesDB;

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

---
Updated constitution content here.';

Para remover completamente a CONSTITUTION.md instrução, use sp_dropextendedproperty:

USE SalesDB;

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

Após a remoção, o GitHub Copilot executa consultas sob o login do utilizador ligado, e não se aplica qualquer constituição ao nível da base de dados.

Verificar a constituição atual

Para verificar se uma instrução CONSTITUTION.md está definida para uma base de dados, pergunte Copilot:

Does this database have a constitution set?

Ou consultar diretamente as propriedades estendidas:

USE SalesDB;

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