问候,
我的程序使用ADO.NET API创建一个SQL数据库,以连接到SQL服务器并操纵SQL连接/事务。创建数据库时,我使用“sa”凭据连接到服务器。这将是我唯一一次使用“sa”凭据连接到数据库。在这个相同的初始连接期间,我需要创建几个登录和用户,以便从那里使用这些用户的凭据。现在,我知道如何创建登录和用户,但我似乎无法获得正确的访问限制。具体来说,我需要创建1 db登录和用户,该用户可以访问为数据库创建的所有存储过程 - 有点像数据库管理员,但非常有限(仅限存储过程)。并且第二个db登录/用户只能访问几个特定的存储过程。有什么指针吗?谢谢!
答案 0 :(得分:1)
在这里,您可以找到一个存储过程,授予用户访问所有存储过程的权限:
您所要做的就是与需要有权执行所有存储过程作为参数的用户一起调用它。
在此脚本中,您可以看到用于允许访问存储过程的GRANT是:
GRANT EXEC ON ' + '[' + @OwnerName + ']' + '.' + '[' + @ObjectName + ']' + ' TO ' + @user
编辑:粘贴链接中的存储过程
CREATE PROCEDURE spGrantExectoAllStoredProcs @user sysname
AS
/*----------------------------------------------------------------------------
-- Object Name: spGrantExectoAllStoredProcs
-- Author: Edgewood Solutions
-- Development Date: 03.19.2007
-- Called By: TBD
-- Description: Issue GRANT EXEC statement for all stored procedures
-- based on the user name that is passed in to this stored procedure
-- Project: SQL Server Security
-- Database: User defined databases
-- Business Process: SQL Server Security
--
----------------------------------------------------------------------------
-- Num | CRF ID | Date Modified | Developer | Description
----------------------------------------------------------------------------
-- 001 | N\A | 03.15.2007 | Edgewood | Original code for the GRANT
-- EXEC process
--
--
*/
SET NOCOUNT ON
-- 1 - Variable declarations
DECLARE @CMD1 varchar(8000)
DECLARE @MAXOID int
DECLARE @OwnerName varchar(128)
DECLARE @ObjectName varchar(128)
-- 2 - Create temporary table
CREATE TABLE #StoredProcedures
(OID int IDENTITY (1,1),
StoredProcOwner varchar(128) NOT NULL,
StoredProcName varchar(128) NOT NULL)
-- 3 - Populate temporary table
INSERT INTO #StoredProcedures (StoredProcOwner, StoredProcName)
SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME NOT LIKE 'dt_%'
AND ROUTINE_TYPE = 'PROCEDURE'
-- 4 - Capture the @MAXOID value
SELECT @MAXOID = MAX(OID) FROM #StoredProcedures
-- 5 - WHILE loop
WHILE @MAXOID > 0
BEGIN
-- 6 - Initialize the variables
SELECT @OwnerName = StoredProcOwner,
@ObjectName = StoredProcName
FROM #StoredProcedures
WHERE OID = @MAXOID
-- 7 - Build the string
SELECT @CMD1 = 'GRANT EXEC ON ' + '[' + @OwnerName + ']' + '.' + '[' + @ObjectName + ']' + ' TO ' + @user
-- 8 - Execute the string
-- SELECT @CMD1
EXEC(@CMD1)
-- 9 - Decrement @MAXOID
SET @MAXOID = @MAXOID - 1
END
-- 10 - Drop the temporary table
DROP TABLE #StoredProcedures
SET NOCOUNT OFF
GO
在这里。
您只需要与您的sa用户调用此过程;)
答案 1 :(得分:1)
我会创建一个数据库角色,然后将用户添加到它。对于第二个用户,我已经包含在角色中,然后拒绝了2个sprocs的权限。如果您拒绝许多sprocs的权限并且只授予对一些sprocs的权限,那么对于您要授予的每个对象,可能更好/更容易不在角色中包含第二个用户并单独授予权限。这取决于你,哪种方式最适合你的情况。
--Replace db with your database name
USE db
--Create a database role
CREATE ROLE db_execonly
--Grant EXEC permissions to the role
GRANT EXECUTE TO db_execonly
--Add users to the new role
EXEC sp_addrolemember 'db_execonly', 'user1'
EXEC sp_addrolemember 'db_execonly', 'user2'
--Deny permissions to specific objects for user2
DENY EXEC ON OBJECT::dbo.usp_sproc1 TO user2
DENY EXEC ON OBJECT::dbo.usp_sproc2 TO user2