Einzelnen Beitrag anzeigen
Alt 03.07.2017, 20:41   #8
stefaktiv
MOF User
MOF User
Standard

Zu dem Problem fehlt mir irgendwie immer noch eine Lösung. Ich stell mal die Beispielkonstellation vor. Dazu muss man erst mal drei Tabellen erstellen.

Eine Tabelle für die Personen:

Code:

CREATE TABLE [dbo].[Personen](
	[Pers_ID] [int] IDENTITY(1,1) NOT NULL,
	[Pers_Nachname] [nvarchar](100) NULL,
	[Pers_Geburtsname] [nvarchar](100) NULL,
	[Pers_Vorname] [nvarchar](100) NULL,
	[Pers_Vorname_Weitere] [nvarchar](100) NULL,
	[Pers_Geburtsdatum] [datetime] NULL,
	[Pers_Geburtsort] [nvarchar](100) NULL,
	[Pers_Geburtsland] [nvarchar](100) NULL,
	[Pers_Geschlecht] [nvarchar](50) NULL,
	[Pers_Anlagedatum] [datetime] NULL,
	[Pers_angelegt_durch] [nvarchar](100) NULL,
	[Pers_Letzte_Änderung] [datetime] NULL,
	[Pers_geändert_durch] [nvarchar](100) NULL,
	[Pers_Timestamp] [timestamp] NULL,
 CONSTRAINT [PK_Personen] PRIMARY KEY CLUSTERED 
(
	[Pers_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Eine Tabelle für E-Mailadressen:

Code:

CREATE TABLE [dbo].[Emailadressen](
	[Email_ID] [int] IDENTITY(1,1) NOT NULL,
	[Email_Adresse] [nvarchar](255) NULL,
	[Email_Dienstlich] [bit] NOT NULL,
	[Email_Privat] [bit] NOT NULL,
	[Email_Aktuell] [bit] NOT NULL,
	[Email_Anlagedatum] [datetime] NULL,
	[Email_angelegt_durch] [nvarchar](100) NULL,
	[Email_Letzte_Änderung] [datetime] NULL,
	[Email_geändert_durch] [nvarchar](100) NULL,
	[Email_Timestamp] [timestamp] NULL,
 CONSTRAINT [PK_Emailadressen] PRIMARY KEY CLUSTERED 
(
	[Email_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[Emailadressen] ADD  CONSTRAINT [DF_Emailadressen_Email_Dienstlich]  DEFAULT ((0)) FOR [Email_Dienstlich]
GO

ALTER TABLE [dbo].[Emailadressen] ADD  CONSTRAINT [DF_Emailadressen_Email_Privat]  DEFAULT ((1)) FOR [Email_Privat]
GO

ALTER TABLE [dbo].[Emailadressen] ADD  CONSTRAINT [DF_Emailadressen_Email_Aktuell]  DEFAULT ((1)) FOR [Email_Aktuell]
GO

Zuletzt noch eine Tabelle zur Verknüpfung zwischen Person und E-Mailadresse.

Code:

CREATE TABLE [dbo].[PersEmail](
	[PersEmail_ID] [int] IDENTITY(1,1) NOT NULL,
	[Pers_ID] [int] NULL,
	[Email_ID] [int] NULL,
	[PersEmail_Quelle] [nvarchar](255) NULL,
	[PersEmail_Hinweistext] [nvarchar](255) NULL,
	[PersEmail_inaktuell] [bit] NOT NULL,
	[PersEmail_inaktuell_seit] [datetime] NULL,
	[PersEmail_Anlagedatum] [datetime] NULL,
	[PersEmail_angelegt_durch] [nvarchar](255) NULL,
	[PersEmail_Letzte_Änderung] [datetime] NULL,
	[PersEmail_geändert_durch] [nvarchar](255) NULL,
	[PersEmail_Timestamp] [timestamp] NULL,
 CONSTRAINT [PK_PersEmail] PRIMARY KEY CLUSTERED 
(
	[PersEmail_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[PersEmail] ADD  CONSTRAINT [DF_PersEmail_PersEmail_inaktuell]  DEFAULT ((0)) FOR [PersEmail_inaktuell]
GO

ALTER TABLE [dbo].[PersEmail]  WITH CHECK ADD  CONSTRAINT [FK_PersEmail_Emailadressen] FOREIGN KEY([Email_ID])
REFERENCES [dbo].[Emailadressen] ([Email_ID])
GO

ALTER TABLE [dbo].[PersEmail] CHECK CONSTRAINT [FK_PersEmail_Emailadressen]
GO

ALTER TABLE [dbo].[PersEmail]  WITH CHECK ADD  CONSTRAINT [FK_PersEmail_Personen] FOREIGN KEY([Pers_ID])
REFERENCES [dbo].[Personen] ([Pers_ID])
GO

ALTER TABLE [dbo].[PersEmail] CHECK CONSTRAINT [FK_PersEmail_Personen]
GO

Wenn die Frage kommen sollte, weshalb die Tabellen nicht direkt miteinander verbunden sind: jede E-Mailadresse kann mit mehreren Personen verknüpft sein und jede Person kann mit mehreren E-Mailadressen verknüpft sein. In der Datenbank ist jede Person und jede E-Mailadresse nur einmal vorhanden.

Dazu gibt es dann noch einen kleinen Trigger, der die Verknüpfung zwischen Person und E-Mailadresse auf inaktuell stellt, wenn die E-Mailadresse als inaktuell markiert wird.

Code:

CREATE TRIGGER [dbo].[tr_Emailadressen_After_Update]
ON [dbo].[Emailadressen] AFTER Update, Insert

AS

BEGIN


-- Prüfen, ob die Emailadresse auf inaktuell geschalten wurde
IF UPDATE(Email_aktuell)

   BEGIN

   SET NOCOUNT ON;

	UPDATE	dbo.PersEmail
   
	SET		PersEmail_inaktuell =	-1,
			PersEmail_inaktuell_seit = CONVERT(DATE, GETDATE()),
			PersEmail_Letzte_Änderung = CONVERT(DATE, GETDATE()),
			PersEmail_geändert_durch = 'Datenbanktrigger - Emailadresse inaktuell'
		
	FROM	inserted INNER JOIN dbo.PersEmail
			ON inserted.Email_ID = dbo.PersEmail.Email_ID 

	WHERE	PersEmail_inaktuell =	0 AND
			inserted.Email_aktuell = 0

	END



END



GO

ALTER TABLE [dbo].[Emailadressen] ENABLE TRIGGER [tr_Emailadressen_After_Update]
GO
stefaktiv ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten