好的,我有一個沒有自然鍵的表,只有一個整數標識列作爲主鍵。我想插入和檢索標識值,但也使用觸發器來確保始終設置某些字段。最初,該設計是用來代替插入觸發器,但是打破了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