获取标识而不是插入触发器

时间:2017-01-12 17:19:37

标签: java sql-server hibernate triggers

我正在使用Hibernate和MSSQL服务器编写与现有数据库集成的软件。桌子上有一个instead of insert触发器,我需要插入它,它会弄乱@@Identity,这意味着在Hibernate的save上我无法获得插入行的id。我无法控制触发器(无法修改它)。我看到this问题,但它涉及程序,我的触发器没有,所以我认为我的问题不同。我不能发布整个触发器,但希望我可以发布足够的内容来解决问题:

CREATE TRIGGER TrigName ON TableName
INSTEAD OF INSERT
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
-- several DECLARE, SET statements
-- a couple of inserts into other tables for business logic
-- plain T-SQL statements without procedures or functions
...

-- this is the actual insert that i need to perform
-- to be honest, I don't quite understand how INSERTED table 
-- was filled with all necessary columns by this point, but for now
-- I accept it as is (I am no SQL pro...)
INSERT INTO ClientTable (<columns>)
SELECT <same columns> from INSERTED

-- a couple of UPDATE queries to unrelated tables
...

COMMIT TRANSACTION;

我想知道是否有可靠的方法来获取插入行的ID?我想到并尝试制作的一个解决方案是在同一个表上安装on insert触发器,将新插入的行写入我添加到数据库中的新表中。我将该表用作队列。在Hibernate中进行事务提交后,我可以进入该表并使用我刚插入的信息运行select(我仍然可以从同一方法范围访问它),我可以获取id并最终删除该行。这是一个庞大的解决方案,但到目前为止我能想出最好的解决方案。

非常感谢一些帮助。我无法修改现有的触发器和过程,但如果它绝对不影响现有逻辑(如新表和on insert触发器),我可以向db添加内容。

总结一下:我需要找到一种方法来获取我刚刚插入Hibernate的save调用的行的ID。由于instead of insert触发器,hibernate总是返回identity = 0。我需要找到一种获取该ID的方法,因为我需要在一次事务中在其他几个表中执行插入操作。

1 个答案:

答案 0 :(得分:0)

我想我找到了 我的问题的答案。回复@ SeanLange的评论:我实际上无法编辑插入代码 - 它是由另一个应用程序完成的,并且需要更改的查询将花费太长时间(或者不会发生 - 它是遗留应用程序)。我所做的是在同一个表上插入另一个触发器on insert。由于我知道现有instead of insert触发器中的操作顺序,因此我可以看到最后insert操作将出现在我想要的表中,这意味着我的on insert触发器将在此之后立即触发。在该触发器的范围内,我可以访问inserted表,从中我拿出id。

CREATE TRIGGER Client_OnInsert ON myClientTable
FOR INSERT
AS
BEGIN
  DECLARE @ID int;
  SET @ID = (select ClientID from inserted);
  INSERT INTO ModClient (modClientId)
  OUTPUT @ID
  VALUES (@ID);
END
GO

然后在Hibernate中(因为我不能再使用save()),我使用NativeQuery来执行此插入。我设置参数并运行NativeQuery的list()方法,该方法返回List,其中第一个也是唯一的参数是我想要的id。

我知道,这是一种笨重的方式。如果有任何非常糟糕的东西会让人们感到高兴 - 请告诉我。我真的很感激对此的一些反馈。但是,我想将此答案作为迄今为止有效的潜在答案发布,但这并不意味着它非常好。为了使这个解决方案起作用,我必须创建另一个小表ModClient,为了这个目的,我将不得不将其用作临时id存储。