在sql-server中创建一个允许输入新记录的视图

时间:2015-07-31 12:52:56

标签: sql sql-server view insert sql-view

我在sql server 2012中有一个名为AccntTemp的表,它有一堆列和一个ID列。必须在此表中输入数据的人不应该能够看到ID列和其他一些列,但需要能够输入数据。

因此,我需要创建一个允许输入新记录的视图,但只显示我希望她看到的字段。我知道如何创建视图,因此它只显示我希望她看到的字段,但我不知道如何制作视图以便允许输入新记录。

对于我的查询,我需要更改哪些内容才能生效?

CREATE VIEW dbo.DataEntry
AS
SELECT code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno 
   FROM accnttemp

这只是创建了视图,但是当我进入视图时,我无法修改任何记录或添加任何新记录。我该如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

如果您的视图不可更新,由于某种原因(大多数简单视图应该是),那么您将必须实现手动操作基表的触发器。

E.g。

CREATE TRIGGER T_DataEntry_I on dbo.DataEntry
instead of insert
as
insert into accnttemp(code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno)
SELECT code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno 
   FROM inserted

无论需要进行哪些更改,插入都会成功。

视图不允许INSERT的一个常见原因是基表中还有其他列,NULL和默认值都不起作用。在这种情况下,您必须将这些列添加到上面的触发器代码中,并为它们选择或计算适当的值。

如果不清楚,我不同意TTeeple的回答。 SQL的设计使得视图和表格尽可能无法区分。您应该能够使用视图替换表(具有相同的列定义,并将数据保存在适当的其他表中),而不必对使用它的任何客户端应用程序进行任何更改。

事实上,它是应该可以更新的原始Codd's Rules for Relational Databases之一:

  

规则6 :视图更新规则:

     

理论上可更新的所有视图都必须由系统更新。

不幸的是,从那时起发现,对于某些观点,虽然人类可以为它们实施更新,但系统无法找到方法。

答案 1 :(得分:-1)

文档中有一些内容。请检查此link

  

可更新视图

     

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

     

任何修改,包括UPDATE,INSERT和DELETE语句,   必须仅从一个基表引用列。

     

视图中要修改的列必须直接引用   表列中的基础数据。无法导出列   任何其他方式,例如通过以下方式:

     

聚合函数:AVG,COUNT,SUM,MIN,MAX,GROUPING,STDEV,   STDEVP,VAR和VARP。

     

计算。无法从表达式计算列   使用其他列。使用set运算符形成的列   UNION,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT等于a   计算,也不可更新。

     

正在修改的列不受GROUP BY,HAVING或的影响   DISTINCT条款。

     

TOP不会在视图的select_statement中的任何位置使用   与WITH CHECK OPTION子句一起使用。

答案 2 :(得分:-2)

视图不应该允许插入数据,只允许读取。您希望通过触发器做什么,但这是不可取的。

您正在寻找功能或存储过程。

更新回答以便我不发送垃圾评论:

这就是为什么你给他们一个接受参数的存储过程。他们对底层逻辑一无所知,他们只知道这个存储过程将他们提供的参数放入他们需要的表中。他们检查视图,现在他们的新数据就在那里。

这通常是不好的做法,因为你只能通过使用触发器来完成它,这可能会产生一些令人讨厌的副作用。因此,如果正确完成并且所有内容都被考虑(包括现在和未来),那么请继续。无论如何,用户必须拥有基表的INSERT, UPDATE, DELETE权限。