Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Impeça o acesso de usar a identidade errada ao anexar à tabela vinculada no servidor SQL


Um rastreamento ODBC revela que o Access está de fato chamando SELECT @@IDENTITY (ao contrário de SCOPE_IDENTITY() ) após inserir a linha na tabela vinculada do SQL Server:
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

Além disso, esse comportamento parece depender do driver ODBC que está sendo usado, pois um teste semelhante com o MySQL Connector/ODBC mostra que o Access não chama a função MySQL correspondente LAST_INSERT_ID() depois de inserir uma linha em uma tabela vinculada do MySQL.

Dado que o Access está chamando SELECT @@IDENTITY , devemos modificar nosso gatilho da seguinte forma (fonte: aqui ) para redefinir o valor @@IDENTITY de volta ao seu valor original
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)