ฉันมีปัญหากับการออกแบบฐานข้อมูลชั่วคราว ฉันจำเป็นต้องรู้วิธีการตรวจสอบให้แน่ใจว่าฉันมีบันทึกการใช้งานเพียงหนึ่งเดียวสำหรับระยะเวลาที่กำหนดสำหรับร้านค้า ฉันได้อ่านคำตอบนี้แล้ว แต่ฉันเกรงว่าฉันไม่สามารถคาดหัวได้ว่าไกทำงานอย่างไร โดยเฉพาะอย่างยิ่งฉันจะทำงานที่กระตุ้นให้มีอยู่ของฉันที่ป้องกันการปรับปรุงเพื่อบันทึกและแทรกบันทึกใหม่แทน ปัญหาที่แท้จริงของฉันคือฉันไม่รู้วิธีป้องกัน Store จากวันที่มีผลมากกว่าหนึ่งวันเมื่อวันที่เสร็จสิ้นเป็นโมฆะ (เช่นป้องกันการบันทึก 2 รายการสำหรับร้านค้า)
นี่คือสิ่งที่ฉันมี แต่มันช่วยให้ฉันสามารถแทรกบันทึกใหม่สำหรับร้านค้าที่มีวันที่มีประสิทธิภาพที่แตกต่างกัน
นิยามของตาราง:
/****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U'))
DROP TABLE [Z_STORE_TEAM]
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U'))
BEGIN
CREATE TABLE [Z_STORE_TEAM](
[STORENUM] [int] NOT NULL,
[TEAM] [varchar](10) NULL,
[EFFECTIVE] [date] NOT NULL,
[FINISHED] [date] NULL,
PRIMARY KEY CLUSTERED
(
[STORENUM] ASC,
[EFFECTIVE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
ข้อมูลตัวอย่าง:
INSERT [Z_STORE_TEAM] ([STORENUM], [TEAM], [EFFECTIVE], [FINISHED]) VALUES (1, N'1', CAST(0x01380B00 AS Date), CAST(0x81380B00 AS Date))
INSERT [Z_STORE_TEAM] ([STORENUM], [TEAM], [EFFECTIVE], [FINISHED]) VALUES (1, N'2', CAST(0x81380B00 AS Date), NULL)
INSERT [Z_STORE_TEAM] ([STORENUM], [TEAM], [EFFECTIVE], [FINISHED]) VALUES (2, N'1', CAST(0x01380B00 AS Date), NULL)
INSERT [Z_STORE_TEAM] ([STORENUM], [TEAM], [EFFECTIVE], [FINISHED]) VALUES (2, N'2', CAST(0x20380B00 AS Date), NULL)
แทนที่จะอัพเดททริกเกอร์:
CREATE TRIGGER [tr_ZStoreTeam_update]
ON [Z_STORE_TEAM]
INSTEAD OF UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
INSERT INTO PCR.Z_STORE_TEAM(STORENUM,TEAM,EFFECTIVE)
SELECT I.STORENUM,I.TEAM,GETDATE() AS EFFECTIVE
FROM inserted I
INNER JOIN PCR.Z_STORE_TEAM ST
ON I.STORENUM = ST.STORENUM
UPDATE ST
SET FINISHED = GETDATE()
FROM PCR.Z_STORE_TEAM ST
INNER JOIN inserted I
ON ST.STORENUM = I.STORENUM
AND ST.EFFECTIVE = I.EFFECTIVE
END
GO