Lược đồ SQL Server còn nguyên nhưng mọi bản ghi từ mỗi bảng đều biến mất


7

Gần đây chúng tôi đã thiết lập một máy ảo mới chạy Windows Server 2008 và tát một bản sao của máy chủ SQL 2005 trên đó. Máy chủ đã chạy và sử dụng mà không gặp trở ngại nào trong khoảng hai tuần. Bảo trì thực sự duy nhất chúng tôi đã thực hiện trên đó là di chuyển phân vùng các tệp cơ sở dữ liệu được lưu trữ (đã thực hiện gần một tuần trước) và chúng tôi đã chạy Trình cố vấn điều chỉnh công cụ cơ sở dữ liệu để xem xét một số đề xuất cho các chỉ số mới ngày hôm qua khoảng 12 giờ tối.

Chỉ sau 5 giờ chiều trong khi phần mềm đang được sử dụng như bình thường thì có người thông báo với tôi rằng chương trình dường như không còn hoạt động bình thường nữa. Tôi đã kiểm tra cơ sở dữ liệu và không chỉ dữ liệu cụ thể về việc sử dụng chương trình của anh ta đã biến mất, mà mọi bảng trong năm mươi bảng hoặc dường như bị xóa sạch tất cả các hồ sơ.

Sau khi nói chuyện với các nhà phát triển ứng dụng trong thời gian dài, rõ ràng đây không phải là khả năng từ xa của phần mềm của họ.

Trong cuộc tranh giành để lấy lại từ đôi chân của mình, chúng tôi đã nhân bản một bản sao lưu của VM qua bản sao đang chạy giữa lúc khởi động lại và nó đã chạy được năm trong khoảng một ngày kể từ đó. Do đó, chúng tôi không có nhật ký về các sự kiện dẫn đến vấn đề.

Bạn đã thấy bất cứ điều gì như thế này xảy ra trước đây? (Tất cả các bản ghi trong tất cả các bảng của cơ sở dữ liệu vừa ... biến mất.) Có ai có lý thuyết hợp lý về việc điều này có thể xảy ra không và nếu có bất cứ điều gì sẽ là một biện pháp phòng ngừa hợp lý?


Bạn có khóa ngoại giữa các bảng không?
gbn

Ứng dụng này không sử dụng bất kỳ khóa ngoại nào, vì vậy không có nó.
Kaganar

3
Làm thế nào bạn duy trì tính toàn vẹn tham chiếu tốt hơn thì RDBMS có thể làm gì?
gbn

Thật không may, ứng dụng không nằm trong tầm kiểm soát của tôi, thật không may, và tôi không thể thấy bất kỳ thay đổi nào do kết quả của các yêu cầu trực tiếp của tôi trong vòng vài tháng - một thời gian dài với các vấn đề mất dữ liệu tiềm ẩn như vậy.
Kaganar

Hãy nói rằng ứng dụng này không được mã hóa với một mô hình dữ liệu vững chắc. Đó là một hydra trong cách nó xử lý dữ liệu - một số trên chia sẻ tệp chung, hầu hết trên máy chủ MSSQL và một số trong cơ sở dữ liệu quan hệ dựa trên đĩa. Thật không may, đó là phần mềm thích hợp và nó làm một số thứ rất tốt.
Kaganar

Câu trả lời:


14

Điều này đã xảy ra tại công ty của tôi.

Ai đó đã chạy lại các tập lệnh tạo lược đồ từ bên trong giao diện quản trị của ứng dụng - một cái gì đó giống như lệnh "khởi tạo cơ sở dữ liệu". Các tập lệnh này bao gồm một loạt các IF EXISTS()...DROP...CREATEcâu lệnh để thả và tạo lại mỗi bảng và ràng buộc. Vì chúng được thiết kế để xóa sạch cơ sở dữ liệu ngay cả khi nó đã được điền, chúng được cấu trúc cẩn thận để giải thích cho các mối quan hệ khóa ngoài. Do đó, lược đồ cơ sở dữ liệu đã ở đó và trông rất tuyệt, nhưng tất cả dữ liệu đã biến mất.

Để ngăn chặn điều này, hãy thu hồi các quyền DDL thích hợp từ thông tin đăng nhập cơ sở dữ liệu của ứng dụng sau khi đã tạo lược đồ riêng hoặc đảm bảo mọi chức năng "khởi tạo cơ sở dữ liệu" mà ứng dụng của bạn đã bao gồm một số kiểm tra an toàn và đưa ra cảnh báo phù hợp cho người dùng về những gì sắp xảy ra .


1
Đáng sợ nhưng một lời giải thích có khả năng.
Mark Storey-Smith

@Mark - Rất may, đó là cơ sở dữ liệu QA không lưu trữ dữ liệu quan trọng.
Nick Chammas

11

Mỗi bàn? Đây là sự phá hoại có chủ ý hoặc sự ngu ngốc. Đây không phải là sự cố Máy chủ SQL

Có ít nhất 3 cách:

  • XÓA không có mệnh đề WHERE
  • BẢNG TRUNCATE
  • BẢNG DROP với TẠO BẢNG sau

Nếu bạn có khóa ngoại thì không thể sử dụng TRUNCATE TABLE và phức tạp hơn để sử dụng XÓA. Bạn sẽ phải có nhiều lượt XÓA. Ditto cho DROP / TẠO BẢNG

XÓA không có WHERE khá dễ thực hiện với ứng dụng của bạn sử dụng SQL động và một số logic WHERE được loại bỏ bằng cách ghép nối NULL.

DROP / CREATE và TRUNCATE TABLE cũng đòi hỏi mức độ đặc quyền rất cao.

Tóm lược. Một hoặc nhiều:

  • an ninh kém
  • không có khóa ngoại
  • nhà phát triển thiếu hiểu biết

Chỉnh sửa: trình kích hoạt được thiết kế xấu hoặc FK có thể xóa sạch một số bảng khá nhanh


5
Cách thứ 4 có thể: Nếu có khóa ngoại và chúng được tạo bằng mệnh đề 'on xóa tầng' thì (tùy theo thiết kế cơ sở dữ liệu) xóa mà không có mệnh đề where từ bảng sai có thể xóa sạch toàn bộ cơ sở dữ liệu. Tôi sẽ gọi tóm tắt cho "khóa ngoại có thiết kế kém".
gsiems
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.