Sql server SQL:检测现有视图是否支持插入或更新

Sql server SQL:检测现有视图是否支持插入或更新,sql-server,sql-insert,sql-view,Sql Server,Sql Insert,Sql View,我有一个应用程序,允许用户在SQL中定义自己的视图,然后让应用程序生成有关该视图的元数据。这非常简单,因为信息\u schema.columns告诉我视图使用的列/类型 但是,是否有一种方法可以确定视图是否可以接受INSERT或UPDATE查询,而无需亲自解析SQL或执行测试插入并检查错误/回滚事务?我在这里假设SQL Server、YMMV和其他RDBMS产品 假设您没有使用INSTEAD OF触发器,则没有指示视图是否可更新的标志或查询,这可能是因为对于某些更新类,视图是可更新的,但对于其他

我有一个应用程序,允许用户在SQL中定义自己的视图,然后让应用程序生成有关该视图的元数据。这非常简单,因为
信息\u schema.columns
告诉我视图使用的列/类型


但是,是否有一种方法可以确定视图是否可以接受INSERT或UPDATE查询,而无需亲自解析SQL或执行测试插入并检查错误/回滚事务?

我在这里假设SQL Server、YMMV和其他RDBMS产品

假设您没有使用INSTEAD OF触发器,则没有指示视图是否可更新的标志或查询,这可能是因为对于某些更新类,视图是可更新的,但对于其他更新类,视图是不可更新的

Per:

可更新视图

您可以修改基础基表的数据 通过视图,只要满足以下条件:

  • 任何修改,包括UPDATE、INSERT和DELETE语句,都必须只引用一个基表中的列
  • 视图中正在修改的列必须直接引用表列中的基础数据
  • 不能以任何其他方式派生列,例如通过以下方式:聚合函数:AVG、COUNT、SUM、MIN、MAX、, 分组、STDEV、STDEVP、VAR和VARP
  • 无法从使用其他列的表达式计算该列。使用集合运算符联合形成的列, “全部并集”、“交叉连接”、“除外”和“相交”等于 计算和计算也不可更新
  • 正在修改的列不受GROUPBY、HAVING或DISTINCT子句的影响
  • TOP不与with CHECK OPTION子句一起在视图的select_语句中的任何位置使用
前面的限制适用于FROM中的任何子查询 子句,就像它们应用于视图本身一样。通常地 数据库引擎必须能够明确地跟踪修改 从视图定义到一个基表。有关详细信息,请参阅 通过视图修改数据


因此,您可能有一个基于联接的视图,其中某些更新(仅涉及一个基表)是合法的,而其他更新(涉及多个基表)则不是合法的。

“我有一个允许用户用SQL定义自己视图的应用程序”-真的吗?…然后让应用程序生成有关该视图的元数据,是的,最后一位是重要的用户位,我是指管理员配置应用程序实例。是的,它非常接近成为一个内部平台。可能您必须在创建/更新SQL视图(您仍然需要验证它,对吗?)后验证SQL视图时执行测试插入(无值或默认值)。你的视图会失败,只允许更新一些列-但很可能这样的视图无论如何都不应该更新。谢谢,这是我得到的印象,是有意义的。