siDDis Skrevet 2. juni 2008 Del Skrevet 2. juni 2008 (endret) 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 2. juni 2008 av siDDIs Lenke til kommentar
kaffenils Skrevet 2. juni 2008 Del Skrevet 2. juni 2008 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
siDDis Skrevet 4. juni 2008 Forfatter Del Skrevet 4. juni 2008 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå