Như tôi đã nói trong nhận xét, quyền cấp máy chủ bị tước bỏ ngay khi bạn sử dụng tính năng mạo danh.
Có 2 cách để giải quyết vấn đề này:
Cách xấu và nhanh chóng:
Đặt cơ sở dữ liệu của bạn đáng tin cậy thành BẬT. Nó sẽ hoàn thành công việc. Nhưng nếu bạn không hoàn toàn hiểu điều này có tác dụng gì, thì lời khuyên của tôi là KHÔNG nên làm điều này.
tuy nhiên, đây là mã:
ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;
Cách tốt nhưng chậm hơn
Điều này chính xác hơn nhiều và không có bất kỳ tác dụng phụ bảo mật khó chịu nào.
Những gì bạn làm là bạn ký thủ tục đã lưu trữ của mình với một chứng chỉ. Bạn tạo người dùng từ chứng chỉ đó trong databasse. Bạn cấp cho người dùng đó các quyền thích hợp trên bảng của bạn trong cơ sở dữ liệu. Bạn cũng tạo Đăng nhập từ cùng một chứng chỉ và cấp cho đăng nhập đó các quyền hàng loạt.
Bởi vì bạn ký proc được lưu trữ bằng chứng chỉ đó, mỗi khi sp được thực thi, nó sẽ được thực thi trong ngữ cảnh của người dùng đó và đăng nhập được tạo từ chứng chỉ đó.
các bước là:
-
Tạo chứng chỉ ở chế độ chính
-
tạo thông tin đăng nhập từ chứng chỉ đó
-
Cấp quyền quản trị hàng loạt cho thông tin đăng nhập đó
Bây giờ bạn cần chính xác cùng một chứng chỉ trong cơ sở dữ liệu người dùng của mình, vì vậy chúng tôi có một số bước bổ sung để thực hiện
-
Xuất chứng chỉ ra đĩa
-
Nhập chứng chỉ vào cơ sở dữ liệu người dùng của bạn
bây giờ chúng ta có thể hoàn thiện
- tạo người dùng từ chứng chỉ
- cấp quyền trên bàn cho người dùng đó
- xóa mệnh đề thực thi dưới dạng khỏi quy trình đã lưu trữ của bạn
- Ký vào quy trình đã lưu trữ của bạn bằng chứng chỉ của bạn
đây là mã:
USE master
go
CREATE CERTIFICATE BulkInsertCert
ENCRYPTION BY PASSWORD = 'NicePassword!0'
WITH SUBJECT = 'Gives Bulk Insert Privilegde'
go
CREATE LOGIN BulkInsert_CertLogin FROM CERTIFICATE BulkInsertCert
go
GRANT ADMINISTER BULK OPERATIONS TO BulkInsert_CertLogin
go
BACKUP CERTIFICATE BulkInsertCert TO FILE = '[your directory]\BulkInsertCert.cer'
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk' ,
ENCRYPTION BY PASSWORD = 'EvenNicerPassword!0',
DECRYPTION BY PASSWORD = 'NicePassword!0')
go
USE [YourDatabase]
CREATE CERTIFICATE BulkInsertCert FROM FILE = '[your directory]\BulkInsertCert.cer'
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk',
DECRYPTION BY PASSWORD = 'EvenNicerPassword!0',
ENCRYPTION BY PASSWORD = 'TheVeryBestPasswordThereIs!0')
go
--NOW DELETE THE CERTIFICATES FROM DISK
CREATE USER BulkInsert_CertUser FOR CERTIFICATE BulkInsertCert
go
GRANT ALTER, INSERT ON [YourTable] TO BulkInsert_CertUser
go
ALTER PROCEDURE usp_myproc
AS
EXEC('INSERT INTO ' + @tablename + '
SELECT col1, col2, col3
FROM OPENROWSET(
BULK '''+ @filepath +''',
FORMATFILE='''+ @formatfile +''',
FIRSTROW=2
)as t'
)
-- Sign the test procedure each time you have changed it.
ADD SIGNATURE TO usp_myproc BY CERTIFICATE BulkInsertCert
WITH PASSWORD = 'TheVeryBestPasswordThereIs!0'
go
Lưu ý cuối cùng:
Vui lòng thay thế thư mục của Bạn bằng một đường dẫn mà bạn chắc chắn rằng tài khoản dịch vụ sql có quyền ghi!
Đảm bảo bạn xóa các chứng chỉ đã xuất đó sau khi thiết lập xong ..