web-dev-qa-db-fra.com

Trouvez l'identité du client tire une requête dans SQL Server sans utiliser de déclencheurs?

J'utilise actuellement Modifier la capture de données (CDC) pour suivre les modifications de données et je souhaite suivre le nom d'hôte et l'adresse IP du client soumettant la requête qui a apporté les modifications. S'il y a 5 clients différents connectés via le même nom d'utilisateur, on fait face à l'énigme de suivi qui du 5 a tiré la requête. D'autres solutions spécieuses que j'ai trouvées incluent la modification de la table CDC avec la commande suivante:

ALTER TABLE cdc.schema_table_CT 
ADD HostName nvarchar(50) NULL DEFAULT(Host_NAME())

Cependant, cela renvoie le nom hôte du serveur sur lequel la requête a été tirée et non le nom d'hôte du client qui tire la requête.

Y a-t-il un moyen de contourner ce problème? Quelque chose qui aiderait à enregistrer le nom d'hôte ou l'adresse IP (ou un autre type d'identité unique) du client. Je ne veux pas utiliser de déclencheurs, car il ralentit le système, aussi CDC génère des tables système, donc avoir une gâchette à ce qui est apparemment impossible.

11
Ritesh Bhakre

Je ne suis pas sûr de CDC, mais si le login a view server state permission Vous pouvez utiliser des DMV pour obtenir des informations.

Ceci est donné dans livres en ligne ici . J'ai changé la requête pour ajouter des colonnes qui vous donneraient le IP address:

SELECT 
    c.session_id, c.net_transport, c.encrypt_option, c.auth_scheme,
    s.Host_name, s.program_name, s.client_interface_name,
    c.local_net_address, c.client_net_address, s.login_name, s.nt_domain, 
    s.nt_user_name, s.original_login_name, c.connect_time, s.login_time 
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
WHERE c.session_id = SPID;  --session ID you want to track
4
Shanky

S'il vous plaît jeter un oeil sur le Connect Bug : ci-dessous est l'extrait correspondant de celui-ci

Ce comportement est par conception. CDC est conçu pour exposer les informations suivantes sur une modification: colonnes mises à jour, type d'opération et informations de transaction. Il n'a pas été conçu comme une solution d'audit. Il a été créé pour permettre des solutions de transfert d'extrait et de transfert d'extrait efficaces (ETL) via une charge de données incrémentielle qui est essentielle pour réduire le temps d'ETL global. Son objectif principal est d'exposer "ce qui a changé" non qui, quand ... pour cela, je vous recommande une fonctionnalité d'audit SQL.

À ce jour, il n'ya aucun plan pour transformer CDC dans une solution d'audit.

3
Jens W.