好的,我有一个没有自然键的表,只有一个整数标识列作为主键。我想插入和检索标识值,但也使用触发器来确保始终设置某些字段。最初,该设计是用来代替插入触发器,但是打破了scope_identity。插入语句的输出子句也被插入触发器取代。所以,我想出了一个替代计划,并想知道是否有什么明显错误与我打算做的: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(),并且看起来是安全的(如果我的after触发器失败,我的插入失败)。这是不好的设计,如果是这样,为什么?
谢谢乔尔 - 没有看到我自己的马虎打字。 – 2009-09-16 16:36:27
我假设你正在验证触发器中的字段而不是由于遗留数据造成的约束? – Maslow 2010-01-27 13:55:11
@Maslow,触发器应该是确保某些字段总是或从未更新(updateDate,createdate)的最简单,最强有力的方法。这些确保您不能违反这些规则,除非您有权禁用触发器。再一层保护。 – 2010-02-05 13:24:48