Newsgroup: it.comp.software.database
Titolo: [MSQL7] trigger

deV<

 in anni uguali....com'è possibile?
Come viene prelevato/generato il numero univoco?
Davide

 ha scritto nel messaggio
news:9fi2vm$45egs$1...@ID-18487.news.dfncis.de...


 WHERE ID = @ID
Che succede se nessun record ha ID=quelfamosoIDchenonsisacosasia ?
Nota: se aggiorni la tabella A da un trigger della tabella A
succede un macello... io ti consiglio di rivedere la tua tecnica
usando una tabella di "supporto" che contiene solo i progressivi,
imitare cioe' il meccanismo delle Sequence di Oracle.
Inoltre io userei una Stored Procedure per inserire i dati,
facendo il tutto li' dentro senza usare un Trigger. Cosi' ti puoi
gestire una transazione unica che recupera il nuovo dato e lo
ficca nel database, e dal tuo client richiami la SP fregandotene
di tutto il resto. Poi puoi ritornare il numero teste' generato
(che sicuramente ti servira' dopo).
Davide

 ha scritto nel messaggio
news:9fioo3$45egs$3...@ID-18487.news.dfncis.de...


 ha scritto nel messaggio
news:9fioo3$45egs$3...@ID-18487.news.dfncis.de...


 come faccio una sp per inserire i dati?
Allora, la SP seguente viene usata da me per reperire un ID progressivo,
non sto' qui' a spiegarti tutti gli arzigogoli del progetto in cui
viene usata...
create procedure getnewid
as
	declare @newid numeric(10)
	begin transaction;
        select @newid=count(*) from ids;
        if @newid>0
               select @newid=max(elementid)+1 from ids;
        else
               select @newid=0
        insert into ids (elementid) values (@newid);
	commit;
									        return @newid
La prima select mi serve a verificare che esista almeno un elemento
nella tabella (se non esiste nessun elemento la seconda select
ritornerebbe NULL), se almeno un elemento esiste, prelevo il valore
maggiore ed aggiungo uno, altrimenti inizializzo a 0. Poi inserisco
un record nella tabella con l'ID calcolato.
Davide

 dimenticavo.....   poi ti offro una birra...
hummm... nel senso che vieni fino qui' ad offrirmela?
Davide

 ha scritto nel messaggio
news:9fki00$4m5pc$8...@ID-18487.news.dfncis.de...


 ha scritto nel messaggio
news:9fkhv9$4m5pc$7...@ID-18487.news.dfncis.de...


 dipende dove sei ubicato geograficamente...
www.davidebianchi.net
 ti dira' il dove ed il come...
Davide

 correlata.
Se ho capito bene per inserire un record in A devi avere gia' il
record corrispondente in B, quindi si tratta di verificare che
il record in B esista prima di fare l'inserimento (se hai una
Foreign Key su A non sarebbe necessario perche' riceveresti un
errore, ma tante'):
create procedure addthisdata
	@Adesc  varchar(255),
	@Bid	numeric(10)
as
	declare @Besiste numeric(10)
	declare @Aid numeric(10)
	begin transaction
	select @Aid=count(*) from A;
	if @Aid>0
		select @Aid=max(Id)+1 from A;
	else
		select @Aid=1
	end
 
	select @Besiste=count(*) from B where ID=@Bid;
	if @Besiste>0
		insert into A(Id,Desc,Bid) values (@Aid, @Adesc, @Bid)
	else
		raiseerror("Record in B inesistente!",16,1)
	end
	commit
	return @Aid
go
Piccola spiegazione: la prima Select verifica che ci sia almeno
un record in A (altrimenti Max() ritorna NULL), se esiste almeno
un record prendo l'ultimo numero+1 come nuovo "id". Se non esiste
nessun record inizializzo ad 1.
La seconda Select verifica che esista il record corrispondente in B
prima di procedere all'inserimento, se non esiste un record "sparo"
un errore e non faccio l'inserimento.
Al termine il nuovo ID teste' inserito viene ritornato.
Nota: qui' ho usato un sistema semplice per reperire l'ID, niente
ti impedisce di unire le due procedure (questa e quella precedente)
creando un meccanismo di recupero ID "generale".
Davide

 ha scritto nel messaggio
news:9fkric$4m5pc$1...@ID-18487.news.dfncis.de...


	commit;
E' sbagliata. Niente ti garantisce che due connessioni la chiamino
contemporaneamente ritornando lo stesso numero.
Confondi transazione con concorrenza e con i blocchi che non usi in
modo esplicito.
Ti suggerisco (poi fai come ti pare) qualcosa del genere:
-- CREATE TABLE Papero ( C1 INTEGER PRIMARY KEY NOT NULL) 
-- INSERT INTO Papero VALUES ( 3 ) 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
BEGIN TRANSACTION 
DECLARE @max INTEGER 
SELECT @max = MAX(C1) FROM Papero WITH (UPDLOCK, HOLDLOCK) 
IF ( @@ERROR <> 0 ) 
BEGIN 
   Print 'Ciccia 1' 
   ROLLBACK TRANSACTION 
   RETURN 
END
IF @max IS NULL
   SELECT @max = 0
ELSE
   SELECT @max = @max + 1 
PRINT CAST(@max AS VARCHAR(12)) 
INSERT INTO Papero VALUES ( @max ) 
IF ( @@ERROR <> 0 ) 
BEGIN 
   Print 'Ciccia 2' 
   ROLLBACK TRANSACTION 
   RETURN 
END
COMMIT TRANSACTION 
-- 
Tieni per te il Papero giusto se vuoi la mia email
Sito Papero -> 
http://utenti.tripod.it/papero
Link al Sito Papero 
http://www.mathtools.net/