Создание пользователей SQL и ограничение их прав - PullRequest
1 голос
/ 14 декабря 2010

Greetings,

Моя программа создает базу данных SQL, используя API-интерфейсы ADO.NET для подключения к серверу SQL и манипулирования соединениями / транзакциями SQL.Когда база данных создана, я подключаюсь к серверу, используя учетные данные 'sa'.Это будет единственный раз, когда я подключусь к базе данных, используя учетные данные 'sa'.Во время этого же первоначального соединения мне нужно создать пару логинов и пользователей, чтобы оттуда использовались учетные данные этих пользователей.Теперь я знаю, как я могу создавать логины и пользователей, но я не могу получить ограничения прав доступа.В частности, мне нужно создать учетную запись 1 дБ и пользователя, который будет иметь доступ ко всем хранимым процедурам, созданным для базы данных - вроде администратора базы данных, но очень ограниченным (только для сохраненных процедур).И второй логин / пользователь БД получит доступ только к нескольким конкретным сохраненным процессам.Есть указатели?Спасибо!

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Я бы создал роль базы данных, а затем добавил к ней пользователей.Для второго пользователя я включил в роль, а затем отказал в разрешении 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
1 голос
/ 14 декабря 2010

Здесь вы можете найти хранимую процедуру, которая предоставляет пользователю доступ ко всем хранимым процедурам:

Советы по MS SQL

Все, что вам нужно сделать, это вызвать его у пользователя, которому необходимы права на выполнение всех хранимых процедур в качестве параметра.

Из этого скрипта вы можете увидеть 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;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...