根据MSDN,由简单select组成的视图会自动允许您在表上使用insert/update/delete语句。是否有一种方法可以防止这种情况-告诉Sql服务器该视图是只读的,并且不能用于修改表?
UPDATE/DELETE/INSERT
权限。INSTEAD OF
触发器,什么也不做以使更新默默失败,或者有相当多的结构使视图无法更新。因此,您可以选择一个不会改变语义或效率的构造,然后违反它。
编辑:下面似乎符合要求。CREATE VIEW Bar
AS
SELECT TOP 100 PERCENT x
FROM foo
WITH CHECK OPTION
您可以在SQL Server中指定一个UNION
操作符,以使INSERT/UPDATE/DELETE
操作失败,像这样:
create view SampleView
as
select ID, value from table
union all
select 0, '0' where 1=0
最后一个查询根本没有返回任何行,但必须与第一个查询具有相同数量的字段和相同的数据类型,才能安全使用 UNION
。欲了解更多信息,请参见此链接:在 SQL Server 数据库中使表只读的不同方法
处理这个问题的最佳方式是允许对视图进行选择性访问。或者拒绝给定用户的插入/更新/删除访问权限。这样可以完美地解决问题。同时创建视图 "WITH (NOLOCK)"。
SELECT TOP 100 PERCENT
与WITH CHECK OPTION
结合起来,以使对该视图的写入尝试失败。在我的2014年版本测试中,只有其中一个仍然允许更新视图。 - Ben