Поделиться через


Объект SqlContext

Применимо к:SQL Server

Управляемый код вызывается на сервере при вызове процедуры или функции, при вызове метода для определяемого пользователем типа среды 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 вызывающие объекты могут олицетворять учетную запись клиента и выполнять действия от их имени.

Удостоверение вызывающего объекта доступно только через SqlContext.WindowsIdentity , если клиент, который инициировал выполнение хранимой процедуры или функции, подключенной к серверу с помощью проверки подлинности Windows. Если же использовалась проверка подлинности 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