LOCK DI UNA SINGOLA RIGA DEL DB SQL SERVER 2000

venerdì 30 gennaio 2009 - 15.35

Simone83 Profilo | Newbie

Ciao a tutti

volevo sapere se esiste un modo per bloccare l'update di un campo specifico del database solo se un determinato valore (Es. se il campo in questione contiene un numero > 0)

Mi spiego meglio , ho necessità di impedire a livello di database che un utente possa modificare (per errore) dati di una riga che risulta già essere spedita.

Praticamente nella ditta in cui lavoro accadono "fatti strani" , alcuni documenti vengono annullati senza che in nessun programma ci sia una query specifica in tal senso. Vorrei bloccare quindi la riga di database relativa al documento appena generato in modo da causare un errore di run time all'applicazione che vuole provare ad annullarlo.

Il database che utilizzo è Sql Server 2000 SP4 e i programmi sono sviluppati in VB6 o .Net 2005

Qualcuno può aiutarmi?

Grazie

Simone

lbenaglia Profilo | Guru

>volevo sapere se esiste un modo per bloccare l'update di un campo
>specifico del database solo se un determinato valore (Es. se
>il campo in questione contiene un numero > 0)

Ciao Simone,

questa operazione può essere eseguita solo tramite un trigger di update, annullando la transazione nel caso in cui non sia soddisfatta la tua regola di business.

>Grazie
Prego.

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

Simone83 Profilo | Newbie

Ciao

grazie per la risposta immediata , potresti darmi qualche indicazione in più su come impostare questo trigger?

non sono molto ferrato in materia.

Grazie

Simone

lbenaglia Profilo | Guru

>grazie per la risposta immediata , potresti darmi qualche indicazione
>in più su come impostare questo trigger?
Senza un esempio completo da parte tua, no.
Devi postare la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO), la tua regola di business spiegata dettagliatamente ed il result set finale che vuoi ottenere con quei dati.

>non sono molto ferrato in materia.
Sui Books Online troverai tutte le info che cerchi.

>Grazie
Prego.

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

Simone83 Profilo | Newbie

Dunque :



Struttura Tabella TABPEZZMAG :
3 NumIris int 4 0
0 IDNumPezza int 4 0
0 IDNumMadre int 4 1
0 PzStato varchar 1 0
0 DtStato datetime 8 0
0 IDCdCliente int 4 0
0 IDCdArticolo int 4 0
0 NumPezCliente varchar 15 1
0 IDDisposizione int 4 0
0 NrRigaDisp smallint 2 0
0 NrSessDisp smallint 2 1
0 CdSpecola varchar 3 0
0 CdUtente varchar 3 0
0 DtVisita datetime 8 0
0 CdQualita varchar 3 0
0 TipoQual varchar 1 1
0 CdDifetto varchar 3 1
0 KgPezza real 4 0
0 KgTara real 4 0
0 MtPezza real 4 0
0 MtBonif real 4 0
0 MtDifett real 4 0
0 NrDifett int 4 0
0 NrDemPnt int 4 1
0 MtSfrido real 4 0
0 NrGiunte smallint 2 0
0 MtAltezza real 4 0
0 NumPkLst int 4 0
0 NotePezza text 16 1
0 NDocInt int 4 1
0 NumTelaio varchar 3 1
0 Partita varchar 15 1
0 IDCodFor int 4 1
0 NDocCar varchar 15 1
0 DataDocCar datetime 8 1
0 NDocScar varchar 15 1
0 DataDocScar datetime 8 1
0 TipTgl varchar 1 1
0 AltNom real 4 0
0 GrMtL real 4 1
0 NumRot varchar 12 1
0 PrgDis smallint 2 0
0 PrgPez smallint 2 0
0 SeqLav smallint 2 1
0 FasLav varchar 2 1
0 DurataVis int 4 0
0 DurataFer int 4 0
0 TipoDifet varchar 1 0
0 NOrdCl varchar 20 1
0 RigOCl smallint 2 1
0 Reparto varchar 1 1
0 FatCorrettivo real 4 1
0 MatricolaGreggia varchar 15 1
0 Capitolato varchar 15 1
0 Ubicazione varchar 20 1
0 MtBonQlt real 4 1
0 DiGestione text 16 1
0 NrDifQlt smallint 2 1
0 Bagno varchar 20 1
0 DataInizio int 4 1
0 OraInizio int 4 1
0 DataFine int 4 1
0 OraFine int 4 1
0 Bolla int 4 1
0 Fattura int 4 1
0 SelPkl varchar 1 0
0 StatoImballo varchar 1 1
0 Gruppo varchar 150 1
0 Bancale varchar 20 1
0 Web char 1 1
0 CodLavPezz char 10 1


