Contexte d’exécution pour GitHub Copilot dans SQL Server Management Studio

GitHub Copilot dans SQL Server Management Studio (SSMS) exécute des requêtes et des commandes dans le contexte de votre connexion. Cet article explique le modèle d’exécution par défaut et explique comment utiliser les bases de CONSTITUTION.md données pour spécifier un utilisateur de base de données particulier ou une connexion SQL pour définir le contexte d’exécution de la base de données.

Contexte d’exécution par défaut

Toutes les requêtes que GitHub Copilot dans SSMS génère et exécute, aussi bien en mode Ask qu’en mode Agent, s’exécutent avec le compte d’utilisateur ou l’identifiant de connexion que vous avez utilisé pour vous connecter à la base de données.

Note

Le mode Agent de GitHub Copilot dans SQL Server Management Studio (SSMS) est actuellement en préversion.

Copilot n’a pas d’autorisations distinctes et aucun accès élevé. Si votre utilisateur ou votre identifiant de connexion ne peut pas lire une table, Copilot ne peut pas non plus la lire.

Important

Le système d’approbation en mode Agent n’est pas une limite de sécurité. Elle confirme votre intention avant chaque action, mais elle ne limite pas ce que Copilot peut faire au-delà des autorisations déjà accordées à votre connexion. La limite de sécurité réelle est l'application des autorisations de SQL Server. Appliquez le principe du privilège minimum : accordez uniquement aux utilisateurs les SELECTEXECUTEautorisations nécessaires sur les objets spécifiques auxquels ils doivent accéder.

Spécifier le contexte d’exécution de GitHub Copilot avec CONSTITUTION.md

La base de données CONSTITUTION.md permet aux propriétaires de base de données de spécifier un utilisateur de base de données ou une connexion SQL qui s’applique à toutes les interactions GitHub Copilot pour cette base de données pour le mode Demander et Agent. Il est stocké en tant que propriété étendue au niveau de la base de données. Elle a la priorité la plus élevée de n’importe quelle instruction pour cette base de données : elle remplace toutes les instructions au niveau de l’objet AGENTS.md . Lorsqu’il est configuré, SSMS utilise EXECUTE AS pour exécuter des requêtes générées par Copilot sous ce compte spécifié.

L’utilisateur connecté à SSMS doit disposer de l’autorisation IMPERSONATE sur l’utilisateur Copilot désigné. Sans cette autorisation, Copilot ne peut pas exécuter de requêtes et la fonctionnalité ne fonctionne pas pour cet utilisateur. Ce comportement est par conception : plutôt que de revenir silencieusement aux propres autorisations de l’utilisateur (qui peuvent être trop larges), le système applique le principe du privilège minimum. Les administrateurs doivent accorder IMPERSONATE sur le compte d’exécution Copilot à tous les utilisateurs qui ont besoin d’un accès Copilot. Ils peuvent également utiliser l’absence de cette octroi pour bloquer l’utilisation de Copilot pour des utilisateurs ou des rôles spécifiques.

Pour spécifier un utilisateur de base de données ou une connexion SQL pour GitHub Copilot à utiliser lors de l’exécution de requêtes, ajoutez la propriété agentExecuteAsUser à la matière frontale YAML du CONSTITUTION.md de la base de données. La agentExecuteAsUser doit être ajoutée à la matière frontale du CONSTITUTION.md pour qu’elle soit reconnue par GitHub Copilot.

propriété d’en-tête agentExecuteAsUser

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

La propriété agentExecuteAsUser accepte un nom d’utilisateur de base de données ou un nom de connexion SQL Server. Lorsque vous définissez cette propriété, GitHub Copilot utilise l’identité spécifiée lors de l’exécution de requêtes sur cette base de données.

  • L’étendue est par base de données. Chaque base de données peut avoir sa propre CONSTITUTION.md valeur avec une valeur différente agentExecuteAsUser .
  • Les AGENTS.md instructions individuelles au niveau de l’objet ne peuvent pas remplacer agentExecuteAsUser. Le contexte d’exécution de la constitution est prioritaire pour l’ensemble de la base de données.

Ajouter agentExecuteAsUser à CONSTITUTION.md

