sql >> Databasteknik >  >> RDS >> Sqlserver

Stoppa åtkomst från att använda fel identitet när du lägger till en länkad tabell på SQL-servern

En ODBC-spårning avslöjar att Access verkligen anropar SELECT @@IDENTITY (i motsats till SCOPE_IDENTITY() ) efter att ha infogat raden i den länkade SQL Server-tabellen:

Database1       e00-1490    EXIT  SQLExecDirectW  with return code 0 (SQL_SUCCESS)
        HSTMT               0x00000000004D6990
        WCHAR *             0x000000000F314F28 [      -3] "INSERT INTO  "dbo"."Table1"  ("txt") VALUES (?)\ 0"
        SDWORD                    -3

...

Database1       e00-1490    EXIT  SQLExecDirectW  with return code 0 (SQL_SUCCESS)
        HSTMT               0x00000000004D6990
        WCHAR *             0x000007FED7E6EE58 [      -3] "SELECT @@IDENTITY\ 0"
        SDWORD                    -3

Dessutom verkar detta beteende bero på ODBC-drivrutinen som används, eftersom ett liknande test med MySQL Connector/ODBC visar att Access inte anropar motsvarande MySQL-funktion LAST_INSERT_ID() efter att ha infogat en rad i en MySQL-länkad tabell.

Med tanke på att Access anropar SELECT @@IDENTITY , måste vi ändra vår utlösare enligt följande (källa: här ) för att återställa @@IDENTITY-värdet till dess ursprungliga värde

create trigger mytable_insert_trigger on mytable for insert as

declare @identity int
declare @strsql varchar(128)

set @[email protected]@identity
--your code
--insert into second table ...
--your code
set @strsql='select identity (int, ' + cast(@identity as varchar(10)) + ',1) as id into #tmp'
execute (@strsql)


  1. MySQL - ignorera infogningsfel:dubblettpost

  2. Anslut MS SQL Server-databas till Oracle 11g-databas

  3. Hur kan jag skapa en kohortanalystabell varje vecka med mysql?

  4. PHPExcel och textomslag