2009-08-25 20 views
5

Gần đây tôi đã đọc trong PofEA của Fowler rằng một số công cụ cơ sở dữ liệu cho phép bạn hoãn kiểm tra RI cho đến khi kết thúc giao dịch. Điều này có thể xảy ra trong SQL Server không?Có thể hoãn kiểm tra tính toàn vẹn tham chiếu cho đến khi kết thúc giao dịch trong SQL Server không?

Sự cố xảy ra với một số tình huống mà tôi đang cố lưu các thay đổi bao gồm chèn và xóa, có thể khó xác định thứ tự chính xác để thực hiện các thao tác để tránh lỗi RI. Tôi biết rằng vào cuối giao dịch, RI sẽ tốt vì vậy nó có vẻ lý tưởng để hoãn các kiểm tra này.

+0

Bạn có thể làm cho nó xảy ra bằng cách tắt/cho phép hạn chế vào lúc bắt đầu và kết thúc của một sproc, nhưng đó là một con đường đáng sợ đến nỗi tôi thực sự đặt câu hỏi về ứng dụng và/hoặc mô hình dữ liệu. –

Trả lời

3

Có vẻ như máy chủ sql không cho phép điều này, nhưng bạn aren't the only one ai muốn nó. Đó là một phần của tiêu chuẩn SQL 92, vì vậy họ đã có 17 năm để tìm ra nó. Sau đó, một lần nữa, MySQL không hỗ trợ nó (mặc dù Oracle có).

Sắp xếp lại các câu lệnh có lẽ là lựa chọn tốt nhất của bạn.

+1

Ugh. Có nhiều thứ hữu ích hơn họ nên thực hiện hơn thế. Các gói, cú pháp thực tế cho các truy vấn phân cấp ... –

+0

Cảm ơn bạn đã liên kết. Vui mừng khi biết tôi không phải là người duy nhất nghĩ rằng điều này sẽ hữu ích. –

2

Bạn nên tắt xác định đúng thứ tự để giao dịch có thể không thành công vào thời điểm thích hợp. Đây phải là quyết định một lần.

+1

Vấn đề là giao dịch không nên thất bại. Kiểm tra RI bị lỗi sẽ không liên quan đến cuối giao dịch vì các hàng liên quan sẽ bị xóa. Nó cũng là một sự lãng phí thời gian để làm kiểm tra. –

+1

Nó không nên, nhưng nó * có thể *. Trong khi tính năng này có thể có mặt trong các RDBMS khác, nó có vẻ rất "có mùi" với tôi. Nó không phải là khó khăn để xác định thứ tự thích hợp thực hiện. –

+1

Vâng, nó có vẻ có mùi với bạn, nhưng Martin Fowler nghĩ rằng nó là hữu ích và tiêu chuẩn ANSI SQL-92 nói rằng đó là cách nó nên làm việc, vì vậy đó là đủ tốt cho tôi :-) –

2

Máy chủ SQL không có tính năng này. Tôi có thể đề nghị rằng nếu thật khó để xác định thứ tự chèn đúng (hoặc không có), thì thiết kế cơ sở dữ liệu của bạn có thể cần phải được tái cấu trúc hoặc ít nhất là được kiểm tra rất cẩn thận.

+1

+1: Thật vậy, âm thanh như một vấn đề thiết kế. –

+0

Nó không phải là tôi không biết thứ tự chèn nhưng tôi đang sử dụng một ORM cơ bản sẽ INSERT hoặc DELETE dựa trên trạng thái của các đối tượng. Nếu tôi có mã nói A.Save(); B.Save(); C.Lưu(); và những người tiết kiệm làm INSERTs thì tất cả đều tốt. Tuy nhiên, nếu những đối tượng đó đã bị xóa thì tôi thực sự cần phải làm C.Save(); B.Save(); A.Save(); –

2

Nếu bạn đang ở trên SQL Server 2008, bạn có thể sử dụng để kết hợp MERGE chèn/xóa vào một giao dịch RI-an toàn duy nhất ...

Các vấn đề liên quan