2017-03-13 4 views
2

Ich habe zwei Tabelle Header und Item, die eins zu viele Beziehung hat.Verhindern Einfügen oder Aktualisieren von Daten in C# oder SQL

Kopftabelle

Id  StartDate EndDate 
--------------------------------------- 
1  1999/1/1 1999/5/1   
2  2000/1/1 2000/4/1 
3  2000/1/1 2000/5/1 

und Artikeltabelle

Id  HeaderRef SLRef 
------------------------------------- 
101  1   201 
102  2   201 

Wie Artikel mit HeaderRef=3 und SLRef=201 hinzufügen zu verhindern, da hat es gleiche SLRef, und die Header-Zeilen, die HeaderRef referd es StartDate and EndDate hat dass ein anderes Item mit demselben SLRef Refered zu Header in diesem Bereich.

+1

Haben Sie versucht, Trigger einzufügen/zu aktualisieren? Du kannst einige schreiben. – pwas

+1

Möchten Sie HeaderRef und SLRef in ItemTable eindeutig halten? –

+1

Ja Ich möchte HeaderRef und SLRef im Datumsbereich, der zu Hedar hinzugefügt wurde, eindeutig halten. –

Antwort

2

Sie Vorausgesetzt, verwenden MS SQL Server gibt es zwei Ansätze achive, was Sie suchen:

1) Trigger verwenden, wie von anderen Nutzern vorgeschlagen. Trigger wäre für INSERT/UPDATE, die die Datumsbereiche überprüfen und neue Werte hinzufügen oder Fehler erhöhen können.

2) Sie können zusammengesetzte Primärschlüssel in ItemTable verwenden:

CREATE TABLE [dbo].[ItemTable](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [HeaderRef] [int] NOT NULL, 
    [SLRef] [int] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [HeaderRef] ASC, 
    [SLRef] 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 

Nun wird dies eine Einschränkung setzen auf der ItemTable und SQL-Server nicht doppelte Kombination von headerRef und SLRef int-Werten (Tasten) ermöglichen.

Zurück Sie Ihre HeaderTable, können Sie die eindeutige Einschränkung setzen den Bereich der Start- und Enddaten auf HeaderTable für Start- und Enddaten

CREATE TABLE [dbo].[HeaderTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [STARTDATE] [datetime] not NULL, 
    [ENDDATE] [datetime] not NULL, 
CONSTRAINT [PK_HeaderTable] 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] 

GO 

Erstellen Sie nun einen eindeutigen Index zu stoppen duplizieren.

/****** Object: Index [IX_HeaderTable] Script Date: 03/13/2017 12:24:51 ******/ 
CREATE UNIQUE NONCLUSTERED INDEX [IX_HeaderTable] ON [dbo].[HeaderTable] 
(
    [ENDDATE] ASC, 
    [STARTDATE] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

Sie können auch eine weitere Einschränkung auf HeaderTable setzen, die prüft, ob das Startdatum nicht vor dem Enddatum liegen kann.

ALTER TABLE [dbo].[HeaderTable] WITH CHECK ADD CONSTRAINT [CheckEndLaterThanStart] CHECK (([ENDDATE]>=[STARTDATE])) 
GO 

ALTER TABLE [dbo].[HeaderTable] CHECK CONSTRAINT [CheckEndLaterThanStart] 
GO 

Hoffe, das hilft!

1

Sie suchen nach einem DML-Trigger, in einfachen Worten ist es eine Art von SQL-Funktion oder Prozedur, die automatisch aufgerufen wird, wenn der Benutzer versucht, die Daten in einer Datenbank durch Hinzufügen oder Entfernen, auch den Körper des Triggers zu ändern kann eine Validierungslogik enthalten, so dass die Daten nur dann eingefügt werden, wenn sie eine bestimmte Bedingung erfüllen

Verwandte Themen