require('0-RootController')
можно было бы использовать, если бы был 0-RootController
пакет NPM.
Если это относительный путь, он должен быть:
var RootController = require('./0-RootController');
Можно ли предположить, что таблицы INSERTED и DELETED, представленные вам в триггере, гарантированно находятся в одном порядке?
DECLARE @OldKey int, @NewKey int;
SELECT @Oldkey = [ID] FROM DELETED;
SELECT @NewKey = [ID] FROM INSERTED;
Это только работает, если у Вас есть одна строка. Иначе у Вас нет "привязки" для соединения старых и новых строк. Так зарегистрируйтесь в своем триггере для> 1 во ВСТАВЛЕННОМ.
Я не думаю, что это возможно. Вообразите, есть ли у Вас 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. И что еще более важно, можно ли описать то, что отличается между ними? Весь материал, который говорит Вам, какие столбцы были обновлены, не поможет Вам.
Если возможно в этом случае, что существует дополнительный ключ на таблице (например, Описание УНИКАЛЬНО), и Ваши правила обновления позволяют его, Вы могли записать триггер для предотвращения одновременных обновлений обоих ключей, и затем можно использовать, какой бы ни ключ не был обновлен для корреляции этих двух таблиц.
Если необходимо обработать несколько-строк, вставляет/обновляет, и нет никакого альтернативного ключа, который это гарантировало, что не изменило, единственный путь I видит, чтобы сделать, это должно использовать триггер INSTEAD OF. Например, в триггере Вы могли повредиться, оригинал вставляют/обновляют команду в одну команду на строку, захватывая каждый старый идентификатор, прежде чем Вы вставите/обновите.
В триггерах в 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
----новые----добавляют столбец идентификационных данных к таблице, которую не может изменить приложение, можно затем использовать тот новый столбец для соединения вставленного в удаленные таблицы в триггере:
ALTER TABLE YourTableName ADD
PrivateID int NOT NULL IDENTITY (1, 1)
GO
----старый----Никогда не обновляйте/изменяйте значения ключа. Как можно сделать это и зафиксировать все внешние ключи?
Я не рекомендовал бы когда-либо использовать триггер, который не может обработать ряд строк.
Если необходимо изменить ключ, вставить новую строку с надлежащим новым ключом и значениями, используйте SCOPE_IDENTITY (), если, именно это Ваш делают. Удалите старую строку. Журнал для старой строки, что это было изменено на ключ новой строки, который Вы должны теперь иметь. Я надеюсь, что нет никакого внешнего ключа на измененном ключе в Вашем журнале...
Вы можете создать новый столбец идентификаторов в таблице 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
Обратите внимание, вы можете вставить повторяющиеся записи в таблицу журнала.