Bagikan melalui


Objek SqlContext

Berlaku untuk:SQL Server

Anda memanggil kode terkelola di server saat memanggil prosedur atau fungsi, saat Anda memanggil metode pada jenis yang ditentukan pengguna runtime bahasa umum (CLR), atau ketika tindakan Anda mengaktifkan pemicu yang ditentukan dalam salah satu bahasa .NET Framework. Karena eksekusi kode ini diminta sebagai bagian dari koneksi pengguna, akses ke konteks pemanggil dari kode yang berjalan di server diperlukan. Selain itu, operasi akses data tertentu mungkin hanya valid jika dijalankan di bawah konteks pemanggil. Misalnya, akses ke tabel pseudo yang disisipkan dan dihapus yang digunakan dalam operasi pemicu hanya valid di bawah konteks pemanggil.

Konteks pemanggil diabstraksi dalam objek SqlContext. Untuk informasi selengkapnya, lihat Microsoft.SqlServer.Server.SqlContext.

SqlContext menyediakan akses ke komponen berikut.

Komponen Deskripsi
SqlPipe Objek ini mewakili pipa di mana hasil mengalir ke klien. Untuk informasi selengkapnya, lihat objek SqlPipe.
SqlTriggerContext Objek ini hanya dapat diambil dari dalam pemicu CLR. Ini menyediakan informasi tentang operasi yang menyebabkan pemicu diaktifkan dan peta kolom yang diperbarui. Untuk informasi selengkapnya, lihat objek SqlTriggerContext.
IsAvailable Properti ini digunakan untuk menentukan ketersediaan konteks.
WindowsIdentity Properti ini digunakan untuk mengambil identitas Windows pemanggil.

Menentukan ketersediaan konteks

Kueri kelas SqlContext untuk melihat apakah kode yang sedang dijalankan sedang berjalan dalam proses, dengan memeriksa properti IsAvailable objek SqlContext. Properti IsAvailable bersifat baca-saja, dan mengembalikan True jika kode panggilan berjalan di dalam SQL Server dan jika anggota SqlContext lainnya dapat diakses. Jika properti IsAvailable mengembalikan False, semua anggota SqlContext lainnya melemparkan InvalidOperationException, jika digunakan. Jika IsAvailable mengembalikan False, setiap upaya untuk membuka objek koneksi yang memiliki "koneksi konteks=true" dalam string koneksi gagal.

Mengambil identitas Windows

Kode CLR yang dijalankan di dalam SQL Server selalu dipanggil dalam konteks akun proses. Jika kode harus melakukan tindakan tertentu menggunakan identitas pengguna panggilan, alih-alih identitas proses SQL Server, maka token peniruan harus diperoleh melalui properti WindowsIdentity objek SqlContext. Properti WindowsIdentity mengembalikan instans WindowsIdentity yang mewakili identitas Windows pemanggil, atau null jika klien diautentikasi menggunakan Autentikasi SQL Server. Hanya rakitan yang ditandai dengan izin EXTERNAL_ACCESS atau UNSAFE yang dapat mengakses properti ini.

Setelah mereka mendapatkan objek WindowsIdentity, penelepon dapat meniru akun klien dan melakukan tindakan atas nama mereka.

Identitas pemanggil hanya tersedia melalui SqlContext.WindowsIdentity jika klien yang memulai eksekusi prosedur tersimpan atau fungsi yang terhubung ke server menggunakan Autentikasi Windows. Jika Autentikasi SQL Server digunakan sebagai gantinya, properti ini null dan kode tidak dapat meniru pemanggil.

Contoh

Contoh berikut menunjukkan cara mendapatkan identitas Windows dari klien panggilan dan meniru klien.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void WindowsIDTestProc()
{
    WindowsIdentity clientId = null;
    WindowsImpersonationContext impersonatedUser = null;

    // Get the client ID.
    clientId = SqlContext.WindowsIdentity;

    // This outer try block is used to thwart exception filter
    // attacks which would prevent the inner finally
    // block from executing and resetting the impersonation.
    try
    {
        try
        {
            impersonatedUser = clientId.Impersonate();
            if (impersonatedUser != null)
            {
                // Perform some action using impersonation.
            }
        }
        finally
        {
            // Undo impersonation.
            if (impersonatedUser != null)
                impersonatedUser.Undo();
        }
    }
    catch
    {
        throw;
    }
}