[MSSQL] trigger instead of update

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Ik wil een trigger maken op een view, die een UPDATE statement vervangt. een INSTEAD OF trigger is hier natuurlijk uitermate geschikt voor. De volgende code illustreert een beetje wat ik wil maken:
SQL:
1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER _Templates2_Update ON [dbo].[_Templates2] 
INSTEAD OF UPDATE
AS
UPDATE _Templates SET
   PIN=updated.PIN,
   Template=updated.Template,
   Type=(SELECT classictype FROM __TemplateTranslation WHERE entity=updated.Entity AND type=updated.Type),
   Live=updated.Live
WHERE
   [ID]=updated.[ID]

Het probleem met deze code is natuurlijk dat MSSQL alleen de conceptuele tabellen "inserted" en "deleted" kent. Voor een nog onbekende reden bestaat "updated" niet en is de "inserted" tabel in een update-trigger niet beschikbaar, dus werkt deze trigger niet. dat weet ik allemaal wel.

De vraag ik dus hoe ik een dergelijke trigger wel werkend kan krijgen. Help? :?

日本!🎌


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Bij een update zijn de inserted en deleted tabellen gevuld :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:51
updated bestaat zowiezo niet; zie P_de_B.

https://fgheysels.github.io/


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Lezen jullie mijn posting wel?

inserted bestaat niet in een UPDATE trigger. Ik krijg niet voor niets een error daarover...

日本!🎌


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 21:43
_Thanatos_ schreef op donderdag 12 mei 2005 @ 23:28:
Lezen jullie mijn posting wel?

inserted bestaat niet in een UPDATE trigger. Ik krijg niet voor niets een error daarover...
Zou je dan ook de code en de error die je krijgt hier neer kunnen zetten ?

Ik zou denken dat je in trigger iets *doet* met die inserted en/of deleted tabellen ? Ik zou waarschijnlijk een cursor over de inserted tabel inner join deleted tabel laten lopen.

Of begrijp ik je nu helemaal verkeerd ?

[ Voor 46% gewijzigd door StevenK op 13-05-2005 07:40 ]

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:51
_Thanatos_ schreef op donderdag 12 mei 2005 @ 23:28:
Lezen jullie mijn posting wel?

inserted bestaat niet in een UPDATE trigger. Ik krijg niet voor niets een error daarover...
Niet zo arrogant en kort zijn meneertje; jij doet iets verkeerd:
The INSTEAD OF UPDATE trigger is a combination of the INSTEAD OF INSERT and the INSTEAD OF DELETE triggers. As Listing 5, page 52, shows, the INSTEAD OF UPDATE trigger first deletes all the old rows by joining each underlying table to the deleted table in the same way the INSTEAD OF DELETE trigger used a join to delete rows in the view. The INSTEAD OF UPDATE trigger then inserts the new version of the rows in the same way that the INSTEAD OF INSERT trigger inserted rows into the view.
code:
1
2
3
4
5
6
7
8
9
10
-- INSTEAD OF UPDATE trigger
CREATE TRIGGER trg_u_orders ON Orders INSTEAD OF UPDATE
AS

-- Make sure that all of the data meets the CHECK constraint.
IF EXISTS(SELECT *
          FROM inserted
          WHERE customerid < 'A'
             OR customerid > 'ZZZZZ')
etc...


en zie ook hier:
klik

https://fgheysels.github.io/


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Dan nog, de "inserted" tabel bestaat *echt* niet:
Afbeeldingslocatie: http://www.thany.org/screenshots/Screenshot365.png

Lijkt me duidelijk toch :?

Maargoed, begrijp ik uit je verhaal dat ik dus eigenlijk ook alleen een INSERT en DELETE trigger kan definieren, en dat daarmee de UPDATE statements ook goed gaan?

日本!🎌


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 21:43
_Thanatos_ schreef op vrijdag 13 mei 2005 @ 12:44:
Dan nog, de "inserted" tabel bestaat *echt* niet:
[afbeelding]

Lijkt me duidelijk toch :?

Maargoed, begrijp ik uit je verhaal dat ik dus eigenlijk ook alleen een INSERT en DELETE trigger kan definieren, en dat daarmee de UPDATE statements ook goed gaan?
Nee, dat begrijp je niet.

Je foutmelding zegt 'does not match a table or alias used in the query'. Dat wil niet zeggen dat 'ie niet bestaat, maar dat 'ie niet genoemd wordt in je from-clause.

Ofwel je probeert waarschijnlijk iets van
code:
1
select naam from mensen where mensen.id = inserted.id

terwijl je had moeten gebruiken
code:
1
select naam from mensen inner join selected on mensen.id = inserted.id

[ Voor 8% gewijzigd door StevenK op 13-05-2005 12:50 ]

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:51
selected moet inserted zijn, StevenK. :)

Dit werkt trouwens perfect
code:
1
2
3
4
5
create trigger persoon_u
on persoon
instead of update
as
    select * from inserted

[ Voor 64% gewijzigd door whoami op 13-05-2005 13:00 ]

https://fgheysels.github.io/

Pagina: 1