Таблицы триггеров SQL Server с внешними ключами - PullRequest
2 голосов
/ 14 ноября 2010

У меня следующая ситуация (SQL Server Express):

  • 2 таблицы, связанные через ограничение pk-fk
  • представление, объединяющее эти две таблицы
  • программа для использования базы данных имеет доступ только к представлению
  • вместо триггера для вставок в представлении

Идея состоит в том, что триггер вводит данные в таблицу 1. -> новый PK создается через IDENTITY, вторая таблица теперь должна содержать идентификатор таблицы 1. как часть ее первичного ключа ...

Как получить доступ к вновь созданному ПК таблицы 1. в среде с несколькими подключениями? Это упрощенная / модифицированная версия базы данных:

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;

Значение по умолчанию «0» для Kilometer_ID является обязательным из-за других определений в базе данных, объединение этих двух таблиц не вариант ... Хотя триггер работает нормально, я не уверен, что он будет работать в многопользовательской среде (что происходит с @@ Identity, если другое соединение изменяет таблицу?)

Есть ли лучшее решение для этого триггера?

Приветствую, Майкл

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

Если ваша проблема с @@ Identity является единственной проблемой, используйте SCOPE_IDENTITY (), которая возвращает последний созданный идентификатор из той же области.

Различия объяснены здесь: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

0 голосов
/ 14 ноября 2010

Ваш подход, вероятно, будет работать почти все время, если он используется в среде с небольшим объемом одиночных вставок.В SQL Server лучше использовать SCOPE_IDENTITY, поскольку он получает идентификационные данные только из текущей области.

Если вы хотите вставить несколько строк в это представление одновременно (например, insert into TrainingView select ...), это будет нарушенопотому что вам понадобится более одного TrainingID.Для этого вы можете использовать предложение SQL Server OUTPUT , чтобы получить все свои идентификаторы для этой вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...