2015-11-29 4 views
3

Мы используем систему ERP, которая использует SQL Server. Существует функция, которая создает строку «A» в конкретной таблице и заполняет ее данными из другой строки «B» другой таблицы. По какой-то причине программист подумал, что в «А» нужны только определенные значения «В». Таким образом, копируются только значения некоторых столбцов в «B».Как запускать инструкцию SQL каждый раз, когда создается строка?

Теперь я хочу, чтобы больше столбцов копировалось, чем копии программы. Столбцы есть, но они не копируются.

Программа предлагает способ запуска скрипта перед выполнением инструкции SQL, которая создает строку. Итак, проблема здесь: я не знаю идентификатор строки, которая будет создана. И даже если бы я это сделал, строка еще не создана, чтобы изменить ее.

Есть ли способ в SQL Server запускать SQL-скрипт каждый раз после создания строки в определенной таблице?

Спасибо за помощь.

+0

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

+0

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

+0

заменил набор данных на строку – Cheetah

ответ

2

Да - они называются триггерами.

Вы можете написать триггеры, которые уволят после INSERT, UPDATE или DELETE - или они могут быть INSTEAD OF триггерами, тоже - если вам нужно, чтобы полностью взять под контроль операции.

В вашем случае, я считаю, AFTER INSERT триггер должно быть прекрасно:

CREATE TRIGGER TrgCopyAdditionalColumns 
ON dbo.TableA 
AFTER INSERT 
AS 
    -- the newly inserted row (there could be **multiple!**) 
    -- will be stored in the `Inserted` pseudo table, which has the 
    -- exact same structure as your "TableB" table - just pick out 
    -- the columns you need to insert into "TableA" from here 
    INSERT INTO dbo.TableA (Col1, Col2, ..., ColN) 
     SELECT 
      b.Col1, b.Col2, ..., b.ColN 
     FROM 
      dbo.TableB AS b 
     INNER JOIN 
      -- somehow, you need to connect your Table B's rows to the 
      -- newly inserted rows for Table A that are present in the 
      -- "Inserted" pseudo table, to get only those rows of data from 
      -- Table B that are relevant to the newly inserted Table A rows 
      Inserted i ON b.A_ID = i.ID 
+0

, так как мне нужно скопировать из 'B' в 'A', я полагаю, что мне нужно вставить мое значение из 'B' в pseudo table – Cheetah

+0

@ Четах: обновил мой ответ. Вам нужно каким-то образом связать строки из таблицы B, чтобы вы захватили дополнительные столбцы из недавно вставленных строк таблицы A (которые присутствуют в псевдо-таблице «Inserted») - не могут знать, как это соединение сделано, я просто намекнул на что-то, что вам нужно выяснить –

+0

Получил новый. Теперь проблема. Требуется создать триггер, но уже есть триггер Insertion. Он имеет небольшую блокировку на значке, и я не могу отредактировать триггер. есть способ разместить мой после существующего или изменить его в любом случае. – Cheetah

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