Làm thế nào để ẩn / vô hiệu hóa các bảng mà không thả chúng để kiểm tra dự phòng?


12

Tôi phải duy trì và mở rộng một hệ thống cũ có chứa các phương thức dịch vụ web và các bảng cơ sở dữ liệu không còn được sử dụng. Vì tôi không hoàn toàn chắc chắn rằng các bảng thực sự dư thừa, tôi sợ bỏ chúng.

Có cách nào khác để đạt được hiệu ứng tương tự (không thể sử dụng bảng nữa) mà không làm rơi chúng? Ý tưởng của tôi là chuyển chúng sang một lược đồ khác (ví dụ Deleted:) từ mặc định hiện tại , dbo.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

Có bất kỳ tùy chọn nào khác hoặc có bất kỳ nhược điểm nào đối với cách tiếp cận lược đồ không?

Câu trả lời:


7

Có cách nào khác để đạt được điều tương tự (không thể sử dụng bảng nữa) mà không làm rơi chúng không?

Thay đổi lược đồ là một hoạt động rất nhanh - chỉ cần thay đổi siêu dữ liệu. Ý tưởng ban đầu tôi có được là từ blog của Aaron Bertrand - Schema Switch-A-Roo .

Bạn có thể làm theo các bước từ câu trả lời của tôi ở đây

Rõ ràng có các phương thức khác như sp_rename N'old bảng ', bảng N'new' hoặc chỉ từ chối quyền đối với bảng.


Tôi không chắc câu trả lời nào tôi nên chấp nhận vì tất cả đều hữu ích. Tôi không biết bài viết của Aaron, vì vậy tôi đã chấp nhận điều này vì nó chứa nhiều thông tin hơn (ngay cả khi chỉ được liên kết).
Tim Schmelter

@TimSchmelter Vui mừng bạn thấy nó hữu ích. Không có nghĩa gì để lặp lại ở đây những gì bài viết hoặc câu trả lời của tôi (được liên kết). Đó là lý do tại sao tôi đã tham chiếu nó.
Kin Shah

12

Một vài tùy chọn khác là chỉ đổi tên các bảng hoặc nếu chúng có các chỉ mục được nhóm, bạn có thể vô hiệu hóa chỉ mục được nhóm.


Cảm ơn. Tôi không biết rằng việc vô hiệu hóa một chỉ mục được nhóm làm cho bảng không thể sử dụng được. Những ưu và nhược điểm của các phương pháp này (+ lược đồ) là gì?
Tim Schmelter

5
@TimSchmelter một khuyết điểm của việc vô hiệu hóa CI là để kích hoạt lại nó, bạn cần xây dựng lại chỉ mục. Một tùy chọn khác là từ chối các quyền trên bảng đối với vai trò chung mặc dù chủ sở hữu cơ sở dữ liệu hoặc quản trị viên hệ thống vẫn sẽ nhìn thấy chúng và cũng có thể thông qua chuỗi quyền sở hữu.
Martin Smith

Trước khi bỏ một bảng hoặc thả một cột từ một bảng, tôi thường đổi tên nó bằng cách thêm "_deprecated" hoặc một số như vậy vào cuối tên. Sau đó, nếu không có lỗi, không được có bất cứ điều gì liên quan đến nó.
Jay

Quyền thay đổi là chancy. Nếu tài khoản dịch vụ chạy một ứng dụng là dbo, hoặc thậm chí tệ hơn là sysadmin thì nó sẽ hoàn toàn bỏ qua mọi loại DENY. Hy vọng họ không, nhưng nó xảy ra.
Kenneth Fisher

6

Xóa các quyền trên bảng khỏi Vai trò / Nhóm (Tài khoản / Tài khoản) mà [có thể] đang sử dụng.

Nếu bất cứ điều gì nổ tung, hãy đặt chúng trở lại [một cách nhanh chóng].

Gợi ý: Sử dụng một kịch bản để thực hiện những thay đổi này sẽ là một ý tưởng thực sự, thực sự tốt.


Như sẽ thử nghiệm trên một cơ sở dữ liệu phi sản xuất. ;) Hy vọng rằng điều đó là hiển nhiên đối với OP, mặc dù.
jpmc26

