Ausführungskontext für GitHub Copilot in SQL Server Management Studio

GitHub Copilot in SQL Server Management Studio (SSMS) führt Abfragen und Befehle im Kontext Ihrer Anmeldung aus. In diesem Artikel werden das Standardausführungsmodell erläutert und die Verwendung von CONSTITUTION.md, mit dem ein bestimmter Datenbankbenutzer oder eine SQL-Anmeldung angegeben wird, um den Ausführungskontext für die Datenbank festzulegen.

Standardausführungskontext

Alle Abfragen, die GitHub Copilot in SSMS sowohl im Fragemodus als auch im Agent-Modus generiert und ausführt, werden unter dem Benutzer oder der Anmeldung ausgeführt, den bzw. die Sie für die Verbindung mit der Datenbank verwendet haben.

Hinweis

Der GitHub Copilot Agentmodus ist derzeit in SQL Server Management Studio (SSMS) als Vorschau verfügbar.

Copilot verfügt über keine separaten Berechtigungen und keinen erweiterten Zugriff. Wenn Ihr Benutzer oder Ihre Anmeldung keine Tabelle lesen kann, kann Copilot sie auch nicht lesen.

Important

Das Genehmigungssystem im Agentmodus ist keine Sicherheitsgrenze. Es bestätigt vor jeder Aktion Ihre Absicht, schränkt jedoch nicht ein, was Copilot über die bereits für Ihre Anmeldung gewährten Berechtigungen hinaus tun kann. Die tatsächliche Sicherheitsgrenze ist die Durchsetzung von Berechtigungen durch SQL Server. Wenden Sie das Prinzip der geringsten Rechte an: Gewähren Sie Benutzern nur die SELECT, EXECUTEund andere Berechtigungen, die sie für die spezifischen Objekte benötigen, auf die sie zugreifen sollten.

Den Ausführungskontext von GitHub Copilot mit CONSTITUTION.md festlegen

Mit der Datenbank CONSTITUTION.md können Datenbankbesitzer einen Datenbankbenutzer oder eine SQL-Anmeldung angeben, die für alle GitHub Copilot Interaktionen für diese Datenbank sowohl für den Abfrage- als auch für den Agent-Modus gilt. Sie wird als erweiterte Eigenschaft auf Datenbankebene gespeichert. Sie hat die höchste Priorität jeder Anweisung für diese Datenbank: Sie überschreibt alle AGENTS.md Anweisungen auf Objektebene. Bei der Konfiguration verwendet SSMS EXECUTE AS, um Copilot generierte Abfragen unter diesem angegebenen Konto auszuführen.

Der angemeldete SSMS-Benutzer muss über IMPERSONATE Berechtigung für den angegebenen Copilot Benutzer verfügen. Ohne diese Berechtigung können Copilot keine Abfragen ausführen, und das Feature funktioniert für diesen Benutzer nicht. Dieses Verhalten ist beabsichtigt: Anstatt im Hintergrund auf die eigenen Berechtigungen des Benutzers zurückzufallen (was möglicherweise übermäßig breit sein kann), erzwingt das System das Prinzip der geringsten Berechtigungen. Administratoren sollten IMPERSONATE für das Copilot Ausführungskonto allen Benutzern gewähren, die Copilot Zugriff benötigen. Sie können auch das Fehlen dieser Gewährung verwenden, um Copilot Nutzung für bestimmte Benutzer oder Rollen zu blockieren.

Um einen Datenbankbenutzer oder eine SQL-Anmeldung für GitHub Copilot anzugeben, die beim Ausführen von Abfragen verwendet werden sollen, fügen Sie die eigenschaft agentExecuteAsUser zur YAML-Front-Materie der CONSTITUTION.md für die Datenbank hinzu. Die agentExecuteAsUser muss dem Vordergrund der CONSTITUTION.md hinzugefügt werden, damit sie von GitHub Copilot erkannt werden kann.

agentExecuteAsUser-Front-Matter-Eigenschaft

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

Die eigenschaft agentExecuteAsUser akzeptiert entweder einen Datenbankbenutzernamen oder einen SQL Server Anmeldenamen. Wenn Sie diese Eigenschaft festlegen, verwendet GitHub Copilot beim Ausführen von Abfragen für diese Datenbank die angegebene Identität.

  • Der Geltungsbereich ist je Datenbank. Jede Datenbank kann ihr eigenes CONSTITUTION.md mit einem anderen agentExecuteAsUser-Wert haben.
  • Anweisungen auf Ebene einzelner AGENTS.md Objekte könnenagentExecuteAsUser nicht außer Kraft setzen. Der Ausführungskontext der Verfassung hat Vorrang für die gesamte Datenbank.

Hinzufügen von agentExecuteAsUser zu CONSTITUTION.md

Speichern Sie die CONSTITUTION.md-Anweisung mithilfe von sp_addextendedproperty als erweiterte Eigenschaft in der Datenbank. Das @name muss CONSTITUTION.md sein, und das @value enthält den vollständigen Inhalt der Verfassung, einschließlich des YAML-Frontmatter.

