Gå til innhold

Oversette Trigger frå Oracle til SQLServer


Anbefalte innlegg

Eg har skreve ein trigger i Oracle som også skal brukes til ein SQL Server database.

 

PL/T-SQL'en er det som ikkje er eit problems, men å setja kriteriene for når det skal kjøres er.

 

I Oracle så har eg dette:

CREATE OR REPLACE TRIGGER T_CHANGE_URL_REFERENCE
BEFORE INSERT OR UPDATE ON D_OBJECT
FOR EACH ROW
WHEN (NEW.ATTACHMENT_TYPE = 3)
BEGIN......

 

Korleis blir dette i SQL Server? Eg kan ikkje finne noko som ligner på FOR EACH ROW.

Endret av siDDIs
Lenke til kommentar
Videoannonse
Annonse

Det finnes ikke noe slikt i SQL Server. I stedet må du bruke to tabeller som heter inserted og deleted (disse er kun tilgjengelig mens triggeren kjører) og du tvinges derfor til å tenke set-basert (med mindre du, gud forby, åpner en cursor mot disse tabellene).

 

Nå vet ikke jeg hva resten av triggeren din gjør, men hvis jeg gjetter at den oppdaterer en kolonne av type varchar avhengig av verdien i attachment type så kan du f.eks. skrive

 

create trigger T_CHANGE_URL_REFERENCE on D_OBJECT
for insert,update
as
update s set attachment_text=case i.url_ref when 3 then 'abc' when 2 then 'def' else i.url_ref end
from D_OBJECT s
inner join inserted i on s.MyPK=s.MyPK

 

 

En ting som er viktig å tenke på er hva som skjer hvis noe enabler RECURSIVE_TRIGGERS på databasenivå. Denne opsjonen er nemlig default slått av. Det finnes to funksjoner som er nyttige å bruke i slike tilfeller: UPDATE() og COLUMNS_UPDATED.

 

Fra BOL (i CREATE TRIGGER emnet):

You can design a Transact-SQL trigger to perform certain actions based on UPDATE or INSERT modifications to specific columns. Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() tests for UPDATE or INSERT tries on one column. COLUMNS_UPDATED tests for UPDATE or INSERT actions that are performed on multiple columns and returns a bit pattern that indicates which columns were inserted or updated.
Lenke til kommentar
Det finnes ikke noe slikt i SQL Server. I stedet må du bruke to tabeller som heter inserted og deleted (disse er kun tilgjengelig mens triggeren kjører) og du tvinges derfor til å tenke set-basert (med mindre du, gud forby, åpner en cursor mot disse tabellene).

 

Nå vet ikke jeg hva resten av triggeren din gjør, men hvis jeg gjetter at den oppdaterer en kolonne av type varchar avhengig av verdien i attachment type så kan du f.eks. skrive

 

create trigger T_CHANGE_URL_REFERENCE on D_OBJECT
for insert,update
as
update s set attachment_text=case i.url_ref when 3 then 'abc' when 2 then 'def' else i.url_ref end
from D_OBJECT s
inner join inserted i on s.MyPK=s.MyPK

 

 

En ting som er viktig å tenke på er hva som skjer hvis noe enabler RECURSIVE_TRIGGERS på databasenivå. Denne opsjonen er nemlig default slått av. Det finnes to funksjoner som er nyttige å bruke i slike tilfeller: UPDATE() og COLUMNS_UPDATED.

 

Fra BOL (i CREATE TRIGGER emnet):

You can design a Transact-SQL trigger to perform certain actions based on UPDATE or INSERT modifications to specific columns. Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() tests for UPDATE or INSERT tries on one column. COLUMNS_UPDATED tests for UPDATE or INSERT actions that are performed on multiple columns and returns a bit pattern that indicates which columns were inserted or updated.

 

Takk for hjelpa, dette løyste seg jo bra med å bruke FROM INSERTED

 

Du skremmer meg litt med å nevne recursive triggere. Er det nokon måte eg kan tvinge det til å alltid være av på min trigger?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...