Lösung: Testen der referenziellen Integrität
Completion requirements
- /* Datenbank erzeugen, falls nicht bereits existiert
- IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'RefIntegritaet') CREATE DATABASE RefIntegritaet
- GO
- USE RefIntegritaet
- /* Tabellen loeschen, falls diese existieren */
- IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'tblMitarbeiter') DROP TABLE tblMitarbeiter
- IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'tblAbteilung') DROP TABLE tblAbteilung
- /* Tabellen erzeugen */
- CREATE TABLE tblAbteilung
- (
- AbteilungId int IDENTITY PRIMARY KEY,
- Bezeichnung varchar(50)
- );
- CREATE TABLE tblMitarbeiter
- (
- AbteilungId int,
- Name varchar(50)
- );
- /* referenzielle Integritaet einschalten (fuer b) auskommentieren)*/
- ALTER TABLE tblMitarbeiter
- ADD CONSTRAINT fkAbteilungMitarbeiter FOREIGN KEY (AbteilungId) REFERENCES tblAbteilung(AbteilungId)
- ON DELETE CASCADE /fuer c) Loeschweitergabe, (fuer b) auskommentieren) */
- /* Datensaetze einfuegen */
- INSERT INTO tblAbteilung (Bezeichnung) VALUES ('Personal');
- INSERT INTO tblAbteilung (Bezeichnung) VALUES ('Einkauf');
- INSERT INTO tblAbteilung (Bezeichnung) VALUES ('Verkauf');
- INSERT INTO tblMitarbeiter (AbteilungId, Name) VALUES (1, 'Lorenz');
- INSERT INTO tblMitarbeiter (AbteilungId, Name) VALUES (2, 'Hohl');
- INSERT INTO tblMitarbeiter (AbteilungId, Name) VALUES (3, 'Willschrein');
- /* Test */
- DELETE FROM tblAbteilung WHERE AbteilungId = 1
a) der Datensatz lässt sich aus der Primärtabelle löschen. Die Detailtabelle bleibt davon unbeeinflusst.
b) Die Meldung lautet:
The DELETE statement conflicted with the REFERENCE constraint "fkAbteilungMitarbeiter". The conflict occurred in database "RefIntegritaet", table "dbo.tblMitarbeiter", column 'AbteilungId'. The statement has been terminated.
Der Datensatz wird nicht gelöscht.
c) Der Datensatz aus der Primärtabelle wird gemeinsam mit dem referenzierenden Datensatz aus der Detailtabelle gelöscht.
Last modified: Sunday, 9 September 2018, 11:42 AM