Laden...

SCOPE_IDENTITY() Gültigkeitsbereich

Erstellt von the_lmich vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.030 Views
the_lmich Themenstarter:in
248 Beiträge seit 2005
vor 16 Jahren
SCOPE_IDENTITY() Gültigkeitsbereich

Hallo,

ich benötige den letzten eingefügten Int-Werte einer Tabelle innerhalb des SQL-Server 9.0. Da ich eine Schnittstelle gebaut habe, die von n Clients benutzt werden kann, mache ich mir etwas Sorgen um die Konsistenz.

Da INSERT() und SCOPE_IDENTITY() ja zwei Anweisungen für den Server sind, kann es theoretisch sein, dass eine andere Anwendung meine zuletzt eingefügte ID abholt. (Wir gehen mal davon aus, das die Tabelle nicht gelockt ist.)

In der MSND Lib steht zwar:
Gibt den letzten Identitätswert zurück, der in eine Identitätsspalte im selben Gültigkeitsbereich eingefügt wurde. Ein **Gültigkeitsbereich **ist ein Modul: eine gespeicherte Prozedur, ein Trigger, eine Funktion oder ein Batch. Daher befinden sich zwei Anweisungen im selben Gültigkeitsbereich, wenn sie sich in derselben gespeicherten Prozedur, in derselben Funktion oder im selben Batch befinden.

Stellt sich für mich nun die Frage, ob das auch für eine System.Data.IDbTransaction **gültig **ist?

Viele Grüße
🙂 Torsten

Gelöschter Account
vor 16 Jahren

ja

3.511 Beiträge seit 2005
vor 16 Jahren

Wobei du deine Frage schon beantwortet hast:

...oder im selben Batch befinden

Somit innerhalb einer Transaktion. Da du mit dem SQL 2005 arbeitest, solltest du dir mal das OUTPUT Statement bei einem INSERT anschauen. Das ist auf jeden Fall transaktionssicher.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

the_lmich Themenstarter:in
248 Beiträge seit 2005
vor 16 Jahren

Vielen Dank!

PS: Batch war für mich nicht zwangsläufig eine Transaktion, aber wenn das so definiert ist. Umso besser.

J
1.114 Beiträge seit 2007
vor 16 Jahren

Noch ergänzend dazu gibt es die Variable @@IDENTITY im SQL Server. Im Gegensatz zu SCOPE_IDENTITY() kann es mit der @@ Variable zu Problemen kommen, wenn innerhalb einer SQL Anweisung noch Trigger ausgelöst werden, denn dann liefert @@IDENTITY den letzten Wert der eventuell aus einem Trigger stammt... Deshalb ist auf jeden Fall SCOPE_IDENTITY() vorzuziehen.