Tabella sql si svuota senza un apparente motivo.

giovedì 26 gennaio 2012 - 09.50
Tag Elenco Tags  .NET 4.0  |  Windows Server 2008 R2  |  SQL Server 2008 R2

vimmo Profilo | Newbie


Buongiorno a tutti, vi chiedo già anticipatamente scusa se in questo post sarò un po vago, ma ho un problema che non riesco a spiegarmi.

premessa:
Un cliente usa un mio programma per generare dei movimenti di accisa partendo da i movimenti di magazzino salvando i dati che necessita su una tabella.

cosa succede:
Succede che random una volta ogni tanto non si riesce a capire facendo cosa o per quale motivo questa tabella si svuota. tutti i dati presenti in essa spariscono.
Dopo varie prove non siamo mai riusciti a riproporla questa cosa volontariamente quindi non sappiamo che pesci pigliare.
Un mio tecnico l'ultima volta che si è presentato questo problema ha notato che il giorno che sono "spariti" i dati sql ha effettuato delle statistiche su quella tabella.
Ora io non sono un esperto di sql quindi non saprei ne tradurre quello che mi ha detto ne tantomento capire come risolverlo.

Sperando di trovare supporto intanto vi ringrazio molto!

dinoxet Profilo | Senior Member

vago è dir poco ...

bisognerebbe capire se ci sono routin periodiche che girano,
trigger,
sp


altrimenti è filosofia...


DINOXET
__________________________________________
impossible is only a word

Brainkiller Profilo | Guru

>Succede che random una volta ogni tanto non si riesce a capire
>facendo cosa o per quale motivo questa tabella si svuota. tutti
>i dati presenti in essa spariscono.
>Dopo varie prove non siamo mai riusciti a riproporla questa cosa
>volontariamente quindi non sappiamo che pesci pigliare.

Beh io direi che bisogna andare a vedere sia lato applicativo, sia nel database, tutte le parti di codice che operano sui dati ed in particolare quelle in cui si cancellano record dalla tabella. Oppure anche su trigger se ce ne sono o su stored procedure. O per un bug o perchè è stato scritto male il codice ci sarà qualche query che va a cancellare direttamente tutti i dati. Magari succede in una particolare combinazione di azioni che non riesci a simulare. Altra soluzione accendi il SQL Profiler e tieni monitorato. La prima volta che ti trovi la tabella vuota vai a vedere la traccia del SQL Profiler e vedi chi ha lanciato la DELETE.

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

alx_81 Profilo | Guru

>Beh io direi che bisogna andare a vedere sia lato applicativo,
>sia nel database, tutte le parti di codice che operano sui dati
>ed in particolare quelle in cui si cancellano record dalla tabella.
>Oppure anche su trigger se ce ne sono o su stored procedure.
>O per un bug o perchè è stato scritto male il codice ci sarà
>qualche query che va a cancellare direttamente tutti i dati.
>Magari succede in una particolare combinazione di azioni che
>non riesci a simulare. Altra soluzione accendi il SQL Profiler
>e tieni monitorato. La prima volta che ti trovi la tabella vuota
>vai a vedere la traccia del SQL Profiler e vedi chi ha lanciato
>la DELETE.
se vuoi puoi evitare almeno le delete facendo sulla tabella un trigger INSTEAD OF delete.
Ma questo non ti previene eventuali drop/create della tabella.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

vimmo Profilo | Newbie

la parte software mi lascia qualche dubbio perchè è costituita da un programma gestionale di terzi e una personalizzazione (un estensione) allo stesso scritta da me che fa questi calcoli.
nella parte scritta da me in un solo punto cancello i dati, ovvero prima di generarli con tutti i controlli del caso che se non trova una lista(array) con i dati nuovi non li cancella ecc ecc.
Il cliente però usa questo programma tutti i giorni e continuamente questa tabella si popola e questo problema invece si presenta random, l'ultima volta il 16 gennaio la volta prima in primavera dell'anno scorso.

Per questo ho iniziato a pensare anche dopo consiglio del tecnico che qualcosa sul db li eliminasse queste "statistiche" come le ha chiamate si possono lanciare manualmente? si possono inibire?

mi informo sulla presenza di trigger o stored procedure ma non credo non ne sono mai stato informato.
Il sql profiler non l'ho mai usato e non ne so un h mi documenterò.

Brainkiller Profilo | Guru

>la parte software mi lascia qualche dubbio perchè è costituita
>da un programma gestionale di terzi e una personalizzazione (un
>estensione) allo stesso scritta da me che fa questi calcoli.
>nella parte scritta da me in un solo punto cancello i dati

Appunto forse c'è un bug qui anche se tu lo escludi a priori.

>Per questo ho iniziato a pensare anche dopo consiglio del tecnico
>che qualcosa sul db li eliminasse queste "statistiche" come le
>ha chiamate si possono lanciare manualmente? si possono inibire?

Ma tu parli genericamente di statistiche cioè della tabella che si cancella o ti riferisci alle statistiche di SQL Server ?

>mi informo sulla presenza di trigger o stored procedure ma non
>credo non ne sono mai stato informato.
>Il sql profiler non l'ho mai usato e non ne so un h mi documenterò.

Il SQL Profiler non fa altro che registrare tutti i comandi che passano sul DB. Quindi se c'è una DELETE particolare o una SP la vedi. e poi se riesci a ricollegare ora e data o range in cui è avvenuta l'eliminazione puoi risalire a chi l'ha fatta.
Io comunque indagherei sul codice della App.

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

vimmo Profilo | Newbie

forse mi sono spiegato male :)
io non escludo a priori che l'errore stia nella mia applicazione anzi al momento è l'unica indagata ovviamente, ed è stata passata al setaccio più volte e comunque non lo escludo che il problema sia lo stesso li.

alla luce di questo intervento di cui parlavo prima cercavo di informari su sql che qualcosa poteva picchiarsi con la mia app.

comunque la mia applicazione (c++) fa la cancellazione in questo momento:

//questo è il primo filtro di dati che comunque sia non vengono mai cancellati dall'applicazione
if(!pAdd->f_EscludiRigenerazione)
{
// questa funzione popola un oggetto (m_DettaglioTemp) che contiene tutti i dati aggiornati che devono finire nella tabella
PopolaListaDettaglio();
if(!m_DettaglioTemp.IsEmpty())
{
//qui entra solo se ha nuovi dati da aggiornare se la lista è vuota non fa nulla.
//quest'ultima funzione è l'unica che al suo interno ha una delete sui dati.
//anzi mi correggo non faccio direttamente una delete ma utilizzo un oggetto database layer che viene svuotato e riempito nuovamente prima di essere salvato.
GeneraDettagliAccisa();
}
}



Parlo delle statistiche di SQL Server comunque.

lbenaglia Profilo | Guru

>Parlo delle statistiche di SQL Server comunque.

Ciao,

Qui trovi spiegate cosa siano le statistiche e a cosa servono:
http://msdn.microsoft.com/it-it/library/ms190397.aspx

Se hai avuto la pazienza di leggere tutto il paragrafo fino in fondo, avrai capito che il loro aggiornamento è fondamentale per far sì che il Query Optimizer generi piani di esecuzione ottimali. Inoltre ti sarai reso conto che non hanno assolutamente nulla a che fare con il problema che riscontri.

Segui il consiglio di David, lancia una sessione di Profiler ed esegui un test funzionale dell'applicazione, tenendo sott'occhio i comandi SQL che vengono "sparati" a SQL Server. In questo modo sarai in grado di capire dove si cela il bug.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

vimmo Profilo | Newbie

si farò così grazie a tutti!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5