Bạn đã xem qua việc thiết lập trình kích hoạt DDL trên toàn máy chủ chưa? Tôi đã sử dụng thành công trên một số máy chủ sản xuất để chặn các thay đổi trái phép được thực hiện bởi các nhà phát triển. Tôi đã tham gia một công ty nơi TẤT CẢ các nhà phát triển có quyền truy cập SA đầy đủ.
Khi chúng tôi cố gắng thay đổi quyền của họ, chúng tôi đã có một cuộc cách mạng toàn diện vì các nhà phát triển đột nhiên 'không thể làm việc của họ'. Vì vậy, tôi đã sử dụng một trình kích hoạt DDL trên toàn máy chủ để hạn chế những gì họ có thể làm. Nó rất đơn giản.
Tôi đã tạo một bảng có tên AuthorizedDDLUser có cấu trúc rất đơn giản giống như thế này:
CREATE TABLE [dbo].[AuthorizedDDLUser](
[Username] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_AuthorizedDDLUser] PRIMARY KEY CLUSTERED
(
[Username] ASC
)
WITH (
PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Sau đó tôi đã chèn tên Đăng nhập của các nhà phát triển mà tôi sẽ cho phép thực hiện thay đổi (ví dụ: nhóm DBA và nhà phát triển SQL cao cấp).
Sau đó tôi đã tạo một trình kích hoạt DDL trên máy chủ tương tự như sau:
CREATE TRIGGER [block_ddl]
ON SERVER
FOR CREATE_PROCEDURE,ALTER_PROCEDURE, DROP_PROCEDURE,
CREATE_TABLE,ALTER_TABLE, DROP_TABLE,
CREATE_FUNCTION,ALTER_FUNCTION, DROP_FUNCTION,
CREATE_INDEX,ALTER_INDEX, DROP_INDEX,
CREATE_VIEW,ALTER_VIEW, DROP_VIEW,
CREATE_TRIGGER,ALTER_TRIGGER, DROP_TRIGGER
AS
IF NOT EXISTS(SELECT UserName FROM AuthorizedDDLUser WHERE UserName=CURRENT_USER)
BEGIN
//RAISE CUSTOM ERROR MESSAGE HERE AND ROLLBACK THE TRANSACTION
// ROLLING BACK EFFECTIVELY CANCELS THE DDL STATEMENT
ROLLBACK TRANSACTION --
END
Việc thực hiện của tôi có liên quan nhiều hơn một chút vì nó cũng đã kiểm toán. Tuy nhiên tôi đang cố gắng để giữ cho nó đơn giản ở đây.
Vì vậy, tóm lại, bạn có thể chọn lọc giới hạn những gì người dùng được liên kết có thể làm trên hệ thống. Để thực sự bắt đầu với điều này, tôi khuyên bạn nên đọc các bài viết sau.
- Sử dụng Trình kích hoạt DDL để chặn thay đổi lược đồ trong SQL Server: http://www.mssqltips.com/sqlservertip/2646/USE-a-ddl-trigger-to-block-schema-changes-in-sql-server/
- Kiểm tra các lệnh DDL (Tạo, thay đổi, thả) trong SQL Server 2005: http://www.mssqltips.com/sqlservertip/1006/auditing-ddl-create-alter-drop-commands-in-sql-server-2005/
- Danh sách sự kiện DDL: http://msdn.microsoft.com/en-us/ms189540.aspx
- Kích hoạt DDL: http://msdn.microsoft.com/en-us/l Library / ms175941.aspx
- Sử dụng Hàm EventData () với trình kích hoạt DDL trong SQL Server 2005: http://www.mssqltips.com/sqlservertip/1571/USE-the-eventdata-feft-with-ddl-triggers-in-sql-server-2005/
Vì vậy, trong trường hợp của tôi, các nhà phát triển vẫn có thể làm được khá nhiều thứ trừ việc làm rối hệ thống của tôi. Cuối cùng, chúng tôi đã loại bỏ được quyền truy cập SA và cuộc sống của tôi trở lại bình thường nhờ các trình kích hoạt DDL.
Mong rằng sẽ giúp!
CẬP NHẬT:
Cảm ơn Martin Smith đã chỉ ra rằng đây là sau khi kích hoạt. Một cái gì đó tôi đã không nhận ra cho đến bây giờ (bạn học hàng ngày). Bài báo MSDN rất khó hiểu ở chỗ nó chỉ ra rằng nó là cả trước và sau khi kích hoạt. Vì vậy, điều này có thể mở ra một số tiềm năng cho các vấn đề về hiệu suất nếu như Martin nói rằng bạn khôi phục lại việc xây dựng chỉ mục trên một bảng khá lớn. Tuy nhiên nếu bạn chỉ chặn chế độ xem và bảng được tạo thì sẽ ổn thôi.
Vì vậy, sử dụng một cách khôn ngoan.
Họ thực sự cần phải sửa lỗi này vì nó giới hạn khả năng sử dụng của tính năng này.