je la situation suivante (SQL Server Express):Tables Trigger SQL Server avec des clés étrangères
- 2 tables reliées par une contrainte pk-fk
- une vue qui relie ces deux tables
- la programme à utiliser la base de données n'a accès à la vue
- un lieu de détente pour les inserts sur la vue
l'idée est que le tri gger entre les données dans la table 1.> un nouveau PK est créé via IDENTITY, la deuxième table doit maintenant contenir l'ID de la table 1. dans le cadre de sa clé primaire ...
Comment puis-je accéder au nouveau créé? PK de la table 1. dans un environnement multi-connexion? Ceci est une version simplifiée/modifed de la base de données:
CREATE TABLE Training (
Training_ID INT IDENTITY NOT NULL PRIMARY KEY,
Name NVARCHAR(30) NOT NULL);
CREATE TABLE Kilometer (
Training_ID INT NOT NULL REFERENCES Training(Training_ID),
Kilometer_ID INT NOT NULL,
Timestamp DATETIME NOT NULL,
PRIMARY KEY(Training_ID, Kilometer_ID);
CREATE VIEW TrainingView (
SELECT t.Name, k.Timestamp
FROM Training t LEFT JOIN Kilometer k ON (t.Training_ID = k.Training_ID));
CREATE TRIGGER TrainingTrigger ON TrainingView INSTEAD OF INSERT AS BEGIN
INSERT INTO Training(Name) SELECT Name FROM inserted;
INSERT INTO Kilometer(Training_ID, Kilometer_ID, Timestamp) SELECT @@Identity, 0, Timestamp FROM inserted;
END;
La valeur par défaut « 0 » pour Kilometer_ID est obligatoire en raison d'autres définitions dans la base de données, la fusion de ces deux tables ne sont pas une option ... Alors que le déclenchement semble fonctionner correctement, je ne suis pas sûr si cela va dans un environnement multi-utilisateur (ce qui arrive à @@ Identity, si une autre connexion modifie la table?)
Y a-t-il une meilleure solution à ce déclencheur?
Greetz Michael
Merci pour le lien, avez-vous d'autres soucis avec le design? – MFH
Je pourrais avoir simplement stocké une procédure pour les deux insertions à la place, mais votre déclencheur semble sain. Je ne suis pas sûr si j'ai vraiment ce que la table est sur, mais la structure semble ok aussi longtemps que cela ne vous dérange pas que vous ne pouvez pas insérer plusieurs lignes dans une déclaration comme Matt explique. –
ok, je pourrais avoir trop simplifié l'exemple de code, l'insertion de plusieurs lignes dans une déclaration n'est pas vraiment nécessaire actuellement (au moins selon l'exigence actuelle :)) – MFH