【问题标题】:Refreshing metadata on user functions t-SQL刷新用户函数 t-SQL 上的元数据
【发布时间】:2023-03-30 21:59:01
【问题描述】:

我正在做一些 T-SQL 编程,我的数据库上有一些视图定义。这些天数据模型仍在变化,我定义了一些表函数。有时我故意使用

 select * from MYVIEW

在这样的表函数中返回所有列。如果视图更改(或表格),则函数崩溃,我需要重新编译它。我知道这通常是一件好事,因此它可以防止地狱般的错误,但仍然......

有没有办法编写这样的函数,这样每次我在底层表上更改某些东西时,我的脸就不会爆炸?或者也许我做错了什么......

感谢您的帮助

【问题讨论】:

    标签: sql-server tsql sql-server-2008


    【解决方案1】:

    gbn's answer 是最好的——但是当你有 SCHEMABINDING 时,这通常会阻止你在没有先删除 SCHEMABINDING 然后在重新创建模块时替换它的情况下进行底层更改。如果您的对象引用数据库之外的对象,则不能使用 SCHEMABINDING。

    如果这个难度太大你不希望或不能使用 SCHEMABINDING,那么在某种常规过程中使用sp_refreshsqlmodule,你运行该过程以在实际使用 SQL 模块之前检查它们是否存在错误(它可以在任何非模式绑定视图、UDF、存储过程等上运行)是你的朋友。

    您可以同时使用这两种技术 - 您不能(也没有必要)针对模式绑定对象运行 sp_refreshsqlmodule。

    例如,您只能在这些模块上运行它:

    SELECT *
    FROM    INFORMATION_SCHEMA.ROUTINES
            WHERE   (
                     OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)), N'IsSchemaBound') IS NULL
                     OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)),
                                       N'IsSchemaBound') = 0
                    )
    

    【讨论】:

    • 我不知道这存在,因为我只使用 SCHEMABINDING。有用。
    • @gbn - 我尽可能使用 SCHEMABINDING,但它不能跨数据库工作(这是正确的),它只能在其他模式绑定对象之上工作 - 如果链中的任何对象不能受模式约束,您对 SCHEMABINDING 的使用到此结束。在这种情况下,可以使用 sp_refreshsqlmodule 充分监控破坏性外部更改,然后它们才会真正破坏任何东西。 sp_refreshsqlmodule 将导致 SQL Server 2005 中的表值 UDF 上的扩展属性丢失(但是当您更改它们以删除并重新添加 SCHEMABINDING 时,这种情况已经发生)。
    【解决方案2】:

    将视图定义为“WITH SCHEMABINDING”

    我会在此处向您推荐我的答案,其中涵盖了类似的内容...

    “select * from table” vs “select colA,colB,etc from table” interesting behaviour in SqlServer2005

    在这种情况下,问题不在于 udf,而在于没有 SCHEMABINDING 时视图的行为方式

    编辑:Cade Roux 的 sp_refreshsqlmodule 可能会解决问题。我没用过。

    【讨论】:

    • 我不相信这能达到他的目的。他想用 select * 更改视图中使用的表。从 MSDN SCHEMABINDING 中阅读以下内容 [...]此外,如果参与具有架构绑定的视图的表上的 ALTER TABLE 语句影响视图定义,则这些语句将失败。我认为这正是luckluke 不希望的行为。
    • @doug_w:hobson 的选择:使用 WITH SCHEMABINDING 或每次运行 sp_refreshview。没有其他选择。您可能还想阅读我引用相同链接的其他答案。仅供参考,我在所有视图和 udf 中都使用 SCHEMABINDING。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多