在SQL Server 2008 R2的安装程序中,我有table1 (id, col1-1, col1-2, ...)
和table2 (id, table1_id, col2-1, col2-2, ...)
,其中table2.table1_id
指向table1.id
(即外键与主键的关系)。 / p>
我该如何执行以下规则:每次有人将记录插入table1
时,他们还需要在table2
中创建记录?
我猜想这里使用的明显机制是触发器,但这会导致鸡和蛋的问题,因为触发器需要table2
中的记录才能在{{1 }},但是为了在table1
中创建记录,我需要table2
值已经存在。如何克服这个问题?
我需要自动实施实施并将其内置到数据库中。频繁运行的作业要检查table1.id
中的记录而没有table1
中的相应记录将无法进行剪切,并且当某人实际上在table2
中创建记录时,必须实时执行该规则。
答案 0 :(得分:0)
您只需使用OUTPUT子句即可。这是一个简单的例子
CREATE TABLE Parent(Id INT, Col VARCHAR(45));
CREATE TABLE Child(Id INT, Col VARCHAR(45));
INSERT INTO Parent(Id, Col)
OUTPUT INSERTED.Id, INSERTED.Col INTO Child
VALUES(1, 'SomeValue');
SELECT *
FROM Parent P
JOIN Child C ON P.Id = C.Id;
请注意,对SQL Server 2008/2008 R2的扩展支持将于2019年7月9日结束。您应尽快升级。
答案 1 :(得分:0)
鸡肉和鸡蛋问题是可以预防的,但是我在Windows SQL 2016上进行了测试:
CREATE TRIGGER [dbo].[Table1_Insert]
ON [dbo].[Table1RR] AFTER INSERT
AS
IF rowcount_big() = 0 RETURN --leave trigger if no record (-s) inserted in the Table1
SET NOCOUNT ON
ALTER TABLE dbo.Table2RR NOCHECK CONSTRAINT FK_Table2_Table1 -- resolve chicken and the egg problem
INSERT INTO dbo.Table2RR select id,null,null from inserted order by id
ALTER TABLE dbo.Table2RR CHECK CONSTRAINT FK_Table2_Table1
GO
ALTER TABLE [dbo].[Table1RR] ENABLE TRIGGER [Table1_Insert]
GO