Ваш код совершенно неверный.
Почему вы думаете, что 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
.