正如我在评论中所说,使用模拟时,服务器级别的权限会被剥夺。
有两种解决方法:
坏而又快的方法:
将您的数据库设置为“开”。它将完成工作。但是,如果您不完全了解它的功能,那么我的建议是不要这样做。
但是,这是代码:
ALTER DATAbase [YourDatabase] SET TRUSTWORTHY ON;
好的但较慢的方法
这更加精确,并且没有任何讨厌的安全副作用。
您要做的是使用证书对存储过程进行签名。您可以在数据库中使用该证书创建用户。您向该用户授予对数据库中表的适当权限。您还可以从同一证书创建“登录名”,然后授予该登录名大量权限。
因为您使用该证书对存储的proc进行签名,所以每次执行sp时,都会在该用户的上下文中执行该sp,并登录从该证书创建的位置。
步骤是:
在母版中创建证书
从该证书创建登录名
向该登录名授予批量管理员权限
现在,您需要在用户数据库中使用完全相同的证书,因此我们需要执行一些额外的步骤
将证书导出到磁盘
将证书导入您的用户数据库
现在我们可以完成
- 从证书创建用户
- 向该用户授予表权限
- 从存储过程中删除execute as子句
- 使用证书签署存储过程
这是代码:
USE mastergoCREATE CERTIFICATE BulkInsertCert ENCRYPTION BY PASSWORD = 'NicePassword!0' WITH SUBJECT = 'Gives Bulk Insert Privilegde'goCREATE LOGIN BulkInsert_CertLogin FROM CERTIFICATE BulkInsertCertgoGRANT ADMINISTER BULK OPERATIONS TO BulkInsert_CertLogingoBACKUP 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')goUSE [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 DISKCREATE USER BulkInsert_CertUser FOR CERTIFICATE BulkInsertCertgoGRANT ALTER, INSERT ON [YourTable] TO BulkInsert_CertUsergoALTER PROCEDURE usp_myprocASEXEC('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
最后说明:
请用您确定sql服务帐户具有写权限的路径替换您的目录!
完成设置后,请确保删除那些导出的证书。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)