在您自己的表中使用 OBJECT_ID() 作为引用是否安全,假设无论如何该值将始终引用同一个数据库对象?
msdn声明_
所有元数据函数都是不确定的。这意味着这些函数在每次调用时并不总是返回相同的结果,即使使用相同的输入值集也是如此。
所以这表明它不安全,但我找不到任何(其他)确凿的事实表明它不应该这样做,而且,公平地说,没有人实际这样做的例子,这本身可能是不这样做的证据做。
但是值 OBJECT_ID() 是(或似乎是)在系统表和视图中用作从一个对象到另一个对象的键,因此必须具有某种形式的完整性和可靠性。
作为记录:我不一定需要它,但它只是在设计我的系统时作为一个选项突然出现在我的脑海中,并且很好奇。
不要为您的应用程序依赖 object_id。
我的经验是,一旦创建了一个对象,只要该对象存在,它的 object_id 就会保持稳定。困难在于知道“只要它存在”的含义。
如果对象被删除并重新创建,它将获得一个新的 object_id,即使两次使用完全相同的语句,创建一个具有相同名称的对象。
如果创建脚本针对不同的数据库(例如 DEV 和 TEST)运行,它将生成不同的 object_id。
如果数据库被恢复,旧的 object_id 值可能会重新出现。
最危险的是 object_ids 的稳定性没有记录,因此无法保证。如果 MS 确定这是他们出于任何原因想要做的事情,补丁、升级、安全补丁或其他任何东西都可能会更改现有对象的 ID。
MS 可以在他们的内部元数据中使用 object_id,因为他们知道所有可以使这些值无效的地方,并且可以相应地编写他们的代码。他们没有公布这些细节供我们作为应用程序程序员考虑。
如果您需要以数据驱动的方式引用对象,请存储它们的名称。使用正确的数据类型 (SYSNAME),并且不要忘记存储对象的模式。如果必须传递数值,则有一些选项。可以添加一个身份列。环境之间以及删除和重新添加对象时的值会有所不同。真的,这并不比object_id好。更好的方法可能是计算架构和对象名称的哈希。如果使用的散列算法被广泛传播,每个消费者都应该能够按需生成它。如果您对对象的名称有权限(这似乎是因为您正在编写它们),您可以简单地选择相应的 id 并发布它们。不要忘记 name 和 id 列的唯一约束!