Я делаю изменения в существующей базе данных при разработке нового программного обеспечения. Существует также довольно много устаревших программ, которые используют базу данных, которая должна продолжать работать, т.е. я хотел бы сохранить существующие таблицы базы данных, процедуры и т. Д.
В настоящее время у меня есть таблица
CREATE TABLE dbo.t_station (
tx_station_id VARCHAR(4) NOT NULL,
tx_description NVARCHAR(max) NOT NULL,
tx_station_type CHAR(1) NOT NULL,
tx_current_order_num VARCHAR(20) NOT NULL,
PRIMARY KEY (tx_station_id)
)
Мне нужно включить в эту таблицу новое поле, которое относится к заводу (производственному объекту) и переместить tx_current_order_num в другую таблицу, поскольку оно не требуется для всех строк. Итак, я создал новые таблицы: -
CREATE TABLE Private.Plant (
PlantCode INT NOT NULL,
Description NVARCHAR(max) NOT NULL,
PRIMARY KEY (PlantCode)
)
CREATE TABLE Private.Station (
StationId VARCHAR(4) NOT NULL,
Description NVARCHAR(max) NOT NULL,
StationType CHAR(1) NOT NULL,
PlantCode INT NOT NULL,
PRIMARY KEY (StationId),
FOREIGN KEY (PlantCode) REFERENCES Private.Plant (PlantCode)
)
CREATE TABLE Private.StationOrder (
StationId VARCHAR(4) NOT NULL,
OrderNumber VARCHAR(20) NOT NULL,
PRIMARY KEY (StationId)
)
Теперь я не хочу, чтобы одни и те же данные были в двух местах, поэтому я решил изменить таблицу dbo.t_station в представление и предоставить вместо триггеров DELETE, INSERT и UPDATE. Нет проблем, у меня [большинство] их работает.
Мой вопрос касается триггера INSTEAD OF UPDATE, обновляет столбец первичного ключа (tx_station_id) и обновляет несколько строк.
В блоке триггера есть ли способ объединить вставленные и удаленные таблицы [psuedo], чтобы я знал «первичный ключ до обновления» и «первичный ключ после обновления»? Как то так ...
UPDATE sta
SET sta.StationId = ins.tx_station_id
FROM Private.Station AS sta
INNER JOIN deleted AS del
INNER JOIN inserted AS ins
ON ROW_IDENTITY_OF(del) = ROW_IDENTITY_OF(ins)
ON del.tx_station_id = sta.StationId
На этом этапе я установил проверку в блоке триггера, который выполняет откат обновления, если столбец первичного ключа обновлен, и во вставленной или удаленной таблице имеется более одной строки.