T-SQL для получения информации о роли входа в SQL Server 2012 - PullRequest
0 голосов
/ 14 марта 2019

Я новичок в SQL Server. Я создаю базу данных и добавил 3 роли в роли базы данных:

  • ШКОЛА: datareader
  • БРЕНД: владелец данных
  • УЧИТЕЛЬ: читатель данных, datawriter

Затем я создал хранимую процедуру, которая добавит учетную запись для доступа к SQL Server:

ALTER PROC [dbo].[sp_CreateLogin]
    @LGNAME VARCHAR(50),
    @PASS VARCHAR(50),
    @USERNAME VARCHAR(50),
    @ROLE VARCHAR(50)
AS
BEGIN
    DECLARE @RET INT

    EXEC @RET = SP_ADDLOGIN @LGNAME, @PASS,'mydatabase'                     

    IF (@RET =1)  -- LOGIN NAME EXIST
        RETURN 1

    EXEC @RET = SP_GRANTDBACCESS @LGNAME, @USERNAME

    IF (@RET =1)  -- USER  NAME EXIST
    BEGIN
        EXEC SP_DROPLOGIN @LGNAME
        RETURN 2
    END

    EXEC sp_addrolemember @ROLE, @USERNAME

    IF @ROLE = 'SCHOOL'
    BEGIN
        EXEC sp_addsrvrolemember @LGNAME, 'sysadmin'
        EXEC sp_addsrvrolemember @LGNAME, 'SecurityAdmin'
        EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
    END

    IF @ROLE = 'BRAND'
    BEGIN 
        EXEC sp_addsrvrolemember @LGNAME, 'sysadmin'
        EXEC sp_addsrvrolemember @LGNAME, 'SecurityAdmin'
        EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
    END

    IF @ROLE= 'TEACHER'
    BEGIN  
        EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
    END
END

Теперь я хочу создать хранимую процедуру, чтобы проверить, существует ли уже LoginName (@LGNAME) в качестве учетной записи для входа. Если это существует, верните имя пользователя (@USERNAME) и роль (@ROLE).

Я могу проверить, существует ли LoginName, но я не знаю, как получить имя пользователя и роль.

1 Ответ

1 голос
/ 14 марта 2019

Ваш код совершенно неверный.

Почему вы думаете, что IF (@RET =1) -- LOGIN NAME EXIST?

Вы можете получить любую другую ошибку, например, вы указали пустой или слабый пароль и получили

Сообщение 15116, уровень 16, состояние 1, строка 16 Ошибка проверки пароля.Пароль не соответствует требованиям политики Windows, поскольку он слишком короткий.

Тогда вы не понимаете роли сервера, по крайней мере, роль sysadmin.Вы сказали

I create a database and added 3 role in my database roles:

SCHOOL: datareader
BRAND: dataowner
TEACHER: datareader, datawriter

А потом ваш код:

IF @ROLE = 'SCHOOL'
    BEGIN
        EXEC sp_addsrvrolemember @LGNAME, 'sysadmin'
        EXEC sp_addsrvrolemember @LGNAME, 'SecurityAdmin'
        EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
    END

Итак, вы хотели, чтобы члены SCHOOL были только db_datareader?Но вы дали им sysadmin роль сервера.Это означает, что не только нет необходимости добавлять их в качестве членов к SecurityAdmin и ProcessAdmin, нет необходимости делать их db_datareader, поскольку эти учетные записи уже имеют все возможные разрешения на сервере.

Я думаю, что вы должны начать с изучения SQL Server фиксированной server roles, по крайней мере, вы должны понимать, что sysadmin не только не нуждается в permission, но и нет способа deny чего-то до sysadmin,Таким образом, вы не должны давать sysadmin кому-либо, этот логин может отбросить вашу базу данных и исключить вас из sysadmin.

Я могу проверить, существует ли LoginName, но я не знаю, как получитьимя пользователя и роль

Чтобы найти соответствующего пользователя, вы можете использовать следующий код:

select name
from sys.database_principals
where suser_sname(sid) = 'your_login';

Чтобы проверить, проверяется ли его член роли IS_ROLEMEMBER ('your_role','your_user'), возвращает ли он 1 your_user является членом your_role.

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