Определите Старый первичный ключ в Триггере SQL

require('0-RootController') можно было бы использовать, если бы был 0-RootController пакет NPM.

Если это относительный путь, он должен быть:

var RootController = require('./0-RootController');
5
задан keith 4 March 2009 в 23:53
поделиться

7 ответов

Можно ли предположить, что таблицы INSERTED и DELETED, представленные вам в триггере, гарантированно находятся в одном порядке?

2
ответ дан 14 December 2019 в 09:01
поделиться
DECLARE @OldKey int, @NewKey int;

SELECT @Oldkey = [ID] FROM DELETED;
SELECT @NewKey = [ID] FROM INSERTED;

Это только работает, если у Вас есть одна строка. Иначе у Вас нет "привязки" для соединения старых и новых строк. Так зарегистрируйтесь в своем триггере для> 1 во ВСТАВЛЕННОМ.

3
ответ дан 14 December 2019 в 09:01
поделиться

Я не думаю, что это возможно. Вообразите, есть ли у Вас 4 строки в таблице:

1  Val1
2  Val2
3  Val3
4  Val4

Теперь выпустите следующее обновление:

UPDATE MainTable SET
ID = CASE ID WHEN 1 THEN 2 WHEN 2 THEN 1 ELSE ID END
Description = CASE ID WHEN 3 THEN 'Val4' WHEN 4 THEN 'Val3' ELSE Description END

Теперь, как Вы собирающийся различать то, что произошло со строками 1 и 2 и что произошло со строками 3 и 4. И что еще более важно, можно ли описать то, что отличается между ними? Весь материал, который говорит Вам, какие столбцы были обновлены, не поможет Вам.

Если возможно в этом случае, что существует дополнительный ключ на таблице (например, Описание УНИКАЛЬНО), и Ваши правила обновления позволяют его, Вы могли записать триггер для предотвращения одновременных обновлений обоих ключей, и затем можно использовать, какой бы ни ключ не был обновлен для корреляции этих двух таблиц.

1
ответ дан 14 December 2019 в 09:01
поделиться

Если необходимо обработать несколько-строк, вставляет/обновляет, и нет никакого альтернативного ключа, который это гарантировало, что не изменило, единственный путь I видит, чтобы сделать, это должно использовать триггер INSTEAD OF. Например, в триггере Вы могли повредиться, оригинал вставляют/обновляют команду в одну команду на строку, захватывая каждый старый идентификатор, прежде чем Вы вставите/обновите.

1
ответ дан 14 December 2019 в 09:01
поделиться

В триггерах в SQL Server у Вас есть доступ к двум таблицам: удаленный и вставленный. Оба из них были уже упомянуты. Вот то, как они функционируют, в зависимости от какого действия триггер стреляет:

ВСТАВЬТЕ ОПЕРАЦИЮ

  • удаленный - не используемый
  • вставленный - содержит новые строки, добавляемые к таблице

УДАЛИТЕ ОПЕРАЦИЮ

  • удаленный - содержит строки, удаляемые из таблицы
  • вставленный - не используемый

ОПЕРАЦИЯ ОБНОВЛЕНИЯ

  • удаленный - содержит строки, поскольку они существовали бы перед операцией ОБНОВЛЕНИЯ
  • вставленный - содержит строки, поскольку они существовали бы после операции ОБНОВЛЕНИЯ

Они функционируют каждым способом как таблицы. Поэтому совершенно возможно использовать находящуюся на строке операцию, такую как что-то как следующее (Операция существует только на контрольной таблице, как делает DateChanged):

INSERT INTO MyAuditTable
(ID, FirstColumn, SecondColumn, ThirdColumn, Operation, DateChanged)
VALUES
SELECT ID, FirstColumn, SecondColumn, ThirdColumn, 'Update-Before', GETDATE()
FROM deleted
UNION ALL
SELECT ID, FirstColumn, SecondColumn, ThirdColumn, 'Update-After', GETDATE()
FROM inserted
0
ответ дан 14 December 2019 в 09:01
поделиться

----новые----добавляют столбец идентификационных данных к таблице, которую не может изменить приложение, можно затем использовать тот новый столбец для соединения вставленного в удаленные таблицы в триггере:

ALTER TABLE YourTableName ADD
    PrivateID int NOT NULL IDENTITY (1, 1)
GO

----старый----Никогда не обновляйте/изменяйте значения ключа. Как можно сделать это и зафиксировать все внешние ключи?

Я не рекомендовал бы когда-либо использовать триггер, который не может обработать ряд строк.

Если необходимо изменить ключ, вставить новую строку с надлежащим новым ключом и значениями, используйте SCOPE_IDENTITY (), если, именно это Ваш делают. Удалите старую строку. Журнал для старой строки, что это было изменено на ключ новой строки, который Вы должны теперь иметь. Я надеюсь, что нет никакого внешнего ключа на измененном ключе в Вашем журнале...

0
ответ дан 14 December 2019 в 09:01
поделиться

Вы можете создать новый столбец идентификаторов в таблице MainTable (названный, например, correlationid) и сопоставить вставленные и удаленные таблицы с помощью этого столбца. Этот новый столбец должен быть прозрачным для существующего кода.

INSERT INTO LOG(OLDID, NEWID)
SELECT deleted.id AS OLDID, inserted.id AS NEWID
FROM inserted 
INNER JOIN deleted 
    ON inserted.correlationid = deleted.correlationid

Обратите внимание, вы можете вставить повторяющиеся записи в таблицу журнала.

0
ответ дан 14 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: