如何在不提升用户权限的情况下,使普通用户执行sp_OACreate存储过程
2008-11-08 16:50:34 来源:WEB开发网补充说明
多数情况下,数据库的所有者是sa一类的sysadmin固定服务器角色的成员,所以在这种情况下,也可以直接指定使用数据库所有者作为存储过程执行的安全上下文。
USE tempdb;
GO
-- 2.b 测试存储过程
CREATE PROC dbo.p
WITH EXECUTE AS N'dbo' -- 指定存储过程的执行时的上下文
AS
DECLARE @object int;
DECLARE @hr int;
DECLARE @src varchar(255), @desc varchar(255);
EXEC @hr = sp_OACreate 'ADODB.RecordSet', @object OUT;
IF @hr <> 0
GOTO lb_Err;
EXEC @hr = sp_OAMethod @object, 'Open', NULL, 'SELECT ServerName = @@SERVERNAME', N'Provider=SQLOLEDB.1;Integrated Security=SSPI';
IF @hr <> 0
GOTO lb_Err;
EXEC @hr = sp_OAMethod @object, 'GetRows';
IF @hr <> 0
GOTO lb_Err;
EXEC @hr = sp_OADestroy @object;
RETURN;
lb_Err:
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT ;
RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc);
END;
GO
-- 3. 调用存储过程的普通登录
USE master;
GO
-- 3.a 登录
CREATE LOGIN test
WITH PASSWORD = N'abc.123',
CHECK_POLICY = OFF;
GO
-- 3.b 数据库用户
USE tempdb;
GO
CREATE USER test
FOR LOGIN test;
GO
-- 3.c 执行存储过程的权限
GRANT EXECUTE ON dbo.p
TO test;
GO
-- 3.d 执行测试
EXECUTE AS LOGIN = N'test';
GO
EXEC dbo.p;
GO
REVERT;
GO
-- 4. 删除测试
DROP PROC dbo.p;
DROP USER test;
USE master;
DROP LOGIN test;
最后说明一点,要使用sp_OACreate这一系列存储过程,得将服务器的“Ole Automation Procedures”选项打开,参考如下的代码。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE;
更多精彩
赞助商链接