@ jpmc26. tôi sẽ kiểm tra trong một cơ sở dữ liệu phi sản xuất đầu tiên. Nhưng vấn đề là tôi muốn biết nếu các hàm hoặc đối tượng cơ sở dữ liệu được sử dụng từ bên ngoài (không chỉ thông qua các phương thức dịch vụ web mà còn trực tiếp trên cơ sở dữ liệu hoặc công cụ quản trị ở các vị trí khác của công ty).
Tim Schmelter

Hừm. Nếu bạn đang tìm kiếm truy cập DB trực tiếp bởi các DBA, có vẻ như đăng nhập theo thứ tự. Có thể bạn sẽ không thấy cách sử dụng tương tự trong prod và non-prod từ công việc thủ công. Tôi không thực sự chắc chắn việc đăng nhập các thao tác này sẽ dễ dàng như thế nào, nhưng nếu bạn đã đăng nhập prod, bạn có thể phân tích nó để tìm kiếm các ứng dụng.
jpmc26

@ jpmc26: Không sao nếu những quản trị viên đó sẽ ngã sấp mặt, họ sẽ báo cáo. Không ổn với khách hàng, nhưng điều đó có thể được kiểm tra trên hệ thống kiểm tra trước khi triển khai.
Tim Schmelter

3

Xóa quyền thường không hoạt động vì bạn không thể CERTAIN rằng ai đó không có quyền. Có thể thông qua một nhóm, vai trò hoặc thậm chí vì họ là sysadmin (mặc dù chúng ta hy vọng là không).

Đối với các bảng bạn có thể vô hiệu hóa chúng. Và đó là một quá trình nhanh chóng. Tuy nhiên, để cho phép chúng yêu cầu bạn xây dựng lại chúng và cho một bảng lớn có thể khiến bạn mất nhiều thời gian.

Đặt cược tốt nhất của bạn sẽ là di chuyển đối tượng vào một lược đồ mới (như bạn đề xuất) hoặc đặt tên lại cho đối tượng. Cả hai thao tác này đều nhanh chóng và dễ dàng để thực hiện và hoàn tác. Quyền cũng sẽ được giữ nguyên ở cả hai hướng.

Một bước bổ sung bạn có thể thực hiện là thêm "ghi chú TBD" trong các thuộc tính mở rộng của đối tượng. Bạn có thể ghi chú khi bạn thực hiện thay đổi và / hoặc bất kỳ ghi chú nào bạn có thể có về lý do tại sao bạn cảm thấy an toàn để thoát khỏi.

Tất cả những gì nói rằng tôi sẽ chạy một phiên sự kiện mở rộng (hoặc dấu vết hồ sơ) trong vài ngày để đảm bảo bạn có tất cả các đối tượng đang được sử dụng. Bạn có thể giới hạn rất nhiều phiên chỉ là tên đối tượng & khi nó được chạm để giảm chi phí. Ngoài ra, hãy đảm bảo bạn chạy phiên này trong một vài ngày ở hai bên của cuối tháng và thậm chí có thể cuối quý để đảm bảo bạn có mọi thứ.


3

Xóa các quyền như Phil W. đề xuất.

Cũng loại bỏ các quyền từ bất kỳ thủ tục được lưu trữ sử dụng các bảng. Trong SQL Server, các quyền (tôi không biết về người khác) được nối từ một đối tượng gọi (ví dụ: thủ tục được lưu trữ) vào đối tượng được gọi (ví dụ: bảng).


Nhiệm vụ là để cho tất cả các công cụ, chức năng, đối tượng, truy vấn (ngay cả trong cơ sở dữ liệu từ xa) không thể truy cập các bảng này. Nếu tôi phải sửa đổi một thủ tục được lưu trữ, tôi đã phải biết rằng nó sử dụng nó. Hoặc có cách nào đơn giản để xác định rằng một bảng được sử dụng bởi một thủ tục được lưu trữ không?
Tim Schmelter

Tôi không đề nghị sửa đổi thủ tục được lưu trữ, chỉ loại bỏ quyền EXECUTE của nó. Như bạn nói, thật dễ dàng để khôi phục sự cho phép nếu cần thiết. Bạn có thể xem những bảng nào được sử dụng bởi một thủ tục được lưu trữ: Trong SQL Server Management Studio, Object Explorer, chọn cơ sở dữ liệu của bạn -> Khả năng lập trình -> Thủ tục lưu trữ. Nhấp chuột phải vào tên sproc và chọn Xem phụ thuộc. Chọn Đối tượng mà [tên sproc] phụ thuộc vào.
Peter Bill
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.