SQL Server 要求用户具有 ALTER TABLE 权限才能将特定值插入 IDENTITY 列。
这似乎有点奇怪,因为插入显然是 DML 操作。
要解释为什么这对我来说有点问题,首先要记住数据库不会在事务回滚时回滚标识值。这是因为数据库允许同时插入多个事务。
因此,如果稍后插入行的事务失败并且必须重复,则可以安全地重新使用已经从第一次尝试中检索到的标识值。
我正在编写一个数据库编辑器,这种方法使复杂插入的实现变得更加容易:用户逐渐构建需要键的相关表行的图形,但键是数据库生成的。ORM 为此使用临时键并在提交后重写所有内容,但这显然更难实现。对于每个新的插入步骤总是去数据库,获取标识值,然后回滚会更容易。只有当用户最后点击保存时,事务才会被提交,并且值应该还是没问题的。
这适用于其他一些数据库,如 MySQL 和 Postgres,但 SQL Server 有一个需要惊人的高级别特权的怪癖。
我的问题是为什么会这样,以及这是否可能表明我到目前为止错过的关于显式插入标识值的其他一些问题。