2012-04-03 30 views
19

Tôi đang cố tạo trình kích hoạt cơ sở dữ liệu cơ bản có điều kiện xóa các hàng khỏi database1.table1 khi một hàng từ database2.table2 bị xóa. Tôi là người mới khởi xướng và hy vọng tìm hiểu cách tốt nhất để thực hiện điều này. Đây là những gì tôi có cho đến nay. Gợi ý?Máy chủ SQL BẬT DELETE Kích hoạt

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    IF EXISTS (SELECT foo 
       FROM database2.dbo.table2 
       WHERE id = deleted.id 
       AND bar = 4) 

-- If there is a row that exists in database2.dbo.table2 
-- matching the id of the deleted row and bar=4, delete 
-- it as well. 

-- DELETE STATEMENT? 

GO 
+4

Bạn cần để đưa vào tài khoản mà kích hoạt được kích hoạt ** một lần cho mỗi tuyên bố ** (và ** NOT ** một lần pe r hàng như nhiều devs tin) và rằng bảng 'Deleted' giả có thể chứa ** nhiều hàng ** (nếu câu lệnh của bạn đã xóa nhiều hàng) –

+0

@marc_s - Trong hệ thống, chỉ có một hàng có thể bị xóa cùng một lúc (ứng dụng front-end). Bạn có thể giải thích về ý của bạn không. Nó đơn giản như thay đổi 'WHERE id = deleted.id' thành' WHERE id IN (SELECT id FROM deleted) '? –

+2

@ShawnH. Vâng, nó phải là đơn giản. Tôi nghĩ Marc có nghĩa là nếu bằng cách nào đó xóa khối lượng được gọi từ đâu đó thì kích hoạt sẽ chỉ cháy một lần cho toàn bộ câu lệnh chứ không phải trên mỗi hàng, do đó, sử dụng 'IN' nên sắp xếp theo một trong hai cách. – Bridge

Trả lời

49
CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    DELETE FROM database2.dbo.table2 
    WHERE bar = 4 AND ID IN(SELECT deleted.id FROM deleted) 
GO 
+0

Cảm ơn bạn. Điều này đơn giản hơn nhiều và hoạt động như một nét duyên dáng. –

2

INSERTEDDELETED là các bảng ảo. Chúng cần được sử dụng trong mệnh đề FROM.

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    IF EXISTS (SELECT foo 
       FROM database2.dbo.table2 
       WHERE id IN (SELECT deleted.id FROM deleted) 
       AND bar = 4) 
8

Tốt hơn để sử dụng:

DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key 
1

tôi sẽ đề nghị việc sử dụng exists thay vì in bởi vì trong một số tình huống mà ngụ ý các giá trị null the behavior is different, vì vậy

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    DELETE FROM database2.dbo.table2 childTable 
    WHERE bar = 4 AND exists (SELECT id FROM deleted where deleted.id = childTable.id) 
GO 
Các vấn đề liên quan