以下示例说明了如何使用触发器来实现此行为。INSERT
请注意,如果在事务中一次插入一个子行,而不是在单个语句中,这将不起作用。
CREATE TABLE parent1
(id INT PRIMARY KEY)
CREATE TABLE child1
(id INT
,parent_id INT
)
GO
ALTER TABLE child1 ADD CONSTRAINT chilld1fk FOREIGN KEY (parent_id)
REFERENCES parent1 (id)
GO
CREATE TRIGGER trg_child1
ON child1
INSTEAD OF INSERT
AS
SELECT parent_id
FROM child1 AS c
WHERE EXISTS (SELECT 1
FROM inserted AS i
WHERE i.parent_id = c.parent_id
)
IF @@ROWCOUNT > 0
BEGIN
RAISERROR('You cannot amend this request',16,1)
END
ELSE
BEGIN
INSERT child1
SELECT id
,parent_id
FROM inserted
END
GO
BEGIN TRAN
INSERT parent1
VALUES (1)
INSERT child1
(id
,parent_id
)
SELECT 10,1
UNION SELECT 11,1
COMMIT
-- attempting to insert another child outside the transaction
-- will result in an error
INSERT child1
SELECT 12,1
SELECT * FROM child1