Sql server SQL Server-插入后从视图更新基础表记录

Sql server SQL Server-插入后从视图更新基础表记录,sql-server,triggers,calculated-columns,sql-view,Sql Server,Triggers,Calculated Columns,Sql View,这是我第一次在这里问问题,我已经得到了很多答案,我的问题只是浏览-所以感谢各位,但这一次我卡住了 我对SQL基本上是新手,所以请容忍我,我也在使用一个不是我设计的SQL Server 2008 R2数据库,我只是尝试从中获取数据用于其他用途,我也使用SQL Server Management Studio SSMS 设置:有许多表,但在本例中,我使用的是一个主要的特定项表和5个其他关联表,以及从这些表创建的视图。然后,我在MS Access中使用了我更熟悉的视图,我在主表中添加了一些新列,其中一

这是我第一次在这里问问题,我已经得到了很多答案,我的问题只是浏览-所以感谢各位,但这一次我卡住了

我对SQL基本上是新手,所以请容忍我,我也在使用一个不是我设计的SQL Server 2008 R2数据库,我只是尝试从中获取数据用于其他用途,我也使用SQL Server Management Studio SSMS

设置:有许多表,但在本例中,我使用的是一个主要的特定项表和5个其他关联表,以及从这些表创建的视图。然后,我在MS Access中使用了我更熟悉的视图,我在主表中添加了一些新列,其中一列我希望根据主表、同一记录和其他表的值存储特定项的计算机械率。我能在视野中做得很好

但我的问题是:是否可以将此计算值用作主表的默认值,或者使用触发器在其中激发

我已经尝试过函数和触发器,现在开始怀疑这是否有效,正如前面提到的,视图是基于我想要插入值的表的

对于ex,这只是部分:主表有以下列

RecID, PartRef, Material, Width, Length, Thickness, MachRate etc
并加工工作台

和技术表

我的计算值需要这5个表中的3个,主表的机械加工率值需要是来自MachineRate的速率+来自TableOfTech的AddToMacrate,其中TableOfTech.Material=MainTable.Material和MainTable.Thickness在TableOfTech.Thickness 1和Thickness 2之间

不知道ex:真的有多大帮助,但为了让你知道我在用什么,那么只在插入的新记录上插入表列真的有效吗。。。基于同一表中的视图的值

我最好解释一下我为什么要这样做……在这种情况下,用户有必要更改该值,但大多数情况下,默认值是可以的,我们目前正在这样使用它

我希望这对你们有意义,我期待任何帮助


S.Brubacher

在一个表中有一个计算列的场景中,最好将计算该计算列值的所有列都保留在同一个表中

您可以从其他表的列中计算出计算列的值,但您必须在更新后,在从中计算值的所有表上删除触发器后,在源表中的任何更改中同步计算列,而不是插入触发器,这可能是一个地狱般的任务,触发器有时可能是无声的杀手

因此,为了避免所有这些麻烦,只需将计算值所在的列和计算列保存在一个表中即可

另一个更简单的选项是创建另一个视图,该视图在运行时从这些多个基础表收集数据,并在运行时为您计算这些数据。由于您的数据库中已经有从中计算此列的数据,因此最好仅在希望查看计算结果时才在运行时计算这些数据

如果在底层表中有大量数据并在运行时计算这些值,则需要花费大量时间,然后考虑索引视图。


我的建议是尽量避免在多个表中有计算列和源列的情况

您可以在视图上创建一个INSERT而非INSERT触发器,这样,如果在该视图上发生INSERT,您将得到通知,然后您可以决定如何处理插入到视图中的值—如何将它们存储到基础表MARC中,感谢您的回复-我使用了一个Instead Of Insert触发器,但是我在表的字段中得到了默认值,我在列上设置了一个默认值,因为它不允许空值,只是在测试时,请参见下面的ALTER trigger[dbo]。[trg_PopMachRateSQL]在dbo.Qry_AllParts2上,而不是插入为开始更新dbo.PPRR_PPRR_0000100设置dbo.PPRR_PPRR_0000100.MachRateSQL=UseRate从插入为i,其中dbo.PPRR_PPRR_0000100.RecID=i.RecID ENDMuhammed Ali不确定我是否在正确的位置发布/回复?我知道你在说什么,但我想确保值永远不会改变,除非我从Access内部运行更新查询,因此,换句话说,如果我将其中一个表的数据更改为2个表,其中包含计算列的数据,我想弹出一个消息框,询问是否需要根据我的机器速率更改来更新主要项目记录,也许我还没有考虑所有问题?我不认为每次访问弹出消息时都可以实现这一点更新记录。但问题是,你真的需要所有这些负担才能看到一个计算列吗??请看下面我的回答,我建议了两个非常重要的问题
请为该视图或索引视图提供简单的解决方案,相信我,您应该尽可能避免触发。Muhammed-我听说触发器不是最好的,我只是尝试使其尽可能自动化,因为数据都在那里,只是我正在使用一个程序上的数据库,我不能对表做任何我想做的事情,我已经在视图上有了计算值,我假设这就是运行时的意思?我只是无法在insert或insert之后将该值插入到主表中
RecID, Rate
RecID, Material, Thickness1, Thickness2, AddToMachRate  etc...