2016-01-07 3 views
1

У меня есть ConnectionStringКак проверить MSDB для пользователей Права доступа/Роли

<add name="DBCon" connectionString="Data Source=10.197.10.10,46512\Games;Initial Catalog=Games;User Id=UserA;Password=;" providerName="SqlMembershipProvider" /> 

Перед использованием sp_send_dbmail и через запрос SQL, как проверить, если UserA имеет какие-либо разрешения или роли в базе данных MSDB?

+0

Чтобы уточнить, вы хотите узнать, разрешено ли 'UserA' выполнять' sp_send_dbmail'. Это вопрос? – DMason

+0

@ DMason, это правильно. – usefulBee

ответ

2

Важно понимать разницу между SQL Server login (объект уровня экземпляра) и базой данных user (объект уровня базы данных). В вашей строке подключения имя пользователя называется UserA, что может ввести в заблуждение. «Логины» не имеют разрешений в базе данных. Ну, а не напрямую. Это «пользователь», что логин сопоставляется с тем, что имеет разрешения. Хорошо, достаточно того, что ...

SQL Войти

Если ваше членство роли login имеет sysadmin, вы будете иметь свободу делать что-либо, в том числе отправка почты через sp_send_dbmail. Этот запрос будет сообщать вам, если Войти вы подключены, как есть, что членство (искать возвращаемого значения «1»):

SELECT IS_SRVROLEMEMBER('sysadmin', SUSER_NAME()) 

базы данных пользователя - Роль Членство

Однако, я подозреваю, вы хотите узнать, есть ли у вашего loginuser в msdb, и если да, то У этого пользователя есть разрешение на отправку почты через sp_send_dbmail. Выполнить этот запрос, чтобы увидеть, что пользователь в msdb (если таковые имеются), что ваш Логин сопоставляется и любые роли базы данных, к которым принадлежит пользователь:

SELECT l.name LoginName, u.name UserName, r.name RoleName 
FROM master.sys.server_principals l 
JOIN msdb.sys.database_principals u 
    ON u.sid = l.sid 
LEFT JOIN msdb.sys.database_role_members rm 
    ON rm.member_principal_id = u.principal_id 
LEFT JOIN msdb.sys.database_principals r 
    ON r.principal_id = rm.role_principal_id 
WHERE l.name = SUSER_NAME() 
AND r.name IN ('db_owner', 'DatabaseMailUser') 

Если пользователь является членом либо db_owner или DatabaseMailUser, он должен сможет выполнить sp_send_dbmail. (Если есть явное DENY EXECUTE ON sp_send_dbmail TO [yourDBuser], то пользователь не будет иметь эту привилегию.)

Если пользователь dbo, то он владеет msdb (не вероятно - системные базы данных, как правило, принадлежит sa логина), а также владелец базы данных, он может выполнять практически любую деятельность на db.

База данных пользователей - Индивидуальные гранты

Наконец, есть еще одна возможность, я могу думать: пользователь базы данных в MSDB не может быть в любой роли базы данных, но может явно была дана привилегия выполнить sp_send_dbmail следующим образом:

GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser] 

Это покажет вам, что разрешения были явно разрешены или запрещены для пользователя базы данных:

USE msdb 
GO 

SELECT * FROM fn_my_permissions(NULL, 'DATABASE'); 
GO 
+0

Возможно, я должен был бы вызвать User Id, UserIdA.Ваше превосходное объяснение задает вопрос, как найти «пользователя», с которым сопоставляется логин (в строке подключения), чтобы найти, какие разрешения у этого неявного пользователя могут быть или могут отсутствовать? Я обращаюсь к серверу sql с помощью проверки подлинности Windows, но приложение знает только строку подключения. – usefulBee

+1

@usefulBee, это тот запрос под заголовком ** User User - Role Membership **. Попробуйте прокомментировать последнюю строку ('AND r.name IN ...') и повторно запустите запрос. Если на ваш логин есть пользователь db, вы вернетесь хотя бы к одной строке. Если для входа в систему нет пользователя db, строки не будут возвращены. – DMason

+0

Да, однако, мне пришлось прокомментировать первое условие, чтобы получить какой-либо результат. Я видел несколько, а «са» - один из них, но не тот, который соответствует моим логинам. Ваше понимание очень ценится! – usefulBee

Смежные вопросы