更新 SQL 视图,对外部表值实施约束
Posted
技术标签:
【中文标题】更新 SQL 视图,对外部表值实施约束【英文标题】:Updating SQL view, enforcing constraints on foreign table values 【发布时间】:2013-06-26 20:25:49 【问题描述】:我有一个将两个表连接在一起的视图。
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
如果我更新 CustomerName,它会在客户表中更新它。 如何配置此视图,以便当我更新客户名称时,它将只接受存在于 cust 表中的名称,否则会失败
更新:MS SQL
【问题讨论】:
您使用的是哪个 DBMS?后格雷斯?甲骨文? 【参考方案1】:您实际上无法直接更新视图,这只会为您提供表中存在的数据的“视图”。有几个选项,您可以针对客户表创建完整性约束,通过应用程序前端处理它,或者如果您确实想直接针对视图发出更新语句,大多数 rdbms 在视图上提供而不是触发器,这允许您指定在针对视图执行语句时应如何更新基础表。
【讨论】:
您实际上可以直接通过 SQL Server 中的视图Update
,只要它是可写视图并且您一次只更新单个表中的可写列。您不需要索引视图或视图触发器来执行此操作。
我的意思是视图本身只是表中数据的抽象。您实际更新的是基础表。我接受针对视图发出更新命令的方法在不同的 rdbms 之间会有所不同,并且我不知道在 SQL-Server 中不需要触发器。我相信它在 Oracle 和 SQLite 中。
经过进一步调查,似乎仅在某些情况下才需要视图上的触发器以避免歧义等。msdn.microsoft.com/en-us/library/aa175158%28v=sql.80%29.aspx
AFAIK,大多数主要 DBMS(Oracle、IBM DB2、Microsoft SQL Server 等)都支持这个称为“可更新视图”的功能。【参考方案2】:
您尚未说明您使用的是什么 DBMS,但对于 SQL Server,请将 WITH CHECK OPTION
添加到您的视图定义中。如果UPDATE
实际上正在通过视图(对于 ADO.Net 和大多数其他访问方法是正常的),那么这将检查它。
但是,如果它正在分解为基础表,然后更新它们,这将不起作用(某些工具和较旧的访问方法确实会尝试这样做)。您可以通过适当的安全设置来阻止这种情况,但这可能会阻止它们完全正常工作。
【讨论】:
以上是关于更新 SQL 视图,对外部表值实施约束的主要内容,如果未能解决你的问题,请参考以下文章
SQLServer系统视图sysobjects中type字段说明