在Sql Server中创建只读视图

Ida*_*rye 9 sql-server views

根据MSDN,由简单选择组成的视图自动允许您在表上使用insert/update/delete语句.有没有办法防止这种情况 - 告诉Sql Server该视图是只读的,你不能用它来修改表?

Mar*_*ith 15

最好的方法是删除UPDATE/DELETE/INSERTView的权限.

除此之外,你可以INSTEAD OF在视图上创建一个触发器,它只是无助于使更新无声地失败,或者有很多构造使视图不可更新.因此,您可以选择一个不会改变语义或效率然后违反它的方法.

编辑:以下似乎符合条例草案.

CREATE VIEW Bar
AS
SELECT TOP 100 PERCENT x
FROM foo
WITH CHECK OPTION
Run Code Online (Sandbox Code Playgroud)

  • 我会指出附加到最后的代码的危险.它似乎取决于'WITH CHECK OPTION'.如果您使用SQL Server Management Studio重新编辑View,则不会包含'WITH CHECK OPTION',视图将再次读/写. (4认同)

Gui*_*rez 11

您可以指定一个UNION运算符,以便在INSERT/UPDATE/DELETE操作期间使SQL Server失败,如下所示:

create view SampleView
as
  select ID, value from table
  union all
  select 0, '0' where 1=0
Run Code Online (Sandbox Code Playgroud)

最后一个查询根本不返回任何行,但必须具有与第一个查询相同数据类型的相同数量的字段,才能UNION安全使用.有关详细信息,请参阅此链接:使表只在SQL Server数据库中读取的不同方法

  • 您还可以添加"UNION SELECT TOP 0*FROM表"(至少在SQLServer 2014中). (3认同)