Проверьте, что пользователь принадлежит роли db - PullRequest
1 голос
/ 25 февраля 2010

Я взял некоторый код здесь: Проверить, состоит ли роль конкретного пользователя в БД?

SELECT *
          FROM sys.database_role_members AS RM 
          JOIN sys.database_principals AS U 
            ON RM.member_principal_id = U.principal_id 
          JOIN sys.database_principals AS R 
            ON RM.role_principal_id = R.principal_id 
          WHERE U.name = 'operator1' 
            AND R.name = 'myrole1'

этот запрос возвращает 1 строку. Это означает, что пользователь operator1 принадлежит роли myrole1. Сейчас я пытаюсь создать хранимую процедуру для этого:

CREATE PROCEDURE [dbo].[Proc1]
(
    @userName varchar,
    @roleName varchar
)
AS

IF EXISTS(SELECT * 
          FROM sys.database_role_members AS RM 
          JOIN sys.database_principals AS U 
            ON RM.member_principal_id = U.principal_id 
          JOIN sys.database_principals AS R 
            ON RM.role_principal_id = R.principal_id 
          WHERE U.name = @userName 
            AND R.name = @roleName)
            RETURN 0
ELSE RETURN -1

Я использую стандартную команду из sql server 2008 «Выполнить хранимую процедуру»

DECLARE @return_value int

EXEC    @return_value = [dbo].[Proc1]
        @userName = N'operator1',
        @roleName = N'myrole1'

SELECT  'Return Value' = @return_value

GO

всегда возвращает -1. ПОЧЕМУ ???

Ответы [ 2 ]

2 голосов
/ 06 марта 2010

Вам необходимо определить атрибут длины для каждого из параметров вашей процедуры. Если вы измените начало объявления вашей хранимой процедуры на следующее, он вернет правильный ответ:

CREATE PROCEDURE [dbo].[Proc1]
(
    @userName varchar(255),
    @roleName varchar(255)
)
AS

Без атрибутов длины SQL Server автоматически определяет длину переменных как 1, поэтому пользователь и роль сопоставлялись с «o» и «m» соответственно. SQL Server непоследователен в том, как он обрабатывает переменные без спецификатора длины - иногда они имеют длину 30, а иногда - 1. Рекомендуется всегда указывать атрибуты длины для строковых переменных. Дополнительную информацию смотрите в следующей статье блога SQL:

0 голосов
/ 29 августа 2014

Этот код не подходит, потому что он может возвращать false, если пользователь является членом группы, которая затем является членом роли.

Пользовательская встроенная функция IS_MEMBER () - это намного проще и всегда актуально.

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