Comme le dit Jonas, Profiler est votre meilleure option (et la seule option pour les requêtes SELECT). Pour INSERT, UPDATE, DELETE, le plus proche que vous pouvez obtenir sans Profiler peut être de regarder le tampon d'entrée via DBCC INPUTBUFFER(@@SPID)
. Cela ne fonctionnera que pour les événements de langage ad hoc, pas les appels RPC, et ne vous montrera que les 256 premiers caractères de l'instruction SQL (selon la version, je crois). Quelques exemples de code, (exécutés en tant que dbo) :
CREATE TABLE TBL (a int, b varchar(50))
go
INSERT INTO TBL SELECT 1,'hello'
INSERT INTO TBL SELECT 2,'goodbye'
go
GRANT SELECT, UPDATE ON TBL TO guest
go
CREATE TABLE AUDIT ( audittime datetime default(getdate())
, targettable sysname
, loginname sysname
, spid int
, sqltext nvarchar(max))
go
CREATE TRIGGER TR_TBL ON TBL FOR INSERT, UPDATE, DELETE
AS BEGIN
CREATE TABLE #DBCC (EventType varchar(50), Parameters varchar(50), EventInfo nvarchar(max))
INSERT INTO #DBCC
EXEC ('DBCC INPUTBUFFER(@@SPID)')
INSERT INTO AUDIT (targettable, loginname, spid, sqltext)
SELECT targettable = 'TBL'
, suser = suser_name()
, spid = @@SPID
, sqltext = EventInfo
FROM #DBCC
END
GO
/* Test the Audit Trigger (can be run as guest) */
UPDATE TBL SET a = 3 WHERE a = 2