ОК, у меня есть таблица без естественного ключа, только столбец с целочисленной идентификацией в качестве первичного ключа. Я хотел бы вставить и получить значение идентификатора, но также использовать триггер, чтобы убедиться, что определенные поля всегда установлены. Первоначально дизайн должен был использовать вместо триггеров вставки, но это нарушает scope_identity. Предложение вывода в операторе вставки также нарушается триггером вместо вставки. Итак, я разработал альтернативный план и хотел бы знать, если что-то явно не так с тем, что я собираюсь сделать:
начать надуманный пример:
CREATE TABLE [dbo].[TestData] (
[TestId] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Name] [nchar](10) NOT NULL)
CREATE TABLE [dbo].[TestDataModInfo](
[TestId] [int] PRIMARY KEY NOT NULL,
[RowCreateDate] [datetime] NOT NULL)
ALTER TABLE [dbo].[TestDataModInfo] WITH CHECK ADD CONSTRAINT
[FK_TestDataModInfo_TestData] FOREIGN KEY([TestId])
REFERENCES [dbo].[TestData] ([TestId]) ON DELETE CASCADE
CREATE TRIGGER [dbo].[TestData$AfterInsert]
ON [dbo].[TestData]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[TestDataModInfo]
([TestId],
[RowCreateDate])
SELECT
[TestId],
current_timestamp
FROM inserted
-- Insert statements for trigger here
END
Конец надуманного примера.
Нет, я делаю это не для одного небольшого поля даты - это просто пример.
Поля, которые я хочу убедиться, установлены, были перемещены в отдельную таблицу (в TestDataModInfo), а триггер гарантирует, что она обновлена. Это работает, это позволяет мне использовать scope_identity () после вставок, и кажется безопасным (если мой триггер после сбоя, моя вставка завершится неудачно). Это плохой дизайн, и если да, то почему?