Oggetto SqlContext
Si richiama 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. Determinate operazioni di accesso ai dati potrebbero inoltre essere valide solo se 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 può essere un'astrazione in un oggetto SqlContext
. Per altre informazioni sui metodi e sulle proprietà, vedere la Microsoft.SqlServer.Server.SqlTriggerContext
documentazione di riferimento sulla SqlTriggerContext
classe in .NET Framework SDK.
SqlContext
fornisce l'accesso ai componenti seguenti:
SqlPipe
: l'oggettoSqlPipe
rappresenta la "pipe" tramite la quale i risultati vengono propagati al client. Per altre informazioni sull'oggettoSqlPipe
, vedere Oggetto SqlPipe.SqlTriggerContext
: l'oggettoSqlTriggerContext
può essere recuperato solo dall'interno 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'oggettoSqlTriggerContext
, vedere Oggetto SqlTriggerContext.IsAvailable
: la proprietàIsAvailable
viene utilizzata per stabilire la disponibilità del contesto.WindowsIdentity
: la proprietàWindowsIdentity
viene utilizzata per recuperare l'identità di Windows del chiamante.
Determinazione della disponibilità del contesto
Eseguire una query sulla classe SqlContext
per vedere se il codice attualmente in esecuzione viene eseguito in-process. A tale scopo, verificare la proprietà IsAvailable
dell'oggetto SqlContext
. La IsAvailable
proprietà è di sola lettura e restituisce True
se il codice chiamante è in esecuzione all'interno di SQL Server e se è possibile accedere ad altri SqlContext
membri. Se la proprietà IsAvailable
restituisce False
, tutti gli altri membri di SqlContext
generano un'eccezione InvalidOperationException
se vengono utilizzati. Se IsAvailable
restituisce False
, qualsiasi tentativo di aprire un oggetto connessione in cui "context connection=true" nella stringa di connessione non riesce.
Recupero dell'identità di Windows
Il codice CLR in esecuzione in 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 WindowsIdentity
proprietà dell'oggettoSqlContext
. La WindowsIdentity
proprietà restituisce un'istanza WindowsIdentity
che rappresenta l'identità di Microsoft Windows del chiamante o null se il client è stato autenticato usando SQL Server Autenticazione. Solo gli assembly contrassegnati con le autorizzazioni EXTERNAL_ACCESS
o UNSAFE
possono accedere a questa proprietà.
Dopo avere ottenuto l'oggetto WindowsIdentity
, i chiamanti possono rappresentare l'account del client ed eseguirne le azioni.
L'identità del chiamante è disponibile solo tramite SqlContext.WindowsIdentity
se il client che ha iniziato l'esecuzione della stored procedure o della funzione ha eseguito la connessione al server utilizzando l'autenticazione di Windows. Se invece è stata utilizzata l'autenticazione SQL Server, il valore della proprietà è Null e il codice non è in grado di rappresentare il client.
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
Estensioni specifiche in-process di SQL Server ad ADO.NET