SQL - 在保留历史数据的同时重置累积值

时间:2011-12-19 16:27:18

标签: sql triggers

在我大学实习期间,我已经被要求创建一个Web应用程序来管理我工作的工厂中的维护操作。我是一名工程师,对数据库编程知之甚少,所以也许这个问题会声音很容易,我道歉。

情况就是这样:该项目是一个模具,经过多次操作后需要进行普通维护(数量巨大,我说的是瓷砖制造,维护频率可以假定为每年一次的平均值) 。我建立了一个数据库和连接到它的Web应用程序,我创建了一个带有模具列表和相关累积工作的视图,以便部门负责人能够快速了解​​情况并查看哪些模具需要维护,以及这很好。

问题是它们“标记”了模具,我使用该数字作为数据库中的行ID。执行维护时,需要重置累计工作,但他希望保留有关工作操作的历史数据。

因此,我现在需要做的是“告诉系统”何时对项目进行管理,然后必须在保留历史数据的同时重置累计值。

我创建的视图的值取自2个不同的表:Molds和UnmountingOperations。在后者中,有关于哪个模具已经安装在其上的信息以及在该操作期间完成的总工作。我认为解决方案是使用触发器,但我想问:

这样做的最佳做法是什么?

这里是由SqlServer管理工作室创建的脚本。但是记录名称是意大利语。 模具表:

CREATE TABLE [dbo].[Stampo](
[ID] [int] NOT NULL,
[Formato] [nchar](10) NOT NULL,
[n∞ uscite] [int] NULL,
[Spessore] [nchar](10) NULL,
[Descrizione] [nvarchar](max) NULL,
[Fornitore] [nvarchar](50) NULL,
CONSTRAINT [PK_Stampo] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

按表:

CREATE TABLE [dbo].[Pressa](
[Numero] [int] NOT NULL,
[Modello] [nchar](10) NULL,
CONSTRAINT [PK_Pressa] PRIMARY KEY CLUSTERED 
(
[Numero] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
用于卸载操作的协会模具压力机(mq_pressati)是工作量驱动器,代表压力的平方米:

CREATE TABLE [dbo].[SmontaggioStampi](
[NumeroPressa] [int] NOT NULL,
[IDStampo] [int] NOT NULL,
[DataSmontaggio] [datetime] NOT NULL,
[mq_pressati] [int] NOT NULL,
[Descrizione] [nvarchar](max) NULL,
CONSTRAINT [PK_Produzione presse] PRIMARY KEY CLUSTERED 
(
[NumeroPressa] ASC,
[IDStampo] ASC,
[DataSmontaggio] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[SmontaggioStampi]  WITH CHECK ADD  CONSTRAINT  [FK_SmontaggioStampi_Pressa] FOREIGN KEY([NumeroPressa])
REFERENCES [dbo].[Pressa] ([Numero])
GO

ALTER TABLE [dbo].[SmontaggioStampi] CHECK CONSTRAINT [FK_SmontaggioStampi_Pressa]
GO

ALTER TABLE [dbo].[SmontaggioStampi]  WITH CHECK ADD  CONSTRAINT [FK_SmontaggioStampi_Stampo] FOREIGN KEY([IDStampo])
REFERENCES [dbo].[Stampo] ([ID])
GO

ALTER TABLE [dbo].[SmontaggioStampi] CHECK CONSTRAINT [FK_SmontaggioStampi_Stampo]
GO

1 个答案:

答案 0 :(得分:0)

至于最佳做法,“避免像瘟疫这样的触发器”是我能给你的最佳建议。

我在类似情况下所做的是添加一个列,表明现在存档了一行。我使用了名为datetime的{​​{1}}列。普通查询将此列排除在外:

ArchivedDt

您甚至可以在视图中执行此操作。分层数据仍然存在,并且可以轻松撤消特定的存档运行。