2014-12-02 15 views
6

Sto convertendo un'applicazione da Access a SQL Server 2014. Una delle funzionalità di questo strumento è consentire agli utenti di creare query SQL ad hoc per modificare l'eliminazione o aggiungere dati a un numero di tabelle.Monitoraggio di chi apporta modifiche a SQL Server nell'applicazione C# o SQL Server

In questo momento in Access non c'è traccia di chi fa cosa se qualcosa viene incasinato, non c'è modo di sapere chi era o quando è successo (è successo abbastanza volte che è un problema serio e una delle molte ragioni per cui lo strumento viene riscritto).

L'applicazione che sto scrivendo è un'applicazione Windows in C#. Sto cercando QUALSIASI e tutti i suggerimenti sui modi in cui questo può essere fatto senza mettere una grande richiesta sul server (elaborazione o spazio). Dal momento che gli utenti stanno creando le proprie query non posso semplicemente aggiungere una colonna per nome utente e data (anche quella tracciare solo le modifiche più recenti).

Non è necessario conservare i vecchi dati o persino identificare esattamente ciò che è stato modificato. Solo chi ha cambiato i dati e quando l'hanno fatto. Voglio essere in grado di guardare qualcosa (vista, tabella o anche database separato) che mi mostra un elenco di utenti che hanno apportato una modifica e quando l'hanno fatto.

+1

v'è un meccanismo incorporato in SQL Server dalla versione 2008, Change Data Capture (CDC), che fa solo quello. E ti mostrerà anche cosa è stato esattamente cambiato. –

+0

Da tutto quello che ho letto fino ad ora, CDC non acquisisce il nome utente che ha apportato la modifica. Inoltre non ho bisogno di mantenere tutte le modifiche. questo potrebbe far crescere il DB molto più grande di quello che voglio. –

+0

Come gestisci l'accesso al database nella tua app C#? Single userId o autenticazione di Windows (che significa che ogni utente ha un account di database)? – UnhandledExcepSean

risposta

0

È possibile considerare l'utilizzo di trigger e una tabella di log, questo funzionerà su tutti i server SQL. I trigger sono un po 'più costosi del CDC, ma se i tuoi utenti stanno già aggiornando direttamente sui tuoi tavoli, questo non dovrebbe essere un problema. Penso che dipenderà anche da quante tabelle vuoi registrare.

io vi fornirà con un semplice esempio per la registrazione degli utenti che ha cambiato un tavolo, o più tavoli (basta aggiungere il grilletto per le tabelle):

CREATE TABLE UserTableChangeLog 
(
    ChangeID INT PRIMARY KEY IDENTITY(1,1) 
    , TableName VARCHAR(128) NOT NULL 
    , SystemUser VARCHAR(256) NOT NULL DEFAULT SYSTEM_USER 
    , ChangeDate DATETIME NOT NULL DEFAULT GETDATE() 
) 

GO 

CREATE TABLE TestTable 
(
    ID INT IDENTITY(1,1) 
    , Test VARCHAR(255) 
) 

GO 
--This sql can be added for multiple tables, just change the trigger name, and the table name 
CREATE TRIGGER TRG_TABLENAME_Log ON TestTable 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    --Can be used to get type of change, and wich data that was altered. 
    --SELECT * FROM INSERTED; 
    --SELECT * FROM DELETED; 

    DECLARE @tableName VARCHAR(255) = (SELECT OBJECT_NAME(parent_id) FROM sys.triggers WHERE object_id = @@PROCID); 

    INSERT INTO UserTableChangeLog (TableName) VALUES (@tableName); 

END 

GO 

Ecco come funzionerà:

INSERT INTO TestTable VALUES ('1001'); 
INSERT INTO TestTable VALUES ('2002'); 
INSERT INTO TestTable VALUES ('3003'); 
GO 

UPDATE dbo.TestTable SET Test = '4004' WHERE ID = 2 

GO 

SELECT * FROM UserTableChangeLog 

enter image description here

+0

Questo forse quello che finisco per dover fare, ma ho sentito che i Trigger possono davvero influenzare le prestazioni. –

+0

@Spots Knight: Dipende dal trigger, se si eseguono alcune query "costose" nel trigger, influirà notevolmente sulle prestazioni quando si innesca, poiché è necessario attendere il completamento. In scenari in cui potresti avere centinaia o migliaia di diverse query UPDATE/INSERT/DELETE a intervalli brevi, vorrei anche riconsiderare di non utilizzare i trigger. In questo esempio, tuttavia, non utilizzerà più prestazioni di un "INSERT" di una riga in più, sarebbe difficile persino misurarlo. –

0

non è stata specificata la versione di SQL Server, in ogni caso, se si dispone di una versione> = 2008 R2 è possibile utilizzare per Extended Events controlla il tuo sistema.

Extended Events Config

Extended Events Log

su StackOverflow si può leggere my answer al problema simile

+0

Ho detto che stavo andando a SQL Server 2014. Questi eventi estesi sono ancora disponibili in quella versione o sono stati rimossi? –

+0

Siamo spiacenti ... Sì è disponibile in TUTTA la versione (inclusa Express Edition) – Max