ACM schreef op maandag 22 november 2004 @ 10:27:
Ik had het over een trigger om een sequence te gebruiken en kan je garanderen dat je daarmee sowieso de sequence-waarde in Oracle kan gebruiken. Maar waarom kan een trigger niet de waarde achterhalen

Nee, ik bedoelde: de waarde die geinsert wordt TERUGGEVEN. Een trigger is in theorie autonoom: onderdeel van het insert/update/delete statement maar kan geen waarden teruggeven aan de context waar het insert/update/delete statement wordt gecalled.
Als je de trigger gebruikt om die "sequence tabel" te gebruiken, MOET je de actuele waarde uit die tabel halen, een increment op die waarde (en dat in een (nested) transaction natuurlijk) en die oude waarde gebruiken voor het nieuwe record.
Ja, maar dat was het probleem niet

. (overigens is een trigger-achtige constructie beter te doen in een proc die middels een serialized transaction de handel afhandelt en de nieuwe waarde teruggeeft. Die is dan gewoon te gebruiken door de client en altijd uniek (maar niet echt schaalbaar)
[...]
Een trigger kan toch vrijwel precies hetzelfde als een losse query??
Dit kan toch gewoon in een trigger:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
| -- PSEUDO PL/SQL
CREATE TRIGGER insert_trigger BEFORE INSERT ON data_tabel
FOR EACH ROW
temp_val INTEGER;
BEGIN -- start van transactie
SELECT current_value INTO temp_val
FROM sequence_tabel WHERE sequence_id = 'data_tabel';
UPDATE sequence_tabel SET current_value = current_value + 1
WHERE sequence_id = 'data_tabel';
NEW.data_id := temp_val;
END |
Leg mij dan eens uit waarom dit niet "net zo goed" als sequences kan werken? (tuurlijk insert into tabelnaam values (nextval('data_tabel_sequence'), ...) is handiger en vast ook significant sneller).
omdat meerdere threads dezelfde waarde kunnen ophalen en een context switch kan plaatsvinden tussen select en update. Les 1 van concurrent programming.

. Je kunt met locking wel allerlei dingen proberen af te vangen, en dan lukt het 'wel', maar door die locking kun je in de problemen komen doordat er deadlocks kunnen ontstaan.
Sequences zijn ook niet in 6 verschillende databases hetzelfde

Zelfs PostgreSQL dat vaak gemodelleerd wordt naar Oracle verschilt sterk op een aantal punten van Oracle met sequences. En in firebird heet het dan weer Generators, etc.
Ja dat klopt, het principe is echter hetzelfde: een door het systeem gegenereerde nieuwe waarde in een sequentiele reeks. Een Identity column is ook gewoon een sequence alleen heb je de vrijheid niet om die sequence ergens anders ook nog te gebruiken. DB2 heeft beide, en je ziet aan discussies omtrent wanneer wat te gebruiken (Identity of sequences) waar de nadelen van beide zitten. Over het algemeen is identity makkelijker maar minder flexibel (en dat is met bijna alles zo

)
Dat is inderdaad een valide punt. Maar maakt e.e.a. niet ineens ranzig

Dit zou je dan weer op moeten lossen door meer sql-code in je client te stoppen (die binnen een transactie een select op de sequence_tabel's huidige waarde doet) of door het in een stored procedure te stoppen.
Klopt. Je ontkomt in je custom oplossing niet aan een low-level locks. Echter bv op sqlserver kan ik altijd lezen van een gelockte row door een hint op te geven. Ja, dat is ranzig, maar sommige programmeurs gebruiken het om deadlocks te voorkomen (ook ranzig, maar dat terzijde). De door het RDBMS aangereikte mechanismen hebben deze nadelen niet.
dit zul je me even moeten uitleggen. Ik begrijp dat bij verschillende nextval calls de vorige values niet meer bekend zijn (goh

) maar als ik insert en daarna een scalar query, bv SELECT mysequence.CURRVAL FROM DUAL; doe (oracle) waarom zou dat niet de juiste waarde opleveren die is gebruikt in de insert?
Ik wil je zeker niet persoonlijk aanvallen, laat ik daar even heel duidelijk in zijn. Wordt alleen de laatste tijd een beetje moe van de "ik-weet-alles-beter-dan-jij" sfeer die zowel hier als in NOS begint te hangen. (I know, i know.. if you don't like it, get the f*ck out of there).
Ach, valt wel mee toch? (hier that is).
Anyway, de hoeveelheid verschillende databases waar ik mee heb gewerkt gaat verder dan 6 (en MySql kan ik nog steeds geen database noemen dus tel ik ook zeker niet mee). Ben ik nou stoer, of is het helemaal niet relevant voor hoeveel databases ik (of jij) dit soort code hebt geschreven.
Mijn lijst gaat ook verder dan 6, maar ik wilde aangeven dat ik wel weet waarover ik praat mbt dit onderwerp

. Inderdaad een zwaktebod, toegegeven.
Op je laatste vraag: Ik denk dat je redelijk goed weet waar je over praat, maar soms een beetje ongenuanceerd uit de hoek komt. Erg vervelend voor je als je als ontwikkelaar werkt, want dat gaat je vanzelf een keer in je zak bijten. Soms ben je niet de meest briljante ontwikkelaar in een team en erger nog: soms heb je een (technisch) projectleider die dat soort gedrag gewoon niet pikt. Maar goed, dit is een forum en niet IRL, misschien ben je IRL wel wat kalmer en genuanceerder. (nofi uiteraard, meer een losse gedachte)
Mja, meestal probeer ik wel genuanceerd te zijn, maar wanneer ik meteen leesbrillen moet gaan kopen e.d. dan houdt het hard op.
Soms wel. Stel dat jij voor alle acties die gebeuren in de database een journaal wilt bijhouden. Dus voor iedere update, wil jij dat de originele waarde in een history tabel (een journaal dus) wordt weggeschreven?
Oh maar laat ik even rechtzetten dat ik niet tegen triggers ben, ik ben alleen tegen triggers voor het creeeren van autonumbering. Dat is iets heel anders.
Deferred updates zijn dus niet per definitie slecht. Zolang ze maar goed gedocumenteerd zijn voor de DBA-ers

Laat ik me daar niet verder over uitlaten
[
Voor 28% gewijzigd door
EfBe op 22-11-2004 13:33
]