Operações com os Usuários Logados em MS SQL

11 views
Skip to first unread message

Miguel

unread,
Dec 3, 2012, 4:34:19 PM12/3/12
to ar...@googlegroups.com
Funcionamento
Argow mantém a coluna ARAUSERINFO.USER_LOGGED sincronizada com a atividade no programa. Assim, quando o usuário com ARAUSERINFO.USER_ID loga na aplicação ARAUSERINFO.APPLICATION, a coluna USER_LOGGED e marcada com True (‘T’/1) e desmarcada (‘F’/0) quando termina.

Este procedimento funciona adequadamente quando o usuário não abre a mesma aplicação mais de uma vez simultaneamente e quando a fecha corretamente.

Atualização
Quando estas condições não se comprem, a coluna pode ficar dessincronizada, indicando que um usuário está logado quando em realidade não está.  Para atualizar a coluna USER_LOGGED usar o seguinte comando:

Update ARAUSERINFO 
Set USER_LOGGED= Case When ( 
Exists( 
Select * 
From sys.sysprocesses As Syp 
Where ( Convert(varbinary(128), Ara.[USER_ID]) = Syp.[CONTEXT_INFO] ) And ( 'Argow.' + Ara.[APPLICATION] = Syp.[program_name] )
)
Then 'T' Else 'F' End
From ARAUSERINFO Ara


Única Instância 
Para não permitir a um usuário logar simultaneamente na mesma aplicação mais de uma vez utilizar a coluna USER_LOGGED_COUNT do seguinte dataset em onStart:

Select 
(Select Usr.[USER_NAME] From ARAUSER As Usr Where (Usr.[USER_ID] = Ara.[User_ID])) AS [USER_NAME]
,(Select count(*) 
From sys.sysprocesses As Syp 
Where ( Convert(varbinary(128), Ara.[USER_ID]) = Syp.[CONTEXT_INFO] ) And ( 'Argow.' + Ara.[APPLICATION] = Syp.[program_name])
) As USER_LOGGED_COUNT
,Ara.*
From ARAUSERINFO Ara



Trigger
No caso que deseje conhecer que é o usuário que “disparou” o trigger que esta sendo executado:

Select 
(Select Usr.[USER_NAME] From ARAUSER As Usr Where (Usr.[USER_ID] = Ara.[User_ID])) As [USER_NAME]
-- ,Case When ( Syp.spid Is Null ) Then 'F' Else 'T' End As USER_LOGGED_NOW
--, Syp.spid
From ARAUSERINFO Ara
Left Outer Join
        sys.sysprocesses As Syp
On 
( Convert(varbinary(128), Ara.[USER_ID]) = Syp.[CONTEXT_INFO] ) 
And
( 'Argow.' + Ara.[APPLICATION] = Syp.[program_name])
Where ( Syp.spid = @@spid )



Requisitos
Estes comandos supõem que não tenham sido alterados os valores das colunas sys.sysprocesses.CONTEXT_INFO e sys.sysprocesses.PROGRAM_NAME atribuídos por Argow no inicio do programa.

No primeiro caso, CONTEXT_INFO, o valor atribuído é o ARAUSER.USER_ID e em PROGRAM_NAME é  'Argow.<application>' .


Reply all
Reply to author
Forward
0 new messages