Tương đương với - cập nhật an toàn của mysql trong MS SQL Server là gì?


Câu trả lời:


10

Có thể có hoặc không có một điều như vậy trong MS SQL, nhưng tại sao bạn lại muốn điều này?

Đã có một cách để hạn chế những gì UPDATEảnh hưởng ( WHEREđiều khoản).
Đã có một cơ chế để bảo vệ dữ liệu của bạn khi thực hiện các thay đổi (Giao dịch).

Kết hợp cả hai, chúng tôi có được giải pháp cho trường hợp chung: "Thực hiện cập nhật của bạn trong một giao dịch, với các mệnh đề WHERE phù hợp để hạn chế những gì họ chạm vào và đảm bảo kết quả trông đúng trước khi bạn cam kết":

> BEGIN;
> UPDATE mytable SET foostring='NewValue' WHERE id > 16 AND id < 32;
15 Rows Updated

> SELECT * FROM mytable;

  [Omitted -- Make sure it looks right]

> COMMIT;  --- Or ROLLBACK if the SELECT doesn't look right

Điều này hữu ích vì nếu người dùng trái phép bằng cách nào đó truy cập DB của bạn hoặc nếu bạn say rượu hoặc say rượu, bạn có thể hạn chế thiệt hại có thể gây ra một cách hiệu quả.
dùng893730

4
Nếu một người dùng trái phép bằng cách nào đó truy cập DB của bạn, bạn có vấn đề lớn hơn. Nếu bạn đang làm việc trong khi say rượu hoặc say rượu. . . KHÔNG .
voretaq7

3
@ user893730: "Người dùng trái phép" chỉ có thể thực hiện "SET sql_safe_updates = 0;". (Không đề cập đến việc họ có thể bỏ bàn xuống)
Billy ONeal

1
Xin lỗi, bây giờ tôi nhớ rằng lý do điều này được đưa vào mysql là hợp lý vì bạn có thể làm hỏng dữ liệu của mình do đó, do đó bạn có thể hạn chế thiệt hại đó ở đây, trong trường hợp bạn không thực sự có kế hoạch cập nhật một số lượng lớn hàng
user893730

Tại sao ngôn ngữ được xây dựng như vậy, Nếu họ đã yêu cầu thêm từ khóa "TẤT CẢ" sau khi cập nhật hoặc xóa, nó sẽ ngăn các thay đổi ngẫu nhiên cho bảng. Ngoài ra, studio quản lý có thể xem trước khi chạy truy vấn nếu đó là xóa hoặc cập nhật mà không có mệnh đề where.
Ronen Festinger

5

Đó là mỗi truy vấn sử dụng TOP nếu bạn muốn.

UPDATE TOP(100) Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;

SET ROWCOUNT có tác dụng phụ đối với số lượng trung gian mang lại kết quả sai lệch, đó là lý do tại sao nó đang dần bị phản đối. Ví dụ MSDN đầu tiên cho thấy điều này

May mắn thay, SQL Server với tư cách là một RDBMS trưởng thành có các ảnh chụp nhanh cơ sở dữ liệu và các bản sao lưu nhất quán trực tuyến mang lại sự phục hồi kịp thời trong trường hợp bạn lấy nó ...


1
Tính năng thú vị, @gbn. Tôi sẽ nâng cấp sau khi tôi ở giới hạn số phiếu bầu hôm nay !!!
RolandoMySQLDBA

Như đã hứa, +1 !!!
RolandoMySQLDBA

Chắc chắn là một tính năng thú vị! @gbn - vì tò mò là một phần của tiêu chuẩn SQL, hay phần mở rộng MS SQL? (Tôi không thấy bất kỳ tài liệu tham khảo nào trong tài liệu Postgres nhưng nếu đó là một phần của tiêu chuẩn tôi sẽ than vãn và để nó được thực hiện :-)
voretaq7

TOP là không chuẩn.
gbn

4

Tôi không tin như vậy - một trong những điều đầu tiên tôi học được là viết câu lệnh CHỌN trước với các mệnh đề WHERE chính xác để đảm bảo nó đúng, sau đó thay đổi CHỌN thành CẬP NHẬT.


1

Nếu bạn muốn bắt chước loại hành vi đó, bạn không thể làm gì nhiều ngoài việc giới hạn số lượng hàng bằng TSQL.

Dưới đây là một ví dụ từ Tài liệu Máy chủ SQL:

SET ROWCOUNT 4;
UPDATE Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;
GO

Theo http://msdn.microsoft.com/en-us/l Library / ms188774.aspx :

Việc sử dụng SET ROWCOUNT sẽ không ảnh hưởng đến các câu lệnh DELETE, INSERT và UPDATE trong bản phát hành tiếp theo của SQL Server. Không sử dụng SET ROWCOUNT với các câu lệnh DELETE, INSERT và UPDATE trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng nó. Ngoài ra, đối với các câu lệnh XÓA, XÁC NHẬN và CẬP NHẬT hiện đang sử dụng SET ROWCOUNT, chúng tôi khuyên bạn nên viết lại chúng để sử dụng cú pháp TOP. Để biết thêm thông tin, hãy xem XÓA (Transact-SQL), INSERT (Transact-SQL) hoặc UPDATE (Transact-SQL).

Do đó, SQL Server 2012 sẽ không cho phép SET ROWCOUNThoạt động trên DML đã nói ở trên.

Nếu bạn lo ngại về các truy vấn có thể vô tình phá hoại:

  • không chạy bất kỳ loại tự động nào
  • không khởi động SQL Server ở chế độ người dùng đơn (vì các dịch vụ CHECKPOINT bị tắt, điều này sẽ tự động hiệu quả)

Ngoài những điều này, tất cả các tính năng khác của mysql - cập nhật an toàn hoàn toàn là trách nhiệm của bạn.


3
Bạn thực sự sẽ sử dụng UPDATE TOP (4) Production.ProductInventory ...kể từ SQL Server 2005 ...
gbn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.