【问题标题】:Insert parent child record using transaction [Executing successfully but record not inserted]使用事务插入父子记录[执行成功但未插入记录]
【发布时间】:2018-09-26 08:36:22
【问题描述】:

我想使用事务将记录插入到分层表中。执行其显示命令后成功完成但记录未插入表中。如果缺少某些内容,请参阅以下脚本:

CREATE TABLE dev_emp_master
(
id int identity(1,1) primary key, 
name char(2)
)
GO
CREATE TABLE dev_emp_child
(
id int identity(1,1) primary key, 
mid int foreign key references dev_emp_master(id),
addr char(3)
)

BEGIN TRANSACTION [T_MIGRATION]
BEGIN TRY
DECLARE @masterId INT;
SET IDENTITY_INSERT [dbo].[dev_emp_master] OFF;
INSERT INTO dev_emp_master (name) VALUES('A');
SET @masterId = scope_identity();
SET IDENTITY_INSERT [dbo].[dev_emp_child] OFF;
INSERT INTO dev_emp_child(mid,addr) VALUES(@masterId,'ABC');
SET IDENTITY_INSERT [dbo].[dev_emp_child] ON;
SET IDENTITY_INSERT [dbo].[dev_emp_master] ON;
COMMIT TRANSACTION [T_MIGRATION]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION [T_MIGRATION]
END CATCH
GO

【问题讨论】:

  • 您使用的是哪个 dbms? (sql server?)
  • @jarlh: MS SQL SERVER
  • 您正在自己隐藏错误消息。而且不知道你在用这些IDENTITY_INSERT 开关做什么。
  • I've to on identity... 为什么?删除所有这些行。 OFFON.
  • Identity Insert 默认关闭,如果您在会话期间将其设置为打开,则它只有“打开”。如果您的解决方案需要您手动插入标识值,最好不要将列声明为标识。

标签: sql sql-server


【解决方案1】:
SET IDENTITY_INSERT [dbo].[dev_emp_child] ON;
SET IDENTITY_INSERT [dbo].[dev_emp_master] ON;

这就是问题所在。不能同时为两个表打开 Identity_Insert。

如果你放一个

,你可以很容易地对你的代码进行故障排除
 Print ERROR_MESSAGE() 

在你的 catch 块中。

【讨论】:

  • 哦!知道了。但是有什么办法可以避免这种情况吗?因为无论如何,如果我已经完成了身份验证。
  • 我猜你很困惑:IDENTITY_INSERT ON 意味着你可以手动将一个值插入到标识列中。 OFF 表示 SQL Server 控制标识值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2011-05-25
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多