这个工程于2008年(依赖于使用MERGE语句来改变其行要被书引用原子)。它不引入新的列,你可能想隐藏视图背后:
CREATE TABLE Author
(
Id UNIQUEIDENTIFIER NOT NULL,
Firstname VARCHAR(100) NOT NULL,
Surname VARCHAR(200) NOT NULL,
ValidFrom DATETIME NOT NULL,
ValidUntil DATETIME NULL,
Active as CASE WHEN ValidUntil is null THEN CONVERT(datetime,'99991231',112) ELSE ValidUntil END Persisted
PRIMARY KEY (ID, ValidFrom),
UNIQUE (ID,Active)
)
go
CREATE TABLE Book
(
Id UNIQUEIDENTIFIER NOT NULL,
Title VARCHAR(100) NOT NULL,
ISBN VARCHAR(100) NOT NULL,
AuthorId UNIQUEIDENTIFIER NOT NULL,
ValidFrom DATETIME NOT NULL,
ValidUntil DATETIME NULL,
PRIMARY KEY (Id, ValidFrom),
FK_Link as CONVERT(datetime,'99991231',112) persisted,
Foreign key (AuthorID,FK_Link) references Author (Id,Active) on delete cascade
)
go
declare @AuthorId uniqueidentifier
set @AuthorId = NEWID()
insert into Author(Id,Firstname,Surname,ValidFrom)
select @AuthorId,'Boris','McBoris',CURRENT_TIMESTAMP
insert into Book(Id,Title,ISBN,AuthorId,ValidFrom)
select NEWID(),'How to use tuple versioning','12345678',@AuthorId,CURRENT_TIMESTAMP
;with newAuthorInfo as (
select @AuthorId as Id,'Steve' as Firstname,'McBoris' as Surname,t.Dupl
from (select 0 union all select 1) t(Dupl)
)
merge into Author a
using newAuthorInfo nai
on
a.Id = nai.Id and
a.ValidUntil is null and
nai.Dupl = 0
when matched then update set ValidUntil = CURRENT_TIMESTAMP
when not matched then insert (Id,Firstname,Surname,ValidFrom)
values (nai.Id,nai.Firstname,nai.Surname,CURRENT_TIMESTAMP);
;with newAuthorInfo as (
select @AuthorId as Id,'Steve' as Firstname,'Sampson' as Surname,t.Dupl
from (select 0 union all select 1) t(Dupl)
)
merge into Author a
using newAuthorInfo nai
on
a.Id = nai.Id and
a.ValidUntil is null and
nai.Dupl = 0
when matched then update set ValidUntil = CURRENT_TIMESTAMP
when not matched then insert (Id,Firstname,Surname,ValidFrom)
values (nai.Id,nai.Firstname,nai.Surname,CURRENT_TIMESTAMP);
go
select * from Author
select * from Book
delete from Author where ValidUntil is not null
select * from Author
select * from Book
delete from Author
select * from Author
select * from Book
对于2008年之前的解决方案,我不认为你可以做得比触发器更好。您可以引入第二个作者表,其中只包含Id列(唯一),您可以从Book中将FK反对,并从该表级联删除到Book。然后,您只需在作者上使用删除触发器,例如,如果您要删除作者的特定作者ID的最后一行,请从此新表中删除该行
+1用于提及元组版本 – 2011-05-20 14:16:40
您是否正在使用at最少的SQL Server 2008? – 2011-05-20 14:26:01
梅根福克斯进行关系数据库设计+1。 – Yuck 2011-05-20 14:47:41