【问题标题】:Creating SQL users and restricting their permissions创建 SQL 用户并限制他们的权限
【发布时间】:2010-12-14 16:04:06
【问题描述】:

您好,

我的程序使用 ADO.NET API 创建了一个 SQL 数据库,以连接到 SQL 服务器并操作 SQL 连接/事务。创建数据库后,我使用“sa”凭据连接到服务器。这将是我唯一一次使用“sa”凭据连接到数据库。在同一初始连接期间,我需要创建几个登录名和用户,以便从那里使用这些用户的凭据。现在,我知道如何创建登录名和用户,但我似乎无法获得访问权限的限制。具体来说,我需要创建 1 个数据库登录名和用户,该用户将有权访问为数据库创建的所有存储过程 - 有点像 db 管理员,但非常受限(仅限于存储过程)。第二个数据库登录/用户将只能访问几个特定的​​存储过程。任何指针?谢谢!

【问题讨论】:

  • 编辑了我的帖子以添加更多详细信息。如果我写的不清楚,请随时询问:)

标签: sql sql-server tsql ado.net


【解决方案1】:

我会创建一个数据库角色,然后将用户添加到其中。对于第二个用户,我已经包含在角色中,然后拒绝了 2 个存储过程的权限。如果您拒绝对许多 sproc 的权限并且只向少数 sproc 授予权限,那么对于您要授予的每个对象,不将第二个用户包括在角色中并单独授予权限可能会更好/更容易。这取决于您以及哪种方式最适合您的情况。


--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

【讨论】:

  • 谢谢,布赖恩。我在玩这两种解决方案,这个似乎更优雅。我会测试它并返回结果
【解决方案2】:

您可以在此处找到一个存储过程,该存储过程授予用户对所有存储过程的访问权限:

MS SQL Tips

您所要做的就是与需要有权执行所有存储过程作为参数的用户一起调用它。

从这个脚本中你可以看到用于允许访问存储过程的 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 用户调用此过程;)

【讨论】:

  • 感谢您的提示。我需要能够以这种方式对数据库中的所有存储过程执行 GRANT EXEC。
  • @kateroh :这就是链接中给出的存储过程的作用:) 但我不想粘贴它,因为它很长。好的,我编辑我的帖子以粘贴它。我拿的是SQL Server 2005版本,​​如果不好请去链接。
  • @LaGandMere:感谢您的回答。每次添加新的存储过程时,都必须为所有用户重新运行此代码,这不是很好。具有仅授予“执行”权限的 db 角色的解决方案是否更优雅(由下面的 brian 提出)?他的方法有什么缺点吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多