Closed. This question does not meet
Stack Overflow guidelines。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为
on-topic用于堆栈溢出。
7年前关闭。
Improve this question
无论我如何尝试,我都会收到此错误。
我有一个存储的proc,execute为:
CREATE PROCEDURE usp_myproc
WITH EXECUTE AS 'myuser'
在此标准内我有
EXEC('INSERT INTO ' + @tablename + '
SELECT col1, col2, col3
FROM OPENROWSET(
BULK '''+ @filepath +''',
FORMATFILE='''+ @formatfile +''',
FIRSTROW=2
)as t'
)
myuser
确实具有bulkadmin角色,读/写,创建表,插入,选择,执行,更改权限。其中一些可能不是必需的,但这是我到目前为止已经尝试过的方法。我想念什么?
谢谢你。
正如我在评论中所说,使用模拟时,服务器级别的权限会被剥夺。
有两种解决方法:
糟糕而快速的方法:
将您的数据库设置为“开”。它将完成工作。但是,如果您不完全了解它的功能,那么我的建议是不要这样做。
但是,这是代码:
ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;
好的但较慢的方式
这更加精确,并且没有任何讨厌的安全副作用。
您要做的是使用证书对存储过程进行签名。您可以在数据库中使用该证书创建用户。您向该用户授予对数据库中表的适当权限。您还可以从同一证书创建“登录名”,然后授予该登录名大量权限。
因为您使用该证书对存储的proc进行签名,所以每次执行sp时,都会在该用户的上下文中执行该sp,并登录从该证书创建的位置。
步骤是:
在主中创建证书
从该证书创建一个登录名
向该登录名授予大容量管理员权限
现在,您需要在用户数据库中使用完全相同的证书,因此我们需要执行一些额外的步骤
将证书导出到磁盘
将证书导入用户数据库
现在我们可以完成
从证书创建用户
向该用户授予表权限
从存储过程中删除execute as子句
使用证书签署存储过程
这是代码:
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
最后说明:
请用您确定sql服务帐户具有写权限的路径替换您的目录!
完成设置后,请确保删除那些导出的证书。
我是一名优秀的程序员,十分优秀!