Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.19;
Скачать: CL | DM;

Вниз

Как узнать логин, под которым клиент вошел в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
2-1285250535
GanibalLector
2010-09-23 18:02
2010.12.19
Хэндл TLabel


4-1242902538
M_Corvinus
2009-05-21 14:42
2010.12.19
работа с com-портом


15-1284205341
Servy
2010-09-11 15:42
2010.12.19
Базы данных и обеспечение уникальности


2-1285574236
PRIVET123
2010-09-27 11:57
2010.12.19
Переставить элементы


15-1283925708
sniknik
2010-09-08 10:01
2010.12.19
Что за проблема с кнопками?