otrdiena, 2010. gada 21. septembris

Trigera aizliegšana vienas transakcijas ietvaros

Tāda eksotiska situācija gadījās- ir tabula, kurai ir trigeris. Trigeris rūpējas par biznesa loģiku. Vienmēr tas ir jādara, bet ir viena izņēmuma procedūra, kuras izpildes laikā trigerim nav jāstrādā. Zemāk aprakstīts risinājums.

Ideja diezgan vienkārša-

* procedūras izpildes laikā izveidot temp tabulu (šādas tabulas ir redzamas tikai transakcijas ietvaros, līdz ar to- citi lietotāji atšķirību nejutīs.).
 create table #NogrieztTrigeri(i int)
* trigerī pārbaudīt, vai tempdb eksistē tāda tabula. Ja eksistē tabula, tad neko nedara.
IF OBJECT_ID('tempdb..#NogrieztTrigeri') is Null
Begin
-- tas, kas jādara normālā gadījumā
End
* procedūras beigās temp tabulu izmet
drop table #NogrieztTrigeri
Šo risinājumu atradu šeit. Nekādu elegantāku risinājumu neizdevās atrast vai izdomāt.

[Papildināts 2011-11-11] Alternatīvas (vienalga nav īsti pārskatāmas) varētu būt:
* izmantot konteksta informāciju (msdn)
* izmantot Resursu bloķēšana- Application Locks

Nav komentāru:

Ierakstīt komentāru