24/07/2005
Problema: Access riceve un valore @@Identity
sbagliato se la tabella ha un trigger che inserisce una o più righe in un'altra
tabella che ha un campo di tipo contatore.
Riferimento:
ACC2002: @@IDENTITY Returns
Incorrect Identity Column Value
Soluzione:
All'interno del trigger viene salvato il valore della variabile
@@Identity e prima di uscire, viene inserita una riga nella tabella
temporanea #Tmp. L'inserimento viene eseguito utilizzando la
IDENTITY (Function) il cui secondo parametro, (seed), è valorizzato all'
Identity precedentemente salvato.
Con questo trucchetto forziamo Sql Server a rendere nella variabile @@Identity
il valore dell'Id assegnato a Tabella1.
Questa soluzione evita di eseguire il refresh dela maschera che nei progetti ADP di Access implica la rilettura di tutto il recordset.
Esempio
------------------------------------------
USE
Northwind
GO
-- Creo la prima tabella (Tabella1)
-- il valore dell'identity partirà da 1
CREATE TABLE
Tabella1
(
ID Int NOT NULL IDENTITY (1,1)
Primary Key,
Campo1 Varchar(50)
)
GO
-- Creo la seconda tabella (Tabella2)
-- il valore dell'identity partirà da 100
CREATE TABLE
Tabella2
(
ID Int
NOT NULL IDENTITY (100,1)
Primary Key,
Campo1 Varchar(50)
)
GO
-- Creo il trigger
CREATE TRIGGER
TR_Tabella1 ON dbo.Tabella1
FOR INSERT
AS
SET NOCOUNT ON
-- Dichiaro le variabili
DECLARE
@Identity
Int,
@sql Nvarchar(100)
-- Salvo L'identity
SET @Identity=@@Identity
-- Inserisco la riga in tabella 2
INSERT
Tabella2
SELECT
Campo1
FROM INSERTED
-- Ripristino il valore dell'identity salvato
SET @Sql=N'SELECT Identity(int,'+Convert(nvarchar,@Identity)+',1) as Id INTO #Tmp'
EXEC
sp_executesql @Sql
GO
------------------------------------------
Aprite un progetto ADP di Access,
collegatelo al database NorthWind e provate ad inserire alcune righe in
Tabella1.
L'errore non si presenterà.
Un ringraziamento a Nik Sestrin che già nel settembre 2001 suggerì questa
soluzione.
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&selm=O1BcqJTQBHA.1788%40tkmsftngp05
Giorgio Rancati
Torna all'indice