У меня есть две таблицы на текущий момент, расположенные в двух разных схемах dbo.table1 и historyyschema.table1history. Я создал триггер, который перемещает все исторические данные из таблицы1 (при вставке, удалении и обновлении) в таблицу1.
Первоначально я пытался спроектировать триггер для передачи информации с помощью INSERT INTO [историческая схема]. [Таблица1history] выберите @columns ...
Явное указание всех столбцов для передачи, но, поскольку две таблицы имеют одинаковые столбцы (за исключением того, что в истории есть дополнительные creation_timestamp и creation_status), я хотел добавить их в общем случае с помощью оператора select *. Я сделал это, потому что тогда, когда в базу данных добавлен столбец, я не хочу возвращаться и каждый раз вручную изменять триггер.
Мне нужен оператор try / catch в случае, если есть ошибка, но она не работает, потому что полученная ошибка не перехватывается try / catch (Полученная ошибка - неявное преобразование из-за неправильно выровненных таблиц). Мне было интересно, есть ли способ перебрать столбцы таблицы1 и убедиться, что столбцы отформатированы таким образом, что информация не будет создавать ошибку при вводе в таблицу1. История.
CREATE TRIGGER [dbo].[table1_History_Change]
ON [dbo].[table1]
AFTER UPDATE, INSERT, DELETE
AS
DECLARE @Now AS DateTIME = GETDATE()
SELECT *
INTO #ModifiedTemp
FROM
(SELECT 'I' *, creation_status, @Now creation_timestamp
FROM inserted
UNION
SELECT *, 'D' creation_status, @Now creation_timestamp
FROM deleted) SubQuery
IF (SELECT COUNT(*) FROM #ModifiedTemp WHERE creation_status = 'D') > 0
AND (SELECT COUNT(*) FROM #ModifiedTemp WHERE creation_status = 'I') > 0
BEGIN
DELETE FROM #ModifiedTemp
WHERE creation_status = 'D'
UPDATE #ModifiedTemp
SET creation_status = 'U'
END
BEGIN TRY
INSERT INTO [HistorySchema].[Table1History]
SELECT *
FROM #ModifiedTemp
END TRY
BEGIN CATCH
PRINT 'History unsuccessfully saved (ERROR: bundle_procedure_change)'
DROP TABLE #ModifiedTemp
RETURN
END CATCH
DROP TABLE #ModifiedTemp
(Это мои первые посты, так что если у вас есть какие-либо критические замечания, которые помогут мне улучшить их, они приветствуются:).)
ПРИМЕЧАНИЕ. Если таблицы отформатированы неправильно, я хочу, чтобы триггер просто не создавал историю, а выполнял транзакцию на главной таблице.