[T-SQL] Recursieve triggers *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het volgende probleempje:

ik heb verschillende objecten in een tabel zitten (sql server 2000). De tabel TObject heeft een veldje status, deze wordt op 0 of 1 gezet door middel van een trigger die een aantal controles afloopt. De objecten in deze tabel staan in hiërarchische verhouding tot elkaar. In een tweede tabel is dit geregeld: TObject2Object. Ik heb een 'for update' trigger die kijkt of de waarde van het statusveld is gewijzigd (middels de tijdelijk deleted en inserted tabel). Als dat het geval is, dan moet de status van het parent object ook worden gewijzigd (opgezocht via TObject2Object). Ik zet de status van dit parent object dan op 0, zodat de trigger nogmaals afgaat en voor dit object ook opnieuw de status gaat bekijken. Een object heeft maar één parent. Theoretisch maximum van deze aanpak is 32, aangezien dit de nestinglimiet is van sql server. In de praktijk wordt dit never nooit niet gehaald. Een Object heeft doorgaans max. 4 parents tot aan het oppperObject toe...

Als ik dit toepas, krijg ik al gelijk een error dat dit maximum wordt overschreden. Misschien is de hele aanpak niet goed om dit te regelen.

Heeft iemand een alternatief of suggestie om dit wel in goede banen te leiden?

Acties:
  • 0 Henk 'm!

  • Freee!!
  • Registratie: December 2002
  • Nu online

Freee!!

Trotse papa van Toon en Len!

Ik heb geen directe alternatieven, maar ik kan je wel vertellen dat recursieve triggers over het algemeen geen goed idee zijn. Triggers mogen zichzelf nooit direct of indirect aanroepen.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 27-07 22:33
Je kunt die recursieve triggers uitschakelen.
How to set the nested triggers option (Enterprise Manager)
To set the nested triggers option

Expand a server group.

Right-click a server, and then click Properties.

Click the Server Settings tab.

Under Server behavior, select or clear the Allow triggers to be fired which fire other triggers (nested triggers) check box.

[ Voor 80% gewijzigd door whoami op 02-12-2003 15:48 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh ja dat was ik vergeten te melden.

Het werkt sowieso pas als je dit doorgeeft aan je database:

code:
1
2
alter database MyDatabase
SET RECURSIVE_TRIGGERS ON


Standaard staat dit uit namelijk.

Maar ik begrijp tussen de (weinige) regels door dat ik beter een andere aanpak kan kiezen. Hmm vrij lastig... Ik weet van te voren niet hoeveel parents ik omhoog moet in mijn objecthiërarchie 8)7

Hmm ideetje: misschien moet ik het via de TObject2Object tabel regelen. Als de status van een Object wijzigt én dit object heeft een parent, dan wijzig ik niet direct dit Object in de TObject tabel, maar ik zoek het bijbehorende record van de parent in de TObject2Object tabel op. Vanuit deze tabel kan ik dan weer de trigger van de TObject tabel voor het parent Object aanspreken. Dan is er volgens mij geen sprake van nesting en recursie.... toch? :*)
whoami schreef op 02 december 2003 @ 15:44:
Je kunt die recursieve triggers uitschakelen.


[...]

Acties:
  • 0 Henk 'm!

  • Freee!!
  • Registratie: December 2002
  • Nu online

Freee!!

Trotse papa van Toon en Len!

Verwijderd schreef op 02 december 2003 @ 16:00:
[...]
Maar ik begrijp tussen de (weinige) regels door dat ik beter een andere aanpak kan kiezen.
Inderdaad
Hmm vrij lastig... Ik weet van te voren niet hoeveel parents ik omhoog moet in mijn objecthiërarchie 8)7
Dat is lastig
Hmm ideetje: misschien moet ik het via de TObject2Object tabel regelen. Als de status van een Object wijzigt én dit object heeft een parent, dan wijzig ik niet direct dit Object in de TObject tabel, maar ik zoek het bijbehorende record van de parent in de TObject2Object tabel op. Vanuit deze tabel kan ik dan weer de trigger van de TObject tabel voor het parent Object aanspreken. Dan is er volgens mij geen sprake van nesting en recursie.... toch? :*)
Volgens mij ben je nu wel op de goede weg.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sterker nog... het werkt al! 8)

Acties:
  • 0 Henk 'm!

  • Freee!!
  • Registratie: December 2002
  • Nu online

Freee!!

Trotse papa van Toon en Len!

Verwijderd schreef op 02 december 2003 @ 16:44:
Sterker nog... het werkt al! 8)
Mooi zo _/-\o_

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT

Pagina: 1