好的,我有一张没有自然键,只有一个整数标识列作为主键的表格。我想插入和检索标识值,但也想使用触发器确保某些字段始终设置。最初的设计是使用代替插入触发器,但这会破坏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(),并且似乎是安全的(如果我的触发器失败,则我的插入也失败)。这是不好的设计吗?如果是,为什么?