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

GitHub Copilot no SSMS (SQL Server Management Studio) executa consultas e comandos no contexto do logon. Este artigo explica o modelo de execução padrão e como usar o CONSTITUTION.md de um banco de dados para especificar um usuário específico do banco de dados ou um login SQL específico para definir o contexto de execução do banco de dados.

Contexto de execução padrão

Todas as consultas que o GitHub Copilot no SSMS gera e executa, tanto no modo Ask quanto no modo Agent, são executadas com o usuário ou login que você usou para se conectar ao banco de dados.

Observação

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

Copilot não tem permissões separadas nem acesso elevado. Se o usuário ou login não puder ler uma tabela, o Copilot também não poderá lê-la.

Importante

O sistema de aprovação no modo Agent não é um limite de segurança. Ele confirma sua intenção antes de cada ação, mas não restringe o que o Copilot pode fazer além das permissões já concedidas à sua conta. O limite de segurança real é a imposição de permissão do SQL Server. Aplique o princípio do menor privilégio: conceda aos usuários apenas as permissões SELECT, EXECUTE e outras permissões necessárias nos objetos específicos aos quais devem ter acesso.

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

O banco de dados CONSTITUTION.md permite que os proprietários do banco de dados especifiquem um usuário de banco de dados ou login SQL aplicável a todas as interações do GitHub Copilot para esse banco de dados, nos modos Ask e Agent. Ela é armazenada como uma propriedade estendida no nível do banco de dados. Ele tem a precedência mais alta de qualquer instrução para esse banco de dados: ele substitui todas as AGENTS.md instruções no nível do objeto. Quando configurado, o SSMS usa EXECUTE AS para executar consultas geradas por Copilot nessa conta especificada.

O usuário conectado ao SSMS deve ter a permissão IMPERSONATE para o usuário Copilot designado. Sem essa permissão, Copilot não podem executar consultas e o recurso não funciona para esse usuário. Esse comportamento é por design: em vez de recuar silenciosamente para as próprias permissões do usuário (que podem ser excessivamente amplas), o sistema impõe o princípio de privilégios mínimos. Os administradores devem conceder IMPERSONATE na conta de execução do Copilot a todos os usuários que precisam de acesso ao Copilot. Eles também podem usar a ausência dessa concessão para bloquear o uso de Copilot para usuários ou funções específicas.

Para especificar um usuário do banco de dados ou login do SQL para o GitHub Copilot usar ao executar consultas, adicione a propriedade agentExecuteAsUser ao front matter YAML do CONSTITUTION.md do banco de dados. O agentExecuteAsUser deve ser adicionado aos metadados iniciais do CONSTITUTION.md para que isso seja reconhecido pelo GitHub Copilot.

Propriedade de matéria frontal agentExecuteAsUser

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

A propriedade agentExecuteAsUser aceita um nome de usuário de banco de dados ou um nome de logon SQL Server. Quando você define essa propriedade, GitHub Copilot usa a identidade especificada ao executar consultas nesse banco de dados.

  • O escopo é por banco de dados. Cada banco de dados pode ter o seu próprio CONSTITUTION.md com um valor diferente agentExecuteAsUser .
  • Instruções individuais AGENTS.md no nível do objeto não podem substituir agentExecuteAsUser. O contexto de execução da Constituição tem precedência para todo o banco de dados.

Adicionar agentExecuteAsUser ao CONSTITUTION.md

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

O exemplo a seguir define agentExecuteAsUser como um usuário de relatório de baixo privilégio (ReportingUser) e adiciona um padrão de codificaçã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.';

GitHub Copilot lê a constituição de um banco de dados quando um usuário abre uma sessão de GitHub Copilot para esse banco de dados. Neste exemplo, GitHub Copilot usa ReportingUser como o contexto de execução para consultas nesse banco de dados.

Elementos pré-textuais com corpo da constituição

Os metadados YAML e o corpo em Markdown coexistem no mesmo valor CONSTITUTION.md. Os elementos pré-textuais são delimitados pelos marcadores --- no início do conteúdo. Tudo após a tag de fechamento --- é considerado o corpo da instrução e serve como diretriz para todas as interações com o 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.';

Usuário de banco de dados versus login SQL

A propriedade agentExecuteAsUser aceita um usuário de banco de dados ou um logon do SQL Server. Use as diretrizes a seguir para escolher o que é mais apropriado para seu ambiente:

Usuário de banco de dados Logon do SQL
Âmbito Específico para um banco de dados Identidade de todo o servidor
Quando usar Quando você deseja definir permissões no nível do banco de dados Quando você deseja definir permissões para uma identidade no nível do servidor
Recommendation Oferece controle mais granular Usar quando uma identidade no nível do servidor for necessária

Para a maioria das implantações, especificar um usuário de banco de dados fornece o controle mais granular. Crie um usuário dedicado de banco de dados de baixo privilégio para GitHub Copilot e conceda a ele apenas as permissões necessárias para as interações Copilot esperadas nesse banco de dados.

Exemplo: criar um usuário de banco de dados dedicado 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 o banco de dados SalesDB.

Práticas recomendadas

  • Use uma conta dedicada e de baixo privilégio: crie um usuário de banco de dados específico ou faça logon para GitHub Copilot em vez de reutilizar um usuário existente. Essa abordagem minimiza o risco de atribuir permissões incorretas a usuários do GitHub Copilot caso o usuário ou nome de usuário seja usado para outra finalidade.

  • Conceda apenas o necessário: analise os casos de uso típicos do Copilot para o seu banco de dados e conceda apenas as permissões necessárias. Comece com acesso somente leitura (SELECT) e adicione permissões de modificação deliberadamente.

  • Evite contas altamente privilegiadas: não defina agentExecuteAsUser como sa, dboou qualquer conta com permissões altas, a menos que o caso de uso exija explicitamente.

  • Audite regularmente: revise periodicamente as permissões da conta agentExecuteAsUser, à medida que os requisitos do seu banco de dados e da sua equipe mudarem.

  • Embrar o limite de execução: a configuração agentExecuteAsUser controla qual identidade Copilot usa, mas a imposição de permissão do SQL Server é o limite de segurança real. Verifique se 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, use sp_updateextendedproperty:

USE SalesDB;

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

---
Updated constitution content here.';

Para remover totalmente 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 usando as credenciais do usuário conectado, e não se aplica nenhuma configuração no nível do banco de dados.

Verificar a constituição atual

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

Does this database have a constitution set?

Ou consulte as propriedades estendidas diretamente:

USE SalesDB;

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