Esempio di Insert :

Insert into tabpezzmag (idNumPezza,idNumMadre,pzstato,tipoqual,DtStato,IdCdCliente,idCdArticolo,IDDisposizione,NrRigaDisp,NrSessDisp,CdSpecola,cdutente,DtVisita,CdQualita,cddifetto ,KgPezza,KgTara,mtpezza,MtBonif,MtDifett,NrDifett,NrDemPnt,MtSfrido,NrGiunte,MtAltezza,NumPklst,NumRot,NotePezza,FatCorrettivo,NDocInt,numtelaio,Partita,IdCodFor,NDocCar,DATADOCCAR,ndocscar,DATADOCSCAR,TipTgl,altnom,GrMtL,prgdis,numpezcliente,NOrdCl,RigOCl,FASLAV,seqLAV,DURATAVIS,DURATAFER,TipoDifet,Reparto,Capitolato,MatricolaGreggia,PRGPEZ,ubicazione,MtBonQlt,NrDifQlt,DiGestione,bAGNO,DataInizio,OraInizio,DataFine,OraFine,Gruppo) values(2554946,0,' ','O','30/01/2009 16:14:11',2676,137562,177136,3,15,'041','17 ','30/01/2009 16:14:10','1 ',' ',10,0.3,15,0,0,0,0,0,0,150,0,'0','Errore: Gr.Mtl Gr.Mtq',0,0,'','1203564',0,'12,00',Null,'',Null,'I',149,646.7, 0,'5000008','0',0,'','0',54,107,'G','1','15 30 60','',10,'',0,0,' ','', 20090130,112958,20090130,161410,'PEZZE_VISITATE')

Descrizione Business :
La nostra azienda effettua il controllo qualità dei tessuti , una riga della tabella descritta sopra è una pezza.

Quando viene creata il campo PzStato=' ' , il campo numpklst =0 e il campo bolla=0 .

Tante pezze compongono un packing list e tanti packing list compongono una bolla , quindi appena viene concluso il controllo di un determinato numero di pezze le nostre impiegate generano un "Packing List Definitivo" andando a popolare il campo PzStato con una "S" e il campo NumPklSt con un numero progressivo.Successivamente viene creata una bolla popolando il campo bolla delle righe interessate con un altro numero progressivo.

Il problema che si verifca è il seguente :
Ogni tanto alcune righe già spedite (quindi con il campo bolla valorizzato) "perdono" l'informazione del Packing List tornando a 0 e l'informazione Dello stato tornando a ' ' ma mantenendo il numero di bolla.

Quello che vorrei ottenere con questo trigger è un blocco che impedisca ai programmi di impostare a 0 il campo NumPklSt se contiene un numero>0 , ovviamente devo bloccare solo l'update di quel campo e non di tutto il record perchè una volta spedita la pezza può essere ancora Imballata e quindi i programmi devono poter aggiornare il campo StatoImballo.

Grazie dell'aiuto

Simone

Simone83 Profilo | Newbie

Ciao

sono riuscito a creare un trigger che fa quasi al caso mio , è il seguente :

CREATE TRIGGER TR_UPD_PKL
ON TabPezzMag
FOR UPDATE
AS
if (update (numpklst) or update(pzstato))and EXISTS(SELECT 1 FROM tabpezzmag WHERE bolla>'0') BEGIN
rollback tran
print 'Impossibile modificare pezze già spedite!!!'
end

Però questo trigger dovrebbe verificare il campo bolla solo della riga interessata all'update , invece controlla se nell'intera tabpezzmag c'è una bolla >0.

Ovviamente la trova e non mi accetta nessuna transazione.

Esiste un comando che faccia al caso mio?

Grazie in anticipo

Simone

lbenaglia Profilo | Guru

>Però questo trigger dovrebbe verificare il campo bolla solo della
>riga interessata all'update , invece controlla se nell'intera
>tabpezzmag c'è una bolla >0.

Ciao Simone,

in un after trigger di UPDATE sono disponibili entrambe le tabelle virtuali INSERTED e DELETED contenenti rispettivamente le nuove righe aggiornate ed i valori originali delle stesse.
Ora, non so se tu debba eseguire il controllo sui vecchi valori o sui nuovi, quindi valuta tu quale tabella utilizzare

>Grazie in anticipo
Prego

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5