Toon posts:

[MS-SQL2000]identity en trigger probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Achter m'n insert plak ik een SELECT SCOPE_IDENTITY() waarmee ik de identity opvraag van m'n net ingevoerde record. Op de tabel zit een trigger die vervolgens verscheidene records in een andere tabel aanmaakt. Wanneer ik de trigger niet gebruik dan gaat alles goed. Maar met de trigger aan dan wordt is mijn recordset al gesloten en kan ik niet meer bij de identity :/

Waar ligt dit aan? Want uit deze topic merk ik op dat het gewoon zou moeten werken.

Alvast bedankt.

Verwijderd

select @@identity werkt ook niet??
(ik ken scope_identity() verder niet)

Verwijderd

Topicstarter
Nee maar het maakt niet uit wat ik wil returnen.. al doe ik een "select 1" ik kan er gewoon niet meer bij... en dat komt op een of andere manier door m'n trigger (die overigens wel werkt)

Verwijderd

Voer je de insert uit via ASP of iets dergelijks?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 09 september 2003 @ 13:55:
Achter m'n insert plak ik een SELECT SCOPE_IDENTITY() waarmee ik de identity opvraag van m'n net ingevoerde record. Op de tabel zit een trigger die vervolgens verscheidene records in een andere tabel aanmaakt. Wanneer ik de trigger niet gebruik dan gaat alles goed. Maar met de trigger aan dan wordt is mijn recordset al gesloten en kan ik niet meer bij de identity :/
Lijkt me raar. De trigger draait in de transaction van het insert statement, m.a.w.: als de trigger failed dan failed het insert statement automatisch. Duurt je trigger dermate lang dat er een timeout optreedt?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Met @@identity ga je niet het gewenste ID terugkrijgen. @@identity returned nl. het laatste geinserte id, als die trigger dus ook ergens een record insert, zal je het ID krijgen van dat record.

Je hebt ook nog een functie IDENT_CURRENT(), waarmee je het laatste geinserte id van een bepaalde tabel kunt opvragen, maar dan ben je ook nog niet zeker dat het het ID zal zijn van het record dat JIJ geinserted hebt.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Trouwens, wat gebeurt er in je trigger? Welke trigger is het? Wat bedoel je met 'mn recordseet is al gesloten'? Want, imo zou dat niets met je trigger mogen te maken hebben.

Doe je die select scop_identity() in dezelfde stored procedure als je INSERT ? Of doe je je insert en je select vanuit een client-programma? Zoja, dan is het imho beter dat je dat veranderd naar een stored procedure die die INSERT doet, en ook het id returned.

[ Voor 44% gewijzigd door whoami op 09-09-2003 14:32 ]

https://fgheysels.github.io/


Verwijderd

nee maar je kan @@identity wel op de goede plaats in de trigger aanroepen en deze waarde opslaan in een variabele

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 09 September 2003 @ 14:21:
nee maar je kan @@identity wel op de goede plaats in de trigger aanroepen en deze waarde opslaan in een variabele
En hoe ga jij die trigger die waarde laten returnen?
Trouwens, dat is het probleem niet.

Als je een record insert in tabel A, en tabel A heeft een INSERT trigger die iets insert in tabel B.
Stel dat je dan het ID wilt terugkrijgen van het geinserte record in tabel A, en je doet:
code:
1
select @@identity

dan ga je het id terugkrijgen van het record in tabel B.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 09 September 2003 @ 14:19:
Trouwens, wat gebeurt er in je trigger? Welke trigger is het? Wat bedoel je met 'mn recordseet is al gesloten'? Want, imo zou dat niets met je trigger mogen te maken hebben.
Hier ffkes de betreffende code en trigger

query
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
qrySQL = " INSERT INTO tblCountry " _
             & " (  cou_InternalCode, " _
             & "    cou_Countrygroup_ID, " _
             & "    cou_Phonenumberprefix, " _
             & "    cou_Currency_Code, " _
             & "    cou_DateformatLong, " _
             & "    cou_DateformatShort " _
             & " ) " _
             & " VALUES " _
             & " ( " & dbConn.FormatString(strInternalCode) & ", " _
             &         dbConn.FormatString(strCountrygroupID) & ", " _
             &         dbConn.FormatString(strPhonenumberPrefix) & ", " _
             &         dbConn.FormatString(strCurrencyCode) & ", " _
             &         dbConn.FormatString(strDateformatLong) & ", " _
             &         dbConn.FormatString(strDateformatShort) _
             & " ); SELECT SCOPE_IDENTITY() "
             
      'Retrieve and set the ID of the just inserted country
      Set rsQueryResult = dbConn.ExecQry(qrySQL)
      intCountryID = CInt(rsQueryResult(0))   '<---- rsQueryResult is gesloten?!?!?


