Wil*_*mpt 4 sql-server metadata
在您自己的表中使用 OBJECT_ID() 作为引用是否安全,并假设无论如何该值将始终引用同一个数据库对象?
在MSDN状态
所有元数据函数都是不确定的。这意味着这些函数在每次调用时并不总是返回相同的结果,即使输入值相同。
所以这表明它不安全,但我找不到任何(其他)确凿的事实不应该这样做,而且,公平地说,没有人们实际这样做的例子,这本身可能是不这样做的证据做吧。
但是 OBJECT_ID() 值(或似乎)在系统表和视图中用作从一个对象到另一个对象的键,因此必须具有某种形式的完整性和可靠性。
作为记录:我不一定需要它,但它只是在设计我的系统时作为一个选项突然出现在我的脑海中,并且很好奇。
Mic*_*een 11
不要依赖 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 列的唯一约束!
归档时间: |
|
查看次数: |
294 次 |
最近记录: |