是否可以在 SQL Server 中使用 nolock 更改视图?

Posted

技术标签:

【中文标题】是否可以在 SQL Server 中使用 nolock 更改视图?【英文标题】:Is it possible to alter view with nolock in SQL Server? 【发布时间】:2017-08-26 02:30:12 【问题描述】:

是否允许使用 nolock 更改视图?如果是这样,我应该如何使用它?

ALTER VIEW dbo.xx_view 
AS
    SELECT * 
    FROM dbo.yy

我目前的问题是我必须等待其他人完成使用dbo.xx_view,然后才能更改视图。有没有一种方法可以强制更改视图,即使其他人正在对其进行查询。

【问题讨论】:

NOLOCK 与“锁定”视图定义无关。 “查询提示”恰好是 SQL 世界中更为普遍和持久的坏习惯之一。这里有几篇文章可以帮助您快速了解... blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere ... sqlstudies.com/2015/03/18/why-not-nolock 说 HINTS 实际上是从选项中禁用优化器也很有帮助。 Microsoft 在其文档页面中煞费苦心地强调,专业 DBA 将它们用作最后​​的手段。 HINTS - Microsoft Docs 另外,请理解,除非这是一个物化视图,否则 VIEWS 是硬编码的查询。在用户完成之前,您将无法修改它们,因为这将需要使查询在执行时使用的 sql 计划无效。 【参考方案1】:

您可以像任何其他选择语句一样指定它:

ALTER VIEW dbo.xx_view AS
SELECT * FROM dbo.yy WITH (NOLOCK)

或者,您可以按照here 的建议在视图上查询时提供 NOLOCK 提示:

 SELECT * FROM dbo.xx_view WITH (NOLOCK)

在后一种情况下,您在视图中的查询不需要提供 NOLOCK 提示。

【讨论】:

您好 Nisarg,感谢您的回复!我正在考虑是否可以更改视图 dbo.xx_view,即使其他人正在使用 dbo.xx_view。我目前遇到的问题是我必须等到他们完成使用 dbo.xx_view,然后才能更改视图。我或多或少在想ALTER VIEW dbo.xx_view WITH (NOLOCK) AS SELECT * FROM dbo.yy 这不起作用... 我从来没有遇到过这样的问题。如果您尝试更改它,您会收到任何错误吗? 不,没有错误。该进程只是暂停以等待另一个进程完成。

以上是关于是否可以在 SQL Server 中使用 nolock 更改视图?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?

是否可以在具有 WebAPI 服务的 3 层体系结构的 SQL Server 数据库中使用 Windows 身份验证?

是否可以在 SQL Server 中创建只读同义词?

是否可以在 SQL Server 中创建一个可以处理序列的函数?

是否可以使用实体框架在 SQL Server CE 中实现 CommitMode.Immediate

是否可以在 SQL Server 中查询空扩展属性?