SQL Server触发器'Default (newsequentialid())'不适用于'0

本文关键字:不适用 适用于 Default Server 触发器 SQL newsequentialid | 更新日期: 2023-09-27 18:05:05

我有一个以Guid列为主键的实体。

默认为(newsequentialid())。所以如果我传递NULL,它会生成Guid

现在我使用这个数据库与BDC模型的东西。问题是,这个自动生成的代码不传递NULL的ID与新对象的创建,相反,它可能只使用new Guid(),即00000000-0000-0000-0000-000000000000。所以我的默认约束不工作,我得到一个主键约束违反错误…

那么有可能用触发器捕获这个问题吗?也许先检查一下Id是否为0000…然后生成一个有效的?

SQL Server触发器'Default (newsequentialid())'不适用于'0

您可以使用触发器,尽管正如其他人指出的那样,这将是一个不明智的解决方案,因为在代码和数据之间引入了一个看不见的hack。真正的解决方案是更改ORM,使其不尝试直接插入GUID,因为这是数据库生成的。

所以忽略我的答案的其余部分。

<引用类>

SqlServer不支持BEFORE触发器,但您可以使用INSTEAD OF TRIGGER
在SomeTable上创建触发器tSomeTable而不是INSERT

开始
INSERT INTO SomeTable(SomeKey, Name)
选择
当i.SomeKey = '0000000 -0000000 -0000000 -0000000 -000000000000'
THEN newid() ELSE i.SomeKey END,
i.Name

FROM insert i;

结束这里的

SqlFiddle

通过生成有效Guid的Guid.NewGuid()