【问题标题】:SqlServer2008 - Can I Alter a Scalar Function while it is referenced in many placesSqlServer2008 - 我可以在很多地方引用标量函数时更改它吗
【发布时间】:2011-02-14 00:52:32
【问题描述】:

我们有一个返回日期时间的标量函数。它执行几个快速表选择以获取其返回值。这个函数已经在整个数据库中使用 - 在默认约束、存储过程等中。我想更改函数的实现(以删除表命中并提高效率)但显然我不能这样做它被数据库中的其他对象引用。 我真的需要更新或删除数据库中引用它的每个对象,更新函数,然后更新或重新创建所有这些对象以恢复对函数的引用吗?
该函数被少数视图、触发器、几个函数以及大量默认约束和存储过程引用。

感谢您提供的任何见解。

我尝试更改或删除函数时遇到的错误是:

无法 [ALTER|DROP FUNCTION] 'dbo.GetClientCurrentTime' 因为它被对象 'DF_tbl_PatientOrder_Note_RecordCreated' 引用。

【问题讨论】:

  • 如果您在派生列中使用它,您将需要暂时删除列。存储过程中的使用不需要修改。不确定默认约束的用法。
  • 当它被数据库中的其他对象引用时,我显然不能这样做 - 你遇到了什么错误,什么时候?

标签: sql-server tsql user-defined-functions


【解决方案1】:

如果输入参数和输出类型不变,您应该可以进行任何您需要进行的内部修改而不会造成任何麻烦。

【讨论】:

  • 这当然是我的想法。事实上,我也应该能够做出破坏性的改变——结果就是我破坏了它。但是根本无法更改功能,期间?这似乎是一个相当荒谬的限制。所以我想我一定是错过了一些可以让我改变或放弃功能的箍。
  • 其实错了。如果函数有WITH SCHEMABINDING 并且某些对象引用它,您将无法对其运行任何更改...
【解决方案2】:

这取决于。如果引用该函数的对象具有WITH SCHEMABINDING 选项,那么您将被明确阻止与他的函数混淆。否则,唯一的限制是普通的 DDL 访问锁定限制,这意味着使用该函数的执行计划将在该函数上放置模式稳定性锁,这将阻止您的 ALTER FUNCTION 语句,因为它们需要模式修改锁。但这会在计划执行完毕后自行解决。

【讨论】:

  • 我已将我遇到的错误添加到问题的正文中。我在文档中查找了 SCHEMABINDING ,但找不到一种方法来确定它是为对象打开还是为对象关闭它。您是否希望错误消息表明问题与 SCHEMABINDING 相关?你知道有什么方法可以关闭它吗?感谢您的帮助。
  • 什么是DF_tbl_PatientOrder_Note_RecordCreated?另一个函数,一个派生列,一个检查约束?
  • DF_tbl_PatientOrder_Note_RecordCreated 是默认约束。该函数仅被少数视图、触发器、几个函数以及大量默认约束和存储过程引用。
  • 那真是太可惜了。 Afaik 你将不得不放弃约束,改变函数,然后重新添加约束。与 CHECK 约束不同,不能禁用 DEFAULT 约束。也许其他人有一个巧妙的技巧来规避这个问题,但我不知道。
  • 一种稍微不那么痛苦的方法,而不是完全删除计算列,是重新定义列以返回正确数据类型的任意常数,修改您的函数,然后使用您更改的重新应用计算列公式功能。我确实说过“稍微少一点”痛苦。
猜你喜欢
  • 2012-08-18
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2022-07-04
  • 1970-01-01
相关资源
最近更新 更多