Bagikan melalui


SqlContext Object

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 Microsoft .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 tentang metode dan properti SqlTriggerContext , lihat dokumentasi referensi kelas Microsoft.SqlServer.Server.SqlTriggerContext di .NET Framework SDK.

SqlContext menyediakan akses ke komponen berikut:

  • SqlPipe: Objek SqlPipe mewakili "pipa" di mana hasil mengalir ke klien. Untuk informasi selengkapnya tentang objek SqlPipe , lihat Objek SqlPipe.

  • SqlTriggerContext: Objek SqlTriggerContext hanya dapat diambil dari dalam pemicu CLR. Ini menyediakan informasi tentang operasi yang menyebabkan pemicu diaktifkan dan peta kolom yang diperbarui. Untuk informasi selengkapnya tentang objek SqlTriggerContext , lihat Objek SqlTriggerContext.

  • IsAvailable: Properti IsAvailable digunakan untuk menentukan ketersediaan konteks.

  • WindowsIdentity: Properti WindowsIdentity digunakan untuk mengambil identitas Windows pemanggil.

Menentukan Ketersediaan Konteks

Kueri kelas SqlContext untuk melihat apakah kode yang sedang dijalankan sedang berjalan dalam proses. Untuk melakukan ini, periksa properti IsAvailable dari 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 melempar InvalidOperationException, jika digunakan. Jika IsAvailable mengembalikan False, setiap upaya untuk membuka objek koneksi yang memiliki "context connection=true" di 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 Microsoft Windows pemanggil, atau null jika klien diautentikasi menggunakan Autentikasi SQL Server. Hanya rakitan yang ditandai dengan izin EXTERNAL_ACCESS atau TIDAK AMAN yang dapat mengakses properti ini.

Setelah 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.

C#

[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;  
    }  
}  

Visual Basic

<Microsoft.SqlServer.Server.SqlProcedure()> _  
Public Shared Sub  WindowsIDTestProcVB ()  
    Dim clientId As WindowsIdentity  
    Dim impersonatedUser As WindowsImpersonationContext  
  
    ' 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 IsNot Nothing Then  
                ' Perform some action using impersonation.  
            End If  
  
        Finally  
            ' Undo impersonation.  
            If impersonatedUser IsNot Nothing Then  
                impersonatedUser.Undo()  
            End If  
        End Try  
  
    Catch e As Exception  
  
        Throw e  
  
    End Try  
End Sub  

Lihat Juga

Objek SqlPipe
Objek SqlTriggerContext
Pemicu CLR
Ekstensi Khusus Dalam Proses SQL Server untuk ADO.NET