2016-08-12 3 views
-1

Я никогда не работал с Triggers раньше в MSSQL, но я думаю, что это будет то, что мне нужно для этой задачи.Изменить значение столбца после INSERT, если значение соответствует критериям?

Структура таблицы как таковой:

ID|****|****|****|****|****|****|****|TOUROPERATOR 

экскурсионном код оператора код, который говорит нам, что компания принадлежит полет, мы провели для них. Два из этих кодов (всего 24) устарели. Наши пользователи потребовали, чтобы эти два были изменены, но код туроператора вытащили из базы данных, которую мы не контролируем. Однако таблицу FlightData мы контролируем. Поэтому я думал, что триггер может изменить код туроператора, если он был одним из двух устаревших, вместо правильных, соответственно, когда они были вставлены.

Итак, я вошел в хорошую студию SQL Management Studio и попросил сделать триггер. Он дал мне пример кода, и вот мой псевдокод ниже:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER ChangeProvider 
ON FlightData 
AFTER INSERT 
AS 
BEGIN 
    IF(TheInsertedValue == Criteria) 
     UPDATE FlightData 
     SET TheInsertedValue = NewValue 
    ENDIF 
END 
GO 

Я не так хорошо с этим типом программирования баз данных, так извините мои ошибки.

Как бы я это сделал?

+0

Возможный дубликат [Как я могу редактировать значения Вкладышем в триггер SQL Server?] (Http://stackoverflow.com/questions/3580123/how-can-i-edit-values-of-an-insert-in-a-trigger-on-sql-server) –

+0

Зачем обновлять таблицу после вставки? Почему бы не обработать код туроператора перед вставкой и вставить правильный код провайдера? –

+0

Поскольку код вытаскивается из базы данных, мы не контролируем ее. У нас есть только доступ к этой базе данных, мы не можем манипулировать им. – OmniOwl

ответ

1

Вы можете добавить вычисляемый столбец в таблицу вместо добавления триггера. Тогда новый столбец может просто использовать оператор case, чтобы либо показать оригинальное значение столбца TourOperator, либо новое значение, которое вы хотели.

Вы хотите добавить новый столбец в таблицу, как этого

TourOperatorCorrect = CASE WHEN TourOperator = 'Whatever value' THEN  'ChangedValue' 
         --I just want to use what I have already in the TourOperator column 
         ELSE TourOperator 
         END AS VARCHAR(50) 

Основы вычисляемых столбцов здесь - https://msdn.microsoft.com/en-ie/library/ms188300.aspx

+0

Из того, что я собираюсь, мне придется удалить столбец, полный данных, а затем создать новый столбец рядом с ним ._. – OmniOwl

+0

Вы можете сохранить столбец TourOperator, добавив еще один виртуальный столбец (они могут быть сохранены) в таблицу, в которой будет иметься «чистое» значение, либо исходное значение TourOperator, либо новое значение. – TheGaff

+0

Итак, я бы запросил вычисляемый столбец вместо исходного или? – OmniOwl

0

Ваше неправильное представление состоит в том, что триггер запускается один раз за вставленное значение - он фактически запускается один раз для инструкции вставки, поэтому вы можете и найдете несколько строк, вставленных сразу.

Вы найдете, что введенные значения находятся в псевдо таблице inserted, которая имеет ту же структуру, что и ваша таблица FlightData. Вы пишете над ним инструкцию select, указав любые критерии.

Однако не сразу понятно, что ваша логика - делает ли таблица , которую вы обновляете в своем триггере, имеет только одну строку? Вы обновляете каждую строку в таблице с самым новым вставленным значением? Трудно понять, что вы пытаетесь сделать сейчас, и какова цель таблицы и этого триггера - не говоря уже о том, что вы хотели бы сделать, если бы вы вставляли сразу несколько строк.

+0

Таблица FlightData содержит сотни тысяч строк, но два из кодов туроператоров, которые мы используем, были запрошены для изменения нашими пользователями, когда они извлекают данные из этой таблицы. Однако коды туроператоров вытягиваются из внешней базы данных, которую мы не контролируем. Мы не можем манипулировать им. Так что я думал, должен был поймать вставку и просто изменить коды туроператора, чтобы они правильно отображались в таблице FlightData. – OmniOwl

0

При вставке таблицы содержит Mutiple строки, ваш код не получится, поэтому изменить код для работы с вставленной таблицы в целом

UPDATE F 
    SET f.TheInsertedValue = i.value 
    from inserted i 
    join 
    Flighttable F 
    on f.matchingcolumn=i.matchingcolumn 
    and i.somevalue='criteria' 
Смежные вопросы