2011-10-18 63 views
7

根据MSDN,由简单选择组成的视图自动允许您在表上使用插入/更新/删除语句。有没有办法阻止 - 告诉Sql Server该视图是只读的,并且你不能用它来修改表格?在Sql Server中创建只读视图

回答

12

最好的办法是删除视图上的UPDATE/DELETE/INSERT权限。

除此之外,您可以在视图上创建一个INSTEAD OF触发器,该视图不会导致更新以静默方式失败,或者存在quite a few constructs that make views non updatable。所以你可以选择一个不会改变语义或效率,然后违反它的程序。

编辑:以下似乎符合法案。

CREATE VIEW Bar 
AS 
SELECT TOP 100 PERCENT x 
FROM foo 
WITH CHECK OPTION 
+0

+1权限应该防止这种无法使用的代码。但是,如果民间人士可以通过视图写作,那么我怀疑也有基准表的权限... – gbn

+0

谢谢,作品像一个魅力。 这些视图实际上会引用另一个用户无法访问的数据库。我想让它们只读,这样用户将无法通过他有权访问的数据库中的视图来修改他无权访问的数据库。我想使用每个数据库的权限而不是每个对象的权限来保持简单,并且更确定我不会错过权限定义中的违规。 –

+3

我会在末尾附上代码指出危险。它似乎取决于'WITH CHECK OPTION'。如果您回顾并使用SQL Server Management Studio编辑视图,它将不包含'WITH CHECK OPTION',视图将再次被读取/写入。 – BIBD

7

你可以为了使SQL Server指定UNION运营商INSERT/UPDATE过程中发生故障/ DELETE操作,像这样:

create view SampleView 
as 
    select ID, value from table 
    union all 
    select 0, '0' where 1=0 

最后的查询不返回任何行但必须具有与第一个查询具有相同数据类型的相同数量的字段,才能安全使用UNION。请参阅此链接以获取更多信息:Different ways to make a table read only in a SQL Server database

+0

您还可以添加“UNION SELECT TOP 0 * FROM表”(至少在SQLServer 2014中)。 – Christoph