Ketika saya memasukkan ke dalam tabel menggunakan bukan pemicu @@Identity
,, IDENT_CURRENT('Table')
dan SCOPE_IDENTITY()
mengembalikan nol. Bagaimana saya bisa mendapatkan identitas terakhir dari baris yang dimasukkan?
sql-server
sql-server-2008
t-sql
trigger
identity
mehdi lotfi
sumber
sumber
inserted
tetapi tidak ada baris yang dimasukkan saatINSTEAD OF
pemicu.Jawaban:
Dengan pemicu INSTEAD_OF itu berarti belum ada sisipan yang terjadi. Anda tidak dapat mengetahui identitasnya karena belum dibuat. Mengintipkan nilai dari metadata dimungkinkan (
DBCC CHECKIDENT
) tetapi mengandalkannya tidak akan berfungsi dengan benar di bawah konkurensi dan di samping itu membutuhkan hak yang lebih tinggi.INSTEAD_OF pemicu sangat jarang diperlukan dan bau kode yang serius. Anda yakin membutuhkannya? Tidak bisakah Anda melakukan pekerjaan dengan pemicu SETELAH reguler?
sumber
Di alih-alih pemicu, Anda pasti bisa mendapatkan nilai yang dimasukkan ... tetapi tidak sampai setelah Anda melakukan memasukkan.
Hasil:
Sekarang bersihkan:
Sebagai tambahan, Anda seharusnya tidak pernah, pernah menggunakan
@@IDENTITY
atauIDENT_CURRENT()
tetap. DanSCOPE_IDENTITY
harus disediakan untuk situasi di mana Anda tahu hanya satu baris yang bisa dimasukkan. Kesalahpahaman umum dengan pemicu adalah bahwa mereka menjalankan per baris, seperti pada platform lain, tetapi dalam SQL Server mereka menjalankan per operasi - jadi masukkan multi-baris menggunakanVALUES(),(),()
atauINSERT...SELECT
- yangSCOPE_IDENTITY
akan Anda atur ke variabel Anda?sumber
Masalah Utama: Kerangka kerja Pemicu dan Entitas bekerja dalam lingkup yang berbeda. Masalahnya adalah, bahwa jika Anda menghasilkan nilai PK baru di pemicu, itu adalah ruang lingkup yang berbeda. Dengan demikian perintah ini mengembalikan nol baris dan EF akan melempar pengecualian.
Solusinya adalah dengan menambahkan pernyataan SELECT berikut di akhir Pemicu Anda:
di tempat * Anda dapat menyebutkan semua nama kolom termasuk
sumber