Das folgende Beispiel setzt agentExecuteAsUser auf einen Reporting-Benutzer mit geringen Berechtigungen (ReportingUser) und fügt einen Codierungsstandard hinzu:

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 liest die Verfassung für eine Datenbank vor, wenn ein Benutzer eine GitHub Copilot Sitzung für diese Datenbank öffnet. In diesem Beispiel verwendet GitHub Copilot ReportingUser als Ausführungskontext für Abfragen für diese Datenbank.

Vorspann mit Hauptteil der Satzung

Das YAML-Frontmatter und der Markdown-Hauptteil befinden sich im selben CONSTITUTION.md-Wert. Der Vorspann ist zu Beginn des Inhalts durch ----Markierungen abgegrenzt. Alles nach dem schließenden --- wird als Anweisungstext behandelt und als Anleitung für alle Copilot Interaktionen angewendet.

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

Datenbankbenutzer im Vergleich zur SQL-Anmeldung

Die eigenschaft agentExecuteAsUser akzeptiert entweder einen Datenbankbenutzer oder eine SQL Server Anmeldung. Verwenden Sie die folgenden Anleitungen, um auszuwählen, was für Ihre Umgebung am besten geeignet ist:

Datenbankbenutzer SQL-Anmeldekonto
Bereich Spezifisch für eine Datenbank Serverweite Identität
Wann verwenden Wenn Sie Berechtigungen auf Datenbankebene festlegen möchten Wenn Sie Berechtigungen für eine Identität auf Serverebene festlegen möchten
Empfehlung Bietet eine präzisere Steuerung Verwenden, wenn eine Identität auf Serverebene erforderlich ist

Für die meisten Bereitstellungen bietet die Angabe eines Datenbankbenutzers die präziseste Kontrolle. Erstellen Sie einen dedizierten Datenbankbenutzer mit niedriger Berechtigung für GitHub Copilot, und erteilen Sie ihm nur die Berechtigungen, die für die erwarteten Copilot Interaktionen in dieser Datenbank erforderlich sind.

Beispiel: Erstellen eines dedizierten Datenbankbenutzers mit eingeschränkten Berechtigungen

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

Legen Sie dann agentExecuteAsUser: GHCP_DB_User in der CONSTITUTION.md für die SalesDB-Datenbank fest.

Bewährte Methoden

  • Verwenden Sie ein dediziertes Konto mit geringen Berechtigungen: Erstellen Sie einen speziellen Datenbankbenutzer oder eine spezielle Anmeldung für GitHub Copilot, anstatt einen vorhandenen Benutzer wiederzuverwenden. Bei diesem Ansatz wird das Risiko minimiert, dass Benutzern berechtigungen falsch GitHub Copilot zugewiesen werden, wenn der Benutzer oder die Anmeldung für einen anderen Zweck verwendet wird.

  • Grant nur was erforderlich ist: Überprüfen Sie die typischen Copilot Anwendungsfälle für Ihre Datenbank, und erteilen Sie nur die erforderlichen Berechtigungen. Beginnen Sie mit schreibgeschütztem (SELECT) Zugriff und fügen Sie gezielt Änderungsberechtigungen hinzu.

  • Vermeiden Sie hoch privilegierte Konten: Legen Sie für agentExecuteAsUser nicht sa, dbo oder ein Konto mit hohen Berechtigungen fest, es sei denn, der Anwendungsfall erfordert dies ausdrücklich.

  • Regelmäßig überwachen: Überprüfen Sie die Berechtigungen des agentExecuteAsUser Kontos regelmäßig, wenn sich Ihre Datenbank- und Teamanforderungen ändern.

  • Beachten Sie die Ausführungsgrenze: Das Festlegen von agentExecuteAsUser steuert, welche Identität Copilot verwendet, aber die Berechtigungsdurchsetzung von SQL Server ist die eigentliche Sicherheitsgrenze. Stellen Sie sicher, dass das angegebene Konto nur über die erforderlichen Mindestberechtigungen verfügt.

Aktualisieren oder Entfernen von agentExecuteAsUser

Um den agentExecuteAsUser Wert zu ändern oder andere Teile der Verfassung zu aktualisieren, verwenden Sie sp_updateextendedpropertyFolgendes:

USE SalesDB;

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

---
Updated constitution content here.';

Um die CONSTITUTION.md Anweisung vollständig zu entfernen, verwenden Sie Folgendes sp_dropextendedproperty:

USE SalesDB;

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

Nach dem Entfernen führt GitHub Copilot Abfragen unter der Anmeldung des verbundenen Benutzers aus, und es gilt keine Verfassung auf Datenbankebene.

Überprüfen der aktuellen Verfassung

Um zu überprüfen, ob eine CONSTITUTION.md-Anweisung für eine Datenbank festgelegt ist, fragen Sie Copilot:

Does this database have a constitution set?

Oder fragen Sie die erweiterten Eigenschaften direkt ab:

USE SalesDB;

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