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.
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;)