Condividi tramite


Oggetto SqlContext

È possibile richiamare il codice gestito nel server quando si chiama una routine o una funzione, quando si chiama un metodo in un tipo CLR (Common Language Runtime) definito dall'utente o quando l'azione genera un trigger definito in uno dei linguaggi di Microsoft .NET Framework. Dal momento che l'esecuzione di questo codice viene richiesta come parte di una connessione utente, è necessario l'accesso al contesto del chiamante dal codice in esecuzione sul server. Inoltre, alcune operazioni di accesso ai dati possono essere valide solo se vengono eseguite nel contesto del chiamante. L'accesso alle pseudotabelle inserite ed eliminate utilizzate nelle operazioni del trigger, ad esempio, è valido solo nel contesto del chiamante.

Il contesto del chiamante viene astratto in un oggetto SqlContext. Per altre informazioni sui SqlTriggerContext metodi e sulle proprietà, vedere la Microsoft.SqlServer.Server.SqlTriggerContext documentazione di riferimento sulla classe in .NET Framework SDK.

SqlContext fornisce l'accesso ai componenti seguenti:

  • SqlPipe: l'oggetto SqlPipe rappresenta la "pipe" attraverso la quale i risultati passano al client. Per altre informazioni sull'oggetto SqlPipe , vedere Oggetto SqlPipe.

  • SqlTriggerContext: l'oggetto SqlTriggerContext può essere recuperato solo dall'interno di un trigger CLR. Fornisce informazioni sull'operazione che ha attivato il trigger e una mappa delle colonne che sono state aggiornate. Per altre informazioni sull'oggetto SqlTriggerContext , vedere Oggetto SqlTriggerContext.

  • IsAvailable: la IsAvailable proprietà viene utilizzata per determinare la disponibilità del contesto.

  • WindowsIdentity: la WindowsIdentity proprietà viene utilizzata per recuperare l'identità di Windows del chiamante.

Determinazione della disponibilità del contesto

Eseguire una query sulla SqlContext classe per verificare se il codice attualmente in esecuzione è in esecuzione in-process. A tale scopo, controllare la IsAvailable proprietà dell'oggetto SqlContext . La proprietà IsAvailable è di sola lettura e restituisce True se il codice chiamante è in esecuzione all'interno di SQL Server e se è possibile accedere ad altri membri SqlContext. Se la proprietà IsAvailable restituisce False, tutti gli altri membri SqlContext generano un InvalidOperationException, se utilizzato. Se IsAvailable restituisce False, qualsiasi tentativo di aprire un oggetto connessione con "context connection=true" nella stringa di connessione non riesce.

Recupero dell'identità di Windows

Il codice CLR in esecuzione all'interno di SQL Server viene sempre richiamato nel contesto dell'account di processo. Se il codice deve eseguire determinate azioni usando l'identità dell'utente chiamante, anziché l'identità del processo di SQL Server, è necessario ottenere un token di rappresentazione tramite la proprietà WindowsIdentity dell'oggetto SqlContext. La WindowsIdentity proprietà restituisce un'istanza WindowsIdentity che rappresenta l'identità di Microsoft Windows del chiamante oppure null se il client è stato autenticato tramite l'autenticazione di SQL Server. Solo gli assembly contrassegnati con autorizzazioni EXTERNAL_ACCESS o UNSAFE possono accedere a questa proprietà.

Dopo aver ottenuto l'oggetto WindowsIdentity , i chiamanti possono rappresentare l'account client ed eseguire azioni per loro conto.

L'identità del chiamante è disponibile solo tramite SqlContext.WindowsIdentity se il client che ha avviato l'esecuzione della stored procedure o della funzione connessa al server tramite l'autenticazione di Windows. Se invece è stata usata l'autenticazione di SQL Server, questa proprietà è null e il codice non è in grado di rappresentare il chiamante.

Esempio

Nell'esempio riportato di seguito viene illustrato come ottenere l'identità di Windows del client chiamante e rappresentare il client.

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  

Vedere anche

Oggetto SqlPipe
Oggetto SqlTriggerContext
Trigger CLR
SQL Server In-Process estensioni specifiche da ADO.NET