SqlContext, obiekt
Dotyczy:programu SQL Server
Kod zarządzany wywoływany na serwerze jest wywoływany podczas wywoływania procedury lub funkcji podczas wywoływania metody w typie środowiska uruchomieniowego języka wspólnego (CLR) lub gdy akcja uruchamia wyzwalacz zdefiniowany w dowolnych językach programu .NET Framework. Ponieważ wykonanie tego kodu jest wymagane w ramach połączenia użytkownika, wymagany jest dostęp do kontekstu obiektu wywołującego z kodu uruchomionego na serwerze. Ponadto niektóre operacje dostępu do danych mogą być prawidłowe tylko w przypadku uruchomienia w kontekście obiektu wywołującego. Na przykład dostęp do wstawionych i usuniętych pseudo-tabel używanych w operacjach wyzwalacza jest prawidłowy tylko w kontekście obiektu wywołującego.
Kontekst obiektu wywołującego jest abstrakcyjny w obiekcie SqlContext
. Aby uzyskać więcej informacji, zobacz Microsoft.SqlServer.Server.SqlContext.
SqlContext
zapewnia dostęp do następujących składników.
Składnik | Opis |
---|---|
SqlPipe |
Ten obiekt reprezentuje potok , za pomocą którego wyniki przepływają do klienta. Aby uzyskać więcej informacji, zobacz obiekt SqlPipe. |
SqlTriggerContext |
Ten obiekt można pobrać tylko z wyzwalacza CLR. Zawiera informacje o operacji, która spowodowała wyzwolenie wyzwalacza, oraz mapę zaktualizowanych kolumn. Aby uzyskać więcej informacji, zobacz sqlTriggerContext object. |
IsAvailable |
Ta właściwość służy do określania dostępności kontekstu. |
WindowsIdentity |
Ta właściwość służy do pobierania tożsamości systemu Windows obiektu wywołującego. |
Określanie dostępności kontekstu
Wykonaj zapytanie względem klasy SqlContext
, aby sprawdzić, czy aktualnie wykonywany kod jest uruchomiony w procesie, sprawdzając właściwość IsAvailable
obiektu SqlContext
. Właściwość IsAvailable
jest tylko do odczytu i zwraca True
, jeśli kod wywołujący jest uruchomiony w programie SQL Server i czy można uzyskać dostęp do innych SqlContext
elementów członkowskich. Jeśli właściwość IsAvailable
zwraca wartość False
, wszystkie pozostałe elementy członkowskie SqlContext
zgłaszają InvalidOperationException
, jeśli są używane. Jeśli IsAvailable
zwraca False
, każda próba otwarcia obiektu połączenia, który ma wartość "context connection=true" w parametrach połączenia, zakończy się niepowodzeniem.
Pobieranie tożsamości systemu Windows
Kod CLR wykonywany wewnątrz programu SQL Server jest zawsze wywoływany w kontekście konta procesu. Jeśli kod powinien wykonywać pewne akcje przy użyciu tożsamości użytkownika wywołującego, zamiast tożsamości procesu programu SQL Server, należy uzyskać token personifikacji za pomocą właściwości WindowsIdentity
obiektu SqlContext
. Właściwość WindowsIdentity
zwraca wystąpienie WindowsIdentity
reprezentujące tożsamość systemu Windows obiektu wywołującego lub wartość null, jeśli klient został uwierzytelniony przy użyciu uwierzytelniania programu SQL Server. Tylko zestawy oznaczone EXTERNAL_ACCESS
lub uprawnienia UNSAFE
mogą uzyskiwać dostęp do tej właściwości.
Po uzyskaniu obiektu WindowsIdentity
osoby wywołujące mogą personifikować konto klienta i wykonywać akcje w ich imieniu.
Tożsamość obiektu wywołującego jest dostępna tylko za pośrednictwem SqlContext.WindowsIdentity
, jeśli klient, który zainicjował wykonywanie procedury składowanej lub funkcji połączonej z serwerem przy użyciu uwierzytelniania systemu Windows. Jeśli zamiast tego użyto uwierzytelniania programu SQL Server, ta właściwość ma wartość null, a kod nie może personifikować obiektu wywołującego.
Przykład
W poniższym przykładzie pokazano, jak uzyskać tożsamość systemu Windows klienta wywołującego i personifikować klienta.
[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;
}
}
Powiązana zawartość
- obiektu SqlPipe
- obiektu SqlTriggerContext
- wyzwalacze CLR
- rozszerzenia specyficzne dla programu SQL Server do ADO.NET