trigger
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TRIGGER trgCountry_INSERT ON dbo.tblCountry 
FOR INSERT
AS
/*  When inserting a country, immidiatly insert a record to 
    tblCountryDescription for each language in tblLanguage. Use the country's 
    internal code as defaultvalue for the name field. */
    INSERT INTO tblCountryDescription (
        coud_Country_ID,
        coud_Language_Code,
        coud_Name
    )
    SELECT  
        cou_ID,
        lan_Code,
        cou_InternalCode
    FROM    inserted
    CROSS JOIN tblLanguage

[ Voor 10% gewijzigd door Verwijderd op 09-09-2003 14:38 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Moest ik van jou zijn, dan doe ik die INSERT INTO tblCountry en die SELECT scope_identity() dus in 1 Stored Procedure.

waarom doe je trouwens een cross join in je trigger? Is dat uit luiheid?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 09 September 2003 @ 14:37:
Moest ik van jou zijn, dan doe ik die INSERT INTO tblCountry en die SELECT scope_identity() dus in 1 Stored Procedure.

waarom doe je trouwens een cross join in je trigger? Is dat uit luiheid?
Ik zal het toch maar eens met een sproc proberen... vraag me niet waarom maar ze maken er hier helemaal geen gebruik van. Alle query's staan gewoon in een of andere asp file.

  • soepkip
  • Registratie: Augustus 2000
  • Laatst online: 21-06 09:59

soepkip

Kratjes kunnen nu ook voorin

@@identity werkt alleen goed als je in dezelfde transaction zit en blift. je kunt hem ook maar 1 maal opvragen hierna gooit die de waarde weer weg (is denk ik om veiligheidsredenen, dat je niet per ongelijk een ouide identity-waarde gaat gebruiken)

Beste film ooit


Verwijderd

whoami schreef op 09 September 2003 @ 14:34:
[...]


En hoe ga jij die trigger die waarde laten returnen?
Trouwens, dat is het probleem niet.

Als je een record insert in tabel A, en tabel A heeft een INSERT trigger die iets insert in tabel B.
Stel dat je dan het ID wilt terugkrijgen van het geinserte record in tabel A, en je doet:
code:
1
select @@identity

dan ga je het id terugkrijgen van het record in tabel B.
ja je hebt helemaal gelijk en dat weet ik ook wel..

Ik zei alleen maar dat je @@indentity in een variabele kan opslaan...
Ik gebruik dat nogal vaak als ik meerde queries NA elkaar uitvoert (in en Stored Procedure bijvoorbeeld). Dan werkt het prima..

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 09 September 2003 @ 14:55:
[...]


ja je hebt helemaal gelijk en dat weet ik ook wel..

Ik zei alleen maar dat je @@indentity in een variabele kan opslaan...
Ik gebruik dat nogal vaak als ik meerde queries NA elkaar uitvoert (in en Stored Procedure bijvoorbeeld). Dan werkt het prima..
Dat kan je idd doen, maar hier zou je het verkeerde resultaat gaan krijgen.
Je kan nl. de @@identity van het record in tblCountry's niet opvragen voordat de trigger uitgevoerd wordt. (Tenzij je die select @@identity in de trigger doet, maar dat is imo ranzig, en je kan die variabele niet returnen).

https://fgheysels.github.io/


Verwijderd

whoami schreef op 09 september 2003 @ 14:58:
[...]


Dat kan je idd doen, maar hier zou je het verkeerde resultaat gaan krijgen.
Je kan nl. de @@identity van het record in tblCountry's niet opvragen voordat de trigger uitgevoerd wordt. (Tenzij je die select @@identity in de trigger doet, maar dat is imo ranzig, en je kan die variabele niet returnen).
en daar heb je helemaal gelijk in :)

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
Verwijderd schreef op 09 September 2003 @ 14:36:
[...]
code:
1
2
3
      'Retrieve and set the ID of the just inserted country
      Set rsQueryResult = dbConn.ExecQry(qrySQL)
      intCountryID = CInt(rsQueryResult(0))   '<---- rsQueryResult is gesloten?!?!?
Kan het zijn dat de trigger voor een 'xx records affected' message zorgt? In dat geval zou je eens in rsQueryResult.NextRecordset kunnen kijken of die identity daar in zit.

Cuyahoga .NET website framework


Verwijderd

Topicstarter
tijn schreef op 09 september 2003 @ 15:44:
[...]

Kan het zijn dat de trigger voor een 'xx records affected' message zorgt? In dat geval zou je eens in rsQueryResult.NextRecordset kunnen kijken of die identity daar in zit.
Het had idd te maken met dat hij in een andere recordset zat. Normaal is één nextrecordset voldoende maar met een trigger op de tabel zit ie nog wat verder op. Ik gebruik nu SET NOCOUNT ON in m'n query en dan is het ook opgelost.

Allemaal bedankt voor het reageren.

[ Voor 5% gewijzigd door Verwijderd op 09-09-2003 15:55 ]


Verwijderd

Topicstarter
Weer wat nieuws geleerd ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je hebt de SP oplossing dus niet toegepast ?

Wat je wil best zou doen, is dan toch gebruik maken van een parametrized query ipv je query dmv string concatenation te gaan opbouwen.

https://fgheysels.github.io/

Pagina: 1