Ciao Luca,
se non ricordo male la situazione è questa:
hai un’applicazione WEB che gestisce (autentica e autorizza) lato applicativo una serie di utenti. Al momento della connessione ad DB, però, tutti gli utenti applicativi si presentano al database con la stessa login, ad esempio “Login1”. Hai necessità di registrare le attività di un determinato utente WEB.
In questa situazione, il database non conosce la *vera* identità dell’utente perché è stata mascherata dalla login “Login1”.
La soluzione più pulita sarebbe quella di creare una login/utente per ogni utente applicativo (utente WEB) assegnando correttamente ruoli e diritti a livello di database, in questo modo gli utenti WEB non sarebbero mascherati dalla "Login1".
Un’alternativa quick and dirty potrebbe essere questa: subito dopo aver eseguito la connessione al DB potesti utilizzare la funzione @@SPID per conoscere l’identificativo del processo utente, ottenuto lo SPID, l’applicazione potrebbe salvarlo all’interno di una tabella di associazione SPID/utente WEB, come questa ad esempio:
if (object_id('UserForSPID') is not null)
drop table dbo.UserForSPID
go
create table dbo.UserForSPID
(
id int identity(1, 1),
SPID int not null,
userWEB sysname not null
primary key(id)
)
go
insert into dbo.UserForSPID
(
SPID,
UserWEB
)
values
(
@@spid,
'luca'
)
go
select
*
from
dbo.UserForSPID
id SPID userWEB
----------- ----------- --------
1 51 luca
Potrai utilizzare lo SPID come filtro per la traccia di auditing, ad esempio, se l’ID del processo utente (SPID) fosse 51, potresti utilizzare sp_trace_setfilter in questo modo (vedi demo nell'area download):
-- Set the Filters
declare @intfilter int
set @intfilter = 51
exec sp_trace_setfilter @TraceID, 12, 1, 0, @intfilter
Le attività registrate, attraverso lo SPID, potranno essere associate all’utente WEB passando attraverso la tabella di associazione allestita al momento della connessione. Terminata la connessione potrai importare le attività all’interno di una tabella di auditing e successivamente eliminare la riga relativa allo SPID corrente dalla tabella di associazione.
delete
from
dbo.UserForSPID
where
(SPID=@@spid)
select
u.userWEB,
t.*
from
::fn_trace_gettable('C:\Audit_Trace\audit_trace_file.trc', default) as t
join
dbo.UserForSPID u on u.SPID=t.SPID
Buon divertimento 
Ciao
Sergio Govoni, SQL Server MVP |
MVP Profile |
Blog |
Twitter |