webForumDet fria alternativet

triggers sql

Databaser & SQL

11 svar · 867 visningar · startad av annasmurf

Medlem sedan mars 2006237 inlägg
Frågan#1

hej är det någon som vet hur man skapar en triggers som kontrollera om en flagga i databsen är sann eller falsk är den sann så sa den spärra uppdateringen av denna post?

Medlem sedan dec. 200012 464 inlägg
#2

Det beror på vilken DBMS som används.

Medlem sedan mars 2006237 inlägg
#3

microsoft sql server 2003

Medlem sedan dec. 200012 464 inlägg
#4
create trigger preventUpdate
 on <tablename> after update
 as
 declare @flag varchar(10)
 set @flag = (select flag from flags where type = 'something')
 if  @flag = 'true'
     raiseError ('Update not allowed',16,1)

ungefär

Medlem sedan aug. 20039 340 inlägg
#5

LarsG: Måste inte triggern fästas till before update? (Annars är ju skadan redan skedd när felet kastas.)

Medlem sedan dec. 200012 464 inlägg
#6

Ja, det är bättre men inte nödvändigt. De operationer som utförs i en trigger ingår i den atomicitet som finns för själva update-satsen. Om det uppstår ett fel i triggern så blir uppdateringen inte utförd.

Medlem sedan mars 2006237 inlägg
#7

vad betyder 16,1 i detta?
raiseError ('Update not allowed',16,1)

Medlem sedan mars 2006237 inlägg
#8

så ni menar att denna låser raderna när flaggan är sann

Medlem sedan dec. 200012 464 inlägg
#9

16 anger vilken hur allvarligt felet är.

Du kan läsa mer om raiseError här http://msdn.microsoft.com/en-us/library/aa238452(SQL.80).aspx

Om du har en after trigger så blir raderna låsta oavsett om flaggan är sann eller inte. Om du har en before trigger så blir det ingen update om flaggan är sann och därmed ingen låsning.

Medlem sedan mars 2006237 inlägg
#10

Men om jag ska låsa raderna om flaggan är sann vad menar ni att jag ska ha då?
jag vill ju inte låsa raden om den är falsk...

Medlem sedan dec. 200012 464 inlägg
#11

Om du inte vill att uppdateringen utförs så får du använda en instead of trigger. http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

Enligt dokumentationen så har SQL server inte stöd för before triggers. Det hade varit det enklaste.

Vad skulle det göra om raderna blir låsta den korta stund som det tar att utföra update?

Medlem sedan mars 2006237 inlägg
#12

Vad menar du med: Vad skulle det göra om raderna blir låsta den korta stund som det tar att utföra update?

267 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)