Stockez l’instruction CONSTITUTION.md en tant que propriété étendue sur la base de données à l’aide de sp_addextendedproperty. Le @name doit être CONSTITUTION.md et le @value contient l’intégralité du contenu de la constitution, y compris l’en-tête YAML.

L’exemple suivant définit agentExecuteAsUser un utilisateur de création de rapports à faible privilège (ReportingUser) et ajoute une norme de codage :

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 lit la constitution d’une base de données lorsqu’un utilisateur ouvre une session GitHub Copilot pour cette base de données. Dans cet exemple, GitHub Copilot utilise ReportingUser comme contexte d’exécution pour les requêtes sur cette base de données.

Pages liminaires avec le corps de la constitution

L’en-tête YAML et le corps Markdown coexistent dans la même valeur CONSTITUTION.md. La partie liminaire est délimitée par les marqueurs --- au début du contenu. Tout ce qui suit la balise fermante --- est considéré comme le corps de l’instruction et sert de directive pour toutes les interactions avec 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.';

Utilisateur de base de données et connexion SQL

La propriété agentExecuteAsUser accepte un utilisateur de base de données ou une connexion SQL Server. Utilisez les conseils suivants pour choisir ce qui convient le mieux à votre environnement :

Utilisateur de base de données Connexion SQL
Étendue Spécifique à une base de données Identité à l’échelle du serveur
Quand utiliser Quand vous souhaitez définir des autorisations au niveau de la base de données Quand vous souhaitez définir des autorisations pour une identité au niveau du serveur
Recommandation Offre un contrôle plus précis Utiliser lorsqu’une identité au niveau du serveur est requise

Pour la plupart des déploiements, la spécification d’un utilisateur de base de données fournit le contrôle le plus précis. Créez un utilisateur de base de données à faible privilège dédié pour GitHub Copilot et accordez-lui uniquement les autorisations nécessaires pour les interactions Copilot attendues dans cette base de données.

Exemple : créer un utilisateur de base de données dédié avec des autorisations limitées

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

Ensuite, définissez agentExecuteAsUser: GHCP_DB_User dans CONSTITUTION.md pour la base de données SalesDB.

Bonnes pratiques

  • Utilisez un compte dédié à faible privilège : créez un utilisateur de base de données spécifique ou connectez-vous pour GitHub Copilot plutôt que de réutiliser un utilisateur existant. Cette approche réduit le risque d’attribution incorrecte d’autorisations aux utilisateurs GitHub Copilot si l’utilisateur ou la connexion est utilisé à un autre usage.

  • Grant uniquement ce qui est nécessaire : passez en revue les cas d’usage typiques Copilot pour votre base de données et accordez uniquement les autorisations requises. Commencez par un accès en lecture seule (SELECT) et ajoutez délibérément des autorisations de modification.

  • Évitez les comptes disposant de privilèges élevés : Ne définissez pas agentExecuteAsUser sur sa, dbo ni sur tout autre compte disposant d’autorisations élevées, sauf si le cas d’utilisation l’exige explicitement.

  • Auditez régulièrement : passez en revue les autorisations du agentExecuteAsUser compte régulièrement à mesure que vos exigences de base de données et d’équipe changent.

  • N’oubliez pas la limite d’exécution : Le paramètre agentExecuteAsUser détermine l’identité utilisée par Copilot, mais l’application des autorisations dans SQL Server constitue la véritable limite de sécurité. Vérifiez que le compte spécifié dispose uniquement des autorisations minimales nécessaires.

Mettre à jour ou supprimer agentExecuteAsUser

Pour modifier la agentExecuteAsUser valeur ou mettre à jour d’autres parties de la constitution, utilisez sp_updateextendedproperty:

USE SalesDB;

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

---
Updated constitution content here.';

Pour supprimer entièrement l’instruction CONSTITUTION.md , utilisez sp_dropextendedproperty:

USE SalesDB;

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

Après la suppression, GitHub Copilot exécute les requêtes avec les identifiants de l’utilisateur connecté, et aucune configuration au niveau de la base de données n’est appliquée.

Vérifier la constitution actuelle

Pour vérifier si une instruction CONSTITUTION.md est définie pour une base de données, demandez Copilot :

Does this database have a constitution set?

Ou interrogez directement les propriétés étendues :

USE SalesDB;

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