Insert Trigger avec l'option check sur plusieurs tables

J'ai un problème avec le triggersur sur la vue de plusieurs tables.

Laissez-moi vous expliquer: J'ai 2 tables de données avec des keys primaires et table Event avec plusieurs à plusieurs relation.

CREATE TABLE Club ( name_of_club varchar(50) PRIMARY KEY, adress varchar(50) NOT NULL ) CREATE TABLE Band ( name_of_band varchar(50) PRIMARY KEY, members int NOT NULL ) CREATE TABLE Event ( name_of_club varchar(50) NOT NULL, name_of_band varchar(50) NOT NULL, data date NOT NULL, CONSTRAINT PK_Event PRIMARY KEY ( name_of_club, name_of_band ), FOREIGN KEY (name_of_club) REFERENCES Club (name_of_club), FOREIGN KEY (name_of_band) REFERENCES Band (name_of_band) ) 

Maintenant, je peux append quelques valeurs:

 insert into Club (name_of_club, adress) values ('Big London Club', 'Londyn, Baker Street 12'), ('Espana Time', 'Barcelona, Diego 15'), ('Wwa', 'Warszawa, Sezonowa 82/14'), ('Szwalnia', 'Łódź, Piotrkowska 20/2'); insert into Band (name_of_band, members) values ('Arctic Monkeys', 5), ('Random Guys', 3), ('TILT', 10), ('Joke Time', 2); insert into Event (name_of_club, name_of_band, data) values ('Big London Club', 'Arctic Monkeys', '2015-01-25'), ('Wwa', 'TILT', '2015-01-28'), ('Szwalnia', 'Joke Time', '2015-02-10'); 

Créons la VUE:

 CREATE VIEW Events AS SELECT Club.name_of_club, adress, Band.name_of_band, members, data FROM Event JOIN Club ON Club.name_of_club = Event.name_of_club JOIN Band ON Band.name_of_band = Event.name_of_band 

Maintenant, je dois créer un triggersur pour l'opération INSERT.

1 * Lors de l'insertion d'une ligne dans la vue, j'ai besoin de vérifier si une ligne existe:

  • OUI -> erreur d'affichage

  • NON -> aller au point 2

2 * Vérifiez s'il y a un club et un groupe avec les noms spécifiés lors de l'insertion.

  • Si oui, vérifiez si les informations sont correctes et passez à 3 *.
  • Si quelque chose ne va pas -> erreur d'affichage.

3 * Lorsque la ligne contient datatables du club et que le groupe ne figure pas dans le tableau, créez des tables de base. À la fin du tableau des events de maquillage représentant la relation plusieurs-à-plusieurs. Maintenant devrait être meilleur.

Edit: points de triggersment fonctionne

peut être accompli en utilisant INSTEAD OF TRIGGER, le triggersur devrait être comme ceci:

 CREATE TRIGGER InsteadOfEventInsert ON Events INSTEAD OF INSERT AS BEGIN DECLARE @name_of_club VARCHAR(50), @name_of_band VARCHAR(50), @data DATE, @members int SELECT @name_of_club = name_of_club, @name_of_band = name_of_band, @data = data, @members = members FROM INSERTED IF NOT EXISTS( SELECT 1 FROM Events WHERE name_of_club = @name_of_club AND name_of_band = @name_of_band AND data = @data ) BEGIN IF NOT EXISTS(SELECT 1 FROM Club WHERE name_of_club = @name_of_club) INSERT INTO Club VALUES(@name_of_club, @members) IF NOT EXISTS(SELECT 1 FROM Band WHERE name_of_band = @name_of_band) INSERT INTO Band VALUES(@name_of_band, @members) INSERT INTO [Event] SELECT name_of_club, name_of_band, data FROM INSERTED END END 

Je recommand simplement d'append une colonne d'identité INT pour Club et Band au lieu de faire le nom comme key primaire.

Exemple d'insertion:

 INSERT INTO Events values ('Test Club', 'Test Adress', 'Test Band', 5, '2015-01-01') 

Déclencheur:

 CREATE TRIGGER InsteadOfEventInsert ON Events INSTEAD OF INSERT AS BEGIN DECLARE @name_of_club VARCHAR(50), @adress varchar(50), @name_of_band VARCHAR(50), @members int, @data date SELECT @name_of_club = name_of_club, @adress = adress, @name_of_band = name_of_band, @members = members, @data = data FROM INSERTED IF NOT EXISTS( SELECT 1 FROM Events WHERE name_of_club = @name_of_club AND adress = @adress AND name_of_band = @name_of_band AND data = @data ) BEGIN IF NOT EXISTS(SELECT 1 FROM Club WHERE name_of_club = @name_of_club) INSERT INTO Club VALUES(@name_of_club, @adress) IF NOT EXISTS(SELECT 1 FROM Band WHERE name_of_band = @name_of_band) INSERT INTO Band VALUES(@name_of_band, @members) END INSERT INTO [Event] SELECT name_of_club, name_of_band, data FROM INSERTED END 

Ça devrait ressembler a quelque chose comme ca?

Edit: ça marche;)