Konteks eksekusi untuk GitHub Copilot di SQL Server Management Studio

GitHub Copilot di SQL Server Management Studio (SSMS) menjalankan kueri dan perintah di bawah konteks login Anda. Artikel ini menjelaskan model eksekusi default, dan cara menggunakan database CONSTITUTION.md untuk menentukan pengguna database tertentu atau login SQL untuk mengatur konteks eksekusi untuk database.

Konteks eksekusi default

Semua kueri yang dihasilkan dan dijalankan oleh GitHub Copilot di SSMS, baik dalam mode Ask maupun mode Agent, dijalankan menggunakan pengguna atau login yang Anda gunakan untuk terhubung ke database.

Note

Mode Agen GitHub Copilot di SQL Server Management Studio (SSMS) saat ini masih dalam pratinjau.

Copilot tidak memiliki izin terpisah dan tidak ada akses yang ditingkatkan. Jika pengguna atau login Anda tidak dapat membaca tabel, Copilot juga tidak dapat membacanya.

Important

Sistem persetujuan dalam mode Agen bukan batas keamanan. Ini mengonfirmasi niat Anda sebelum setiap tindakan, tetapi tidak membatasi apa yang dapat Copilot lakukan di luar izin yang sudah diberikan untuk login Anda. Batas keamanan aktual adalah penegakan izin SQL Server. Terapkan prinsip hak istimewa paling sedikit: beri pengguna izin SELECT, , EXECUTEdan izin lain yang mereka butuhkan pada objek tertentu yang harus mereka akses.

Tentukan konteks eksekusi GitHub Copilot dengan CONSTITUTION.md

Database CONSTITUTION.md memungkinkan pemilik database menentukan pengguna database atau login SQL yang berlaku untuk semua interaksi GitHub Copilot untuk database tersebut untuk mode Tanya dan Agen. Ini disimpan sebagai properti tambahan pada tingkat basis data. Ini memiliki prioritas tertinggi dari instruksi apa pun untuk database tersebut: ini mengambil alih semua AGENTS.md instruksi tingkat objek. Saat dikonfigurasi, SSMS menggunakan EXECUTE AS untuk menjalankan kueri yang dihasilkan Copilot di bawah akun yang ditentukan.

Pengguna SSMS yang masuk harus memiliki izin IMPERSONATE pada pengguna Copilot yang ditunjuk. Tanpa izin ini, Copilot tidak dapat menjalankan kueri dan fitur tidak berfungsi untuk pengguna tersebut. Perilaku ini memang dirancang demikian: alih-alih diam-diam menggunakan izin milik pengguna sendiri sebagai cadangan (yang mungkin terlalu luas), sistem menerapkan prinsip hak akses seminimal mungkin. Administrator harus memberikan IMPERSONATE pada akun eksekusi Copilot kepada semua pengguna yang memerlukan akses Copilot. Mereka juga dapat menggunakan tidak adanya pemberian tersebut untuk memblokir penggunaan Copilot untuk pengguna atau peran tertentu.

Untuk menentukan pengguna database atau login SQL untuk GitHub Copilot gunakan saat menjalankan kueri, tambahkan properti agentExecuteAsUser ke front matter YAML dari CONSTITUTION.md untuk database. agentExecuteAsUser harus ditambahkan ke materi depan CONSTITUTION.md agar dapat dikenali oleh GitHub Copilot.

properti front matter agentExecuteAsUser

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

Properti agentExecuteAsUser menerima nama pengguna database atau nama login SQL Server. Saat Anda mengatur properti ini, GitHub Copilot menggunakan identitas yang ditentukan saat menjalankan kueri terhadap database tersebut.

  • Cakupannya adalah per-database. Setiap database dapat memilikinya sendiri CONSTITUTION.md dengan nilai yang berbeda agentExecuteAsUser .
  • Instruksi tingkat objek individual AGENTS.mdtidak dapat mengambil alih agentExecuteAsUser. Konteks eksekusi konstitusi diprioritaskan di seluruh basis data.

Menambahkan agentExecuteAsUser ke CONSTITUTION.md

CONSTITUTION.md Simpan instruksi sebagai properti yang diperluas pada database dengan menggunakan sp_addextendedproperty. @name harus berupa CONSTITUTION.md dan @value berisi seluruh konten konstitusi, termasuk front matter YAML.

Pada contoh berikut, agentExecuteAsUser diatur menjadi pengguna pelaporan dengan hak akses rendah (ReportingUser) dan menambahkan standar pengodean:

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 membaca konstitusi untuk database saat pengguna membuka sesi GitHub Copilot untuk database tersebut. Dalam contoh ini, GitHub Copilot menggunakan ReportingUser sebagai konteks eksekusi untuk kueri terhadap database tersebut.

Bagian pendahuluan dengan batang tubuh konstitusi

Front matter YAML dan isi Markdown berada bersama dalam nilai CONSTITUTION.md yang sama. Bagian awal konten ditandai dengan penanda --- di awal konten. Segala sesuatu setelah tag penutup --- diperlakukan sebagai isi instruksi dan digunakan sebagai panduan dalam semua interaksi 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.';

Pengguna database dibandingkan dengan login SQL

Properti agentExecuteAsUser menerima pengguna database atau login SQL Server. Gunakan panduan berikut untuk memilih apa yang paling tepat untuk lingkungan Anda:

Pengguna database Masuk SQL
Cakupan Khusus untuk satu database Identitas di seluruh server
Kapan digunakan Saat Anda ingin mengatur izin di tingkat database Saat Anda ingin mengatur izin untuk identitas tingkat server
Rekomendasi Menawarkan kontrol yang lebih terperinci Gunakan saat identitas tingkat server diperlukan

Untuk sebagian besar penyebaran, menentukan pengguna database menyediakan kontrol yang paling terperinci. Buat pengguna database dengan hak istimewa rendah khusus untuk GitHub Copilot, dan berikan hanya izin yang diperlukan untuk interaksi Copilot yang diharapkan dalam database tersebut.

Contoh: membuat pengguna database khusus dengan izin terbatas

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

Kemudian, atur agentExecuteAsUser: GHCP_DB_User di CONSTITUTION.md untuk basis data SalesDB.

Praktik terbaik

  • Gunakan akun khusus dengan hak istimewa rendah: Membuat pengguna atau login database tertentu untuk GitHub Copilot daripada menggunakan kembali pengguna yang ada. Pendekatan ini meminimalkan risiko salah menetapkan izin kepada pengguna GitHub Copilot jika pengguna atau login digunakan untuk tujuan lain.

  • Berikan hanya akses yang diperlukan: Tinjau kasus penggunaan umum Copilot untuk database Anda dan berikan hanya izin yang diperlukan. Mulai dengan akses baca-saja (SELECT) dan tambahkan izin modifikasi dengan sengaja.

  • Hindari akun yang sangat istimewa: Jangan atur agentExecuteAsUser ke sa, , dboatau akun apa pun dengan izin tinggi kecuali kasus penggunaan secara eksplisit memerlukannya.

  • Lakukan audit secara teratur: Tinjau izin akun agentExecuteAsUser secara berkala seiring perubahan database dan kebutuhan tim Anda.

  • Ingat batas eksekusi: Pengaturan agentExecuteAsUser menentukan identitas yang digunakan Copilot, tetapi penerapan izin SQL Server adalah batas keamanan yang sebenarnya. Pastikan akun yang ditentukan hanya memiliki izin minimum yang diperlukan.

Memperbarui atau menghapus agentExecuteAsUser

Untuk mengubah agentExecuteAsUser nilai atau memperbarui bagian lain dari konstitusi, gunakan sp_updateextendedproperty:

USE SalesDB;

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

---
Updated constitution content here.';

Untuk menghapus CONSTITUTION.md instruksi sepenuhnya, gunakan sp_dropextendedproperty:

USE SalesDB;

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

Setelah penghapusan, GitHub Copilot menjalankan kueri di bawah login pengguna yang terhubung, dan tidak ada konstitusi tingkat database yang berlaku.

Memverifikasi konstitusi saat ini

Untuk memeriksa apakah instruksi CONSTITUTION.md diatur untuk database, tanyakan Copilot:

Does this database have a constitution set?

Atau telusuri properti tambahan secara langsung:

USE SalesDB;

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