Server要求用户具有ALTER权限,以便将特定值插入标识列。
考虑到插入显然是DML操作,这似乎有点奇怪。
要解释为什么这对我来说是个小问题,首先要记住,数据库不会在事务回滚时回滚标识值。这是因为数据库允许并发插入多个事务。
因此,如果稍后插入行的事务失败并必须重复,则可以安全地重用从第一次尝试中检索到的标识值。
我正在编写一个数据库编辑器,这种方法使复杂插入的实现更加容易:用户正在逐步构建一个需要键的相关表行的图表,但这些键是由数据库生成的。ORMs为此使用临时键,并在提交后重写所有内容,但这显然更难实现。对于每一个新的插入步骤,都更容易进入数据库,获取标识值,然后回滚。只有当用户最后单击“保存”时,事务才会被提交,并且值应该仍然很好。
这适用于MySQL和Postgres等其他数据库,但Server需要一个令人惊讶的高级别权限。
我的问题是,这是为什么,以及这是否可能是其他一些问题的明确插入身份值,我已经错过了。
发布于 2022-12-21 15:28:18
我没有这个理由的来源,但是不加区分地使用这个设施肯定会引起问题。
例如(假设int标识列具有正增量)显式插入2147483647作为标识值,将导致依赖身份增量的所有后续插入失败,直到有人手动运行RESEED或以其他方式排序。
您可以使用SEQUENCE而不是IDENTITY列来分配代理项键列值。在本例中,也不需要实际插入行并将其回滚--只需从序列中获取下一个值。
https://dba.stackexchange.com/questions/321264
复制相似问题