sql >> Databáze >  >> RDS >> Sqlserver

Zabraňte Accessu v používání nesprávné identity při přidávání do propojené tabulky na SQL serveru

Trasování ODBC odhalí, že Access skutečně volá SELECT @@IDENTITY (na rozdíl od SCOPE_IDENTITY() ) po vložení řádku do propojené tabulky 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

Navíc se zdá, že toto chování závisí na používaném ovladači ODBC, protože podobný test s MySQL Connector/ODBC ukazuje, že Access nevolá odpovídající funkci MySQL LAST_INSERT_ID() po vložení řádku do propojené tabulky MySQL.

Vzhledem k tomu, že Access volá SELECT @@IDENTITY , musíme upravit náš spouštěč následovně (zdroj: zde ) pro resetování hodnoty @@IDENTITY zpět na původní hodnotu

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. Generování UUID v Postgres pro příkaz Insert?

  2. těžký dotaz, který mi chcete napsat do mysql?

  3. SQL dotaz s připojením k získání vnořeného pole objektů

  4. Získání duplicitního počtu při provádění INSERT IGNORE přes JDBC