2016-11-14 4 views
0

У меня есть таблица со следующими столбцами, и я не могу изменить схему (т. Е. Я не могу изменить таблицу или добавить поле идентификации).Триггеры после вставки

Я хочу создать триггер для обновления одного столбца, чтобы рассматривать его как поле идентификации.

accountno  firstname lastname  keyField 
jku45555  John   Doe   123 

Теперь то, что я хочу, когда я вставляю следующую запись, хватаю KeyFieldId предыдущей записи и обновления вновь вставленной записи, чтобы быть 124 (имейте в виду, что это в Varchar поле).

Мне нужен наилучший способ сделать это, и, как я уже сказал, изменение таблицы не является вариантом. Благодаря!

+0

Почему вы не можете добавить столбец идентификаторов из любопытства ? –

+1

Я точно знаю, что вы говорите, но это API, который я не контролирую, мы делали это в прошлом, но теперь я обновляюсь до более новой версии, и каждое настраиваемое поле будет удалено, и единственный способ, которым это будет работать, - это просто используйте одно поле, о котором я упомянул, поскольку мы уже перенесли данные из этого настраиваемого поля идентификации в этот, и теперь все, что мне нужно, обновляет это поле. PmbAustin на самом деле дал прямой пример. но да, руки мои связаны. –

ответ

2

Вы хотите сделать что-то вроде этого ... Для таблицы с именем «Foo», с двумя колонками, Имя и KeyFieldId (как VARCHAR), этот триггер будет делать то, что вы хотите:

------------------------------------------------------------------------- 
-- These lines will create a test table and test data 
--DEBUG: CREATE TABLE Foo (FirstName varchar(20), KeyFieldId varchar(10)) 
--DEBUG: INSERT INTO Foo VALUES ('MyName', '145') 
--  
CREATE TRIGGER test_Trigger ON Foo 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @maxKeyFieldId int; 
    SELECT @maxKeyFieldId = MAX(CAST(KeyFieldId AS int)) FROM Foo; 
    WITH RowsToInsert AS (
     SELECT *, ROW_NUMBER() OVER (ORDER BY (CAST(KeyFieldId AS int))) AS RowNum 
     FROM inserted 
    ) INSERT INTO Foo (FirstName, KeyFieldId) 
     SELECT FirstName, @maxKeyFieldId + RowNum 
      FROM RowsToInsert; 

END 

Вещи, чтобы отметить здесь:

  1. Создать триггер INSTEAD OF INSERT
  2. Найти «Max» значение целочисленного значения вашего KeyFieldID
  3. Создать КТР, который выбирает все е ром «вставлено» коллекция
  4. Добавить столбец в КТР для Рядности
  5. ли фактическое INSERT, добавив номер строки в макс KeyFieldID
+0

Спасибо, вы просто положили меня на правильный трек. Должен ли я делать обновление, так как запись вставлена ​​из CRM, и теперь мне все нужно обновить KEYFIELD до maxkeyfieldid + RowNum –

+0

Включение запуска INSTEAD OF INSERT * вместо * вставки, поэтому код должен делать вставку. ПОСЛЕ INSERT запускается после вставки, и там вы делаете обновление, но в этом случае кажется более эффективным избежать необходимости вставлять и поворачиваться и сразу делать обновление ... просто вставьте правильные данные для запуска. – pmbAustin

Смежные вопросы