Форум: "Прочее";
Текущий архив: 2010.12.19;
Скачать: [xml.tar.bz2];
ВнизКак узнать логин, под которым клиент вошел в MS SQL? Найти похожие ветки
← →
И. Павел © (2010-09-09 13:40) [0]Здравствуйте.
Я хочу реализовать такой механизм: клиент (программа Delphi или кто-то еще) не имеет доступа к некоторым таблицам SQL SERVER. Но он вызывает хранимую процедуру, которая, учитывая его логин (а он у него совпадает с учетной записью Windows), выдает ему те записи из таблиц, которые предназначены именно ему. Но если использовать внутри хранимой процедуры:SELECT @uname = user;
То, если пользователь не владелец этой функции, @uname = "dbo". Видимо, это возникает из за того, что хранимая процедура запускается не под моим пользователем, а под dbo.
Подскажите, пожалуйста, как в хранимой процедуре получить именно имя пользователя, который ее вызвал? Или обходной вариант: например, запустить процедуру откуда-то, передав ей имя пользователя в качестве аргумента (но только не из Delphi :), т.к. должна обеспечиваться защита, чтобы пользователь мог получить только свои строки из таблиц).
Заранее спасибо.
← →
Ega23 © (2010-09-09 13:48) [1]GRANT?
← →
Медвежонок Пятачок © (2010-09-09 13:50) [2]SUSER_NAME()
← →
И. Павел © (2010-09-09 14:06) [3]> [2] Медвежонок Пятачок © (09.09.10 13:50)
Большое спасибо.
> GRANT?
Тут я не разобрался. Права поменять можно, но сложность как раз заключалась в том, что я не знал, какой пользователь запустил процедуру.
← →
Anatoly Podgoretsky © (2010-09-09 14:15) [4]> Ega23 (09.09.2010 13:48:01) [1]
SUSER_SNAME()?
SUSER_NAME()?
Посмотри по справке, а то там есть их несколько
← →
И. Павел © (2010-09-09 15:16) [5]> Посмотри по справке, а то там есть их несколько
SUSER_SNAME() - эта функция возвращает логин по security identification number (SID).
SUSER_NAME() - а эта функция возвращает логин по login identification number
Но про SUSER_NAME написано:
"SUSER_NAME returns a login name only for a login that has an entry in the syslogins system table."
так что наверное лучше ее не использовать, т.к. в справке написано, что syslogins устарела и пока что заменена на view, и лучше ее не использовать в новых разработках.
А в справке по SUSER_SNAME() я запутался в контекстах :)
When called without an argument, SUSER_SNAME returns the name of the current security context. When called without an argument within a batch that has switched context by using EXECUTE AS, SUSER_SNAME returns the name of the impersonated context. When called from an impersonated context, ORIGINAL_LOGIN returns the name of the original context.
Поэтому я решил использовать ORIGINAL_LOGIN().
Подскажите, пожалуйста, это правильно. Я не наткнусь с ней на подвождные камни?
← →
sniknik © (2010-09-09 15:47) [6]ORIGINAL_LOGIN() в 2000м нету. если не критично...
← →
И. Павел © (2010-09-09 15:51) [7]> ORIGINAL_LOGIN() в 2000м нету
Спасибо за сведения. Но это не критично. У нас стоит 2005 и дальше будем ставить только более новые.
Наверное, буду тогда использовать ORIGINAL_LOGIN.
← →
Anatoly Podgoretsky © (2010-09-09 16:05) [8]
> SUSER_SNAME() - эта функция возвращает логин по security
> identification number (SID).
> SUSER_NAME() - а эта функция возвращает логин по login identification
> number
Попробуй не указывать SID, строго как у меня написано, без самодеятельности.
← →
Anatoly Podgoretsky © (2010-09-09 16:06) [9]Можешь написать так
SELECT SUSER_SNAME()
← →
Anatoly Podgoretsky © (2010-09-09 16:10) [10]Замечания
Эта функция может быть полезной для аудита идентификатора исходного контекста подключения. Так как остальные функции, такие как SESSION_USER и CURRENT_USER, возвращают текущий исполняющий контекст, ORIGINAL_LOGIN возвращает идентификатор имени входа, первым подключившегося к экземпляру SQL Server в данном сеансе.
Примеры
Следующий пример переключает исполняющий контекст текущего сеанса от того, кто вызвал данные инструкции, на login1. Функции SUSER_SNAME и ORIGINAL_LOGIN используются для возврата пользователя текущего сеанса (пользователя, на которого переключается контекст) и исходной учетной записи имени входа.
Если у тебя переключается контекст, то лучше CURRENT_USER
← →
И. Павел © (2010-09-09 16:11) [11]> Попробуй не указывать SID, строго как у меня написано, без
> самодеятельности.
Если не указывать, то у меня одно и то же возвращают: логин текущего пользователя.
← →
Anatoly Podgoretsky © (2010-09-09 16:12) [12]> И. Павел (09.09.2010 15:51:07) [7]
Используй SUSER_SNAME это переносимо и является алиасом по сути.
← →
Anatoly Podgoretsky © (2010-09-09 16:16) [13]> И. Павел (09.09.2010 16:11:11) [11]
Ты эе это и просил, если не учитывать переключение контекста.
← →
И. Павел © (2010-09-09 16:26) [14]> Используй SUSER_SNAME это переносимо и является алиасом
> по сути.
Спасибо. Тогда буду использовать его.
PS: тем более, что для того, чтобы сменить SUSER_SNAME, пользователю, наверное, все равно нужно знать пароль к новому логину. А если он его знает, то и ORIGINAL_LOGIN не спасет.
← →
Медвежонок Пятачок © (2010-09-09 16:32) [15]Использование EXECUTE AS CALLER в качестве изолированной инструкции
EXECUTE AS CALLER можно выполнять в модуле в качестве изолированной инструкции для переключения контекста выполнения на пользователя, вызывающего модуль.
Рассмотрим следующую хранимую процедуру под названием SqlUser2.
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS "SqlUser1"
AS
SELECT user_name(); -- Shows execution context is set to SqlUser1.
EXECUTE AS CALLER;
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.
REVERT;
SELECT user_name(); -- Shows execution context is set to SqlUser1.
GO
http://msdn.microsoft.com/ru-ru/library/ms188354.aspx
← →
И. Павел © (2010-09-09 16:37) [16]> Медвежонок Пятачок ©
Спасибо. Тоже интересный вариант.
← →
Anatoly Podgoretsky © (2010-09-09 16:40) [17]> И. Павел (09.09.2010 16:26:14) [14]
ORIGINAL_LOGIN не спасет у него другое назначение показать логин с которым
пользователь начал сессию, для контекста в этом случае нужно использовать
CURRENT_USER
В MSSQL большой набор функций и их вариантов.
← →
И. Павел © (2010-09-09 16:45) [18]> [17] Anatoly Podgoretsky ©
Ясно, спасибо.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.12.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c