Объект SqlContext
Управляемый код вызывается на сервере при вызове процедуры или функции, при вызове метода для определяемого пользователем типа среды CLR или при срабатывании триггера, определенного на любом из языков microsoft платформа .NET Framework. Так как выполнение этого кода необходимо как часть соединения пользователя, требуется доступ к контексту участника из кода, работающего на сервере. Кроме того, определенные операции доступа к данным могут быть допустимы, только если они выполняются в контексте участника. Например, доступ к вставленным или удаленным псевдотаблицам, применяемым в операциях триггеров, допустим только в контексте участника.
Контекст участника извлекается из объекта SqlContext
. Дополнительные сведения о методах SqlTriggerContext
и свойствах см. в справочной Microsoft.SqlServer.Server.SqlTriggerContext
документации по классам в пакете SDK для платформа .NET Framework.
Объект SqlContext
обеспечивает доступ к следующим компонентам.
SqlPipe
: объектSqlPipe
представляет "канал", по которому результаты передаются клиенту. Дополнительные сведения об объекте см. вSqlPipe
разделе Объект SqlPipe.SqlTriggerContext
: объектSqlTriggerContext
можно получить только из триггера CLR. Он предоставляет сведения об операции, которая вызвала срабатывание триггера, а также карту столбцов, которые были обновлены. Дополнительные сведения об объекте см. вSqlTriggerContext
разделе Объект SqlTriggerContext.IsAvailable
: свойствоIsAvailable
используется для определения доступности контекста.WindowsIdentity
: свойствоWindowsIdentity
используется для получения удостоверения Windows участника.
Определение доступности контекста
Выполните запрос к классу SqlContext
, чтобы определить, работает ли выполняемый в данный момент код в процессе. Чтобы сделать это, проверьте свойство IsAvailable
объекта SqlContext
. Свойство IsAvailable
доступно только для чтения и возвращает значение True
, если вызывающий код выполняется внутри SQL Server и если доступ к другим SqlContext
членам доступен. Если свойство IsAvailable
возвращает значение False
, все остальные члены SqlContext
, если они используются, формируют исключение InvalidOperationException
. Если свойство IsAvailable
возвращает значение False
, любая попытка открыть объект соединения, имеющий в строке соединения текст «context connection=true», закончится неудачей.
Извлечение удостоверения Windows
Код CLR, выполняющийся внутри SQL Server, всегда запускается в контексте учетной записи процесса. Если код должен выполнять определенные действия с использованием удостоверения вызывающего пользователя, а не идентификатора процесса SQL Server, то маркер олицетворения должен быть получен через WindowsIdentity
свойство SqlContext
объекта . Свойство WindowsIdentity
возвращает экземпляр, WindowsIdentity
представляющий удостоверение Вызывающего объекта Microsoft Windows, или значение NULL, если клиент прошел проверку подлинности с помощью проверки подлинности SQL Server. Доступ к этому свойству могут получить только сборки, имеющие разрешения EXTERNAL_ACCESS
или UNSAFE
.
Получив объект WindowsIdentity
, вызывающие могут олицетворять учетную запись клиента и выполнять действия от их имени.
Если инициировавший выполнение хранимой процедуры или функции клиент соединился с сервером при помощи проверки подлинности Windows, удостоверение участника доступно только через метод SqlContext.WindowsIdentity
. Если же использовалась проверка подлинности SQL Server, это свойство имеет значение null, а код не может олицетворять вызывающего.
Пример
В следующем примере показано, как получить удостоверение Windows вызывающего клиента и олицетворить этого клиента.
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
См. также:
Объект SqlPipe
SqlTriggerContext, объект
Триггеры CLR
Внутрипроцессные расширения SQL Server для ADO.NET