Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.005 c
15-1284292953
sniknik
2010-09-12 16:02
2010.12.19
Отключается копирование в буфер...


6-1231363825
Tinky
2009-01-08 00:30
2010.12.19
Сниффер loopback


2-1279935355
Тыва прогер
2010-07-24 05:35
2010.12.19
Вопрос по ошибке "Окно не имеет полос прокрутки"


2-1285157997
Den
2010-09-22 16:19
2010.12.19
Подскажите как построить запрос


3-1248935913
Maska
2009-07-30 10:38
2010.12.19
declare variable





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский