Đối với tôi, dường như bạn không đợi mã SQL trong câu trả lời cho câu hỏi của mình. Khía cạnh chính mà bạn thắc mắc là khía cạnh bảo mật. Bạn nên làm gì để thực hiện yêu cầu của mình mà không có sysadmin đặc quyền và không có lỗ hổng bảo mật mới? Tôi nghĩ đây là câu hỏi thực sự của bạn.
Tôi thấy có ít nhất 3 cách để giải quyết vấn đề của bạn. Nhưng trước hết, một lời giải thích ngắn gọn tại sao các đặc quyền sysadmin lại tồn tại trong tất cả các giải pháp dựa trên Quy trình được lưu trữ mở rộng . Các thủ tục được lưu trữ mở rộng như xp_cmdshell
rất cũ. Chúng tồn tại ít nhất trước SQL Server 4.2, Microsoft SQL Server đầu tiên chạy dưới Windows NT (NT 3.1) đầu tiên. Trong phiên bản cũ của SQL Server, tôi không bị hạn chế bảo mật để thực thi các thủ tục như vậy, nhưng sau đó người ta đã đưa ra các hạn chế như vậy. Điều quan trọng cần hiểu là tất cả mục đích chung các thủ tục cho phép bắt đầu bất kỳ quy trình nào trong tài khoản SQL Server như xp_cmdshell
và sp_OACreate
phải có sysadmin hạn chế đặc quyền. Chỉ một định hướng nhiệm vụ các thủ tục với khu vực sử dụng rõ ràng và quyền dựa trên vai trò có thể giải quyết vấn đề mà không có lỗ hổng bảo mật. Vì vậy, đây là 3 cách giải quyết mà tôi đã hứa trước đây:
- Bạn tạo một tài khoản SQL mới trên máy chủ SQL của mình bằng sysadmin các đặc quyền. Sau đó, bạn tạo một thủ tục được lưu trữ sử dụng một số từ Các thủ tục được lưu trữ mở rộng như
xp_cmdshell
hoặcsp_OACreate
và thực hiện các yêu cầu của bạn về mặt kỹ thuật (xuất một số thông tin thành tệp CSV). Đối với EXECUTE AS Mệnh đề (xem http://msdn.microsoft.com/en-us/ thư viện / ms188354.aspx ) bạn định cấu hình thủ tục được lưu trữ đã tạo để nó chạy trong tài khoản với sysadmin các đặc quyền. Bạn ủy quyền việc thực thi quy trình này cho người dùng có vai trò SQL nào đó, để linh hoạt hơn từ phía ủy quyền. - Bạn có thể sử dụng Quy trình được Lưu trữ CLR thay vì
xp_cmdshell
vàsp_OACreate
. Bạn cũng nên sử dụng các quyền dựa trên vai trò trên quy trình đã tạo. - Người dùng cuối không gọi trực tiếp bất kỳ quy trình được lưu trữ SQL nào mà bạn tạo. Tồn tại một phần mềm (như dịch vụ WCF hoặc một Trang web) gọi thủ tục lưu trữ SQL của bạn. Bạn có thể triển khai xuất sang tệp CSV bên trong phần mềm này chứ không phải bên trong bất kỳ quy trình lưu trữ SQL nào.
Trong tất cả các cách triển khai, bạn nên xác định chính xác nơi bạn sẽ giữ mật khẩu của tài khoản mà bạn truy cập vào hệ thống tệp. Có những lựa chọn khác nhau mà bạn có, tất cả đều có những ưu và nhược điểm tương ứng. Có thể sử dụng tính năng mạo danh để cho phép truy cập vào hệ thống tệp bằng tài khoản của người dùng cuối. Cách tốt nhất tùy thuộc vào tình huống mà bạn gặp phải trong môi trường của mình.