Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
MS SQL Server 2005
Есть два login-а и соответстующие им user-ы.
User1 - владелец БД 'adm_supir'.
----------------------------------------------
Следующая функция зарегистрирована в БД 'adm_supir' через подключение login1:
ALTER FUNCTION [dbo].[is_project_boss]
()
RETURNS integer
WITH EXECUTE AS CALLER -- !!!!!!!
AS
BEGIN
DECLARE @DBUserID integer
SELECT @DBUserID = DATABASE_PRINCIPAL_ID()
RETURN @DBUserID
END
-----------------------------------
User2 - имеет получил право выполнять функцию is_project_boss() БД1.
-----------------------------------
Подключаюсь login2 b lелаю запросы:
DECLARE @Var int
SET @Var = adm_supir.dbo.is_project_boss()
SELECT @Var
-- получаю 5
SELECT DATABASE_PRINCIPAL_ID()
-- получаю 9
------------------------------
Я ожидал получить одинаковые значения...
Кроме того, в документации не нашел что же точно возвращает DATABASE_PRINCIPAL_ID().
Это идентификатор user-а или login-а?
Пожалуйста, помогите разобраться.
4 авг 09, 09:41    [7493679]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
А на что вам этот принципал нужен? Есть куча функций получения пользователя, логина и т.п.

Сообщение было отредактировано: 4 авг 09, 11:35
4 авг 09, 11:35    [7494471]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Сергей Алексеевич,
на самом деле мне нужен ИД user-а для использования в надстройке (собственной разработки) системы ограничения прав пользователей. Начал я с USER_ID, но в документации оговорено, что функция устарела, в последующих версиях поддерживаться не будет. Работа USER_ID также вызывала множество вопросов. Попробовал применить рекомендованную DATABASE_PRINCIPAL_ID().

Есть CURRENT_USER. Ее попробую, но теория говорит, что работать надо с ИД. Получить его из имени можно только USER_ID(<user_name>). Опять USER_ID...
4 авг 09, 13:07    [7495264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
Glory
Member

Откуда:
Сообщений: 104760
АлексейА

Подключаюсь login2 b lелаю запросы:
DECLARE @Var int
SET @Var = adm_supir.dbo.is_project_boss()
SELECT @Var
-- получаю 5
SELECT DATABASE_PRINCIPAL_ID()
-- получаю 9
------------------------------
Я ожидал получить одинаковые значения...

select USER_NAME() что возвращает при этом ?
4 авг 09, 13:10    [7495292]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Для Glory.
Функция CURRENT_USER, подставленная вместо DATABASE_PRINCIPAL_ID()
в функцию и выполненная отдельным запросом непосредственно? возвращаtт одно и то же ожидаемое значение.
Но как уже писал мне бы нужен user_id ...
4 авг 09, 13:18    [7495338]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
АлексейА
Но как уже писал мне бы нужен user_id ...
У DATABASE_PRINCIPAL_ID() есть параметр.
4 авг 09, 13:20    [7495349]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
Glory
Member

Откуда:
Сообщений: 104760
АлексейА
Для Glory.
Функция CURRENT_USER, подставленная вместо DATABASE_PRINCIPAL_ID()
в функцию и выполненная отдельным запросом непосредственно? возвращаtт одно и то же ожидаемое значение.
Но как уже писал мне бы нужен user_id ...

Я не просил ничего никуда подставлять. Я просил выполнить в том же скрипте(не в функции !) еще select USER_NAME()
4 авг 09, 13:20    [7495350]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Для tpg.
Выдержка из документации на DATABASE_PRINCIPAL_ID:
----
Если аргумент principal_name не задан, возвращается идентификатор текущего пользователя. Необходимо поставить скобки.
----
Это то, что мне надо. Но почему ИД пользователя оказывается разным при вызове DATABASE_PRINCIPAL_ID непосредственно командой SELECT и из функции с опцией EXECUTE AS CURRENT?
4 авг 09, 13:58    [7495699]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Для Glory.
Glory
[quot АлексейА]
Я не просил ничего никуда подставлять. Я просил выполнить в том же скрипте(не в функции !) еще select USER_NAME()


USER_NAME вернет имя пользователя в соединении. И что? Чем это поможет? Пусть это имя будет "Иванов".
4 авг 09, 14:01    [7495720]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
Glory
Member

Откуда:
Сообщений: 104760
АлексейА
Для Glory.
Glory
[quot АлексейА]
Я не просил ничего никуда подставлять. Я просил выполнить в том же скрипте(не в функции !) еще select USER_NAME()


USER_NAME вернет имя пользователя в соединении. И что? Чем это поможет? Пусть это имя будет "Иванов".

Послушайте, вам тут вопросы задают не для того, чтобы скоратать свое время. Если вас затрудняет на них отвечать, то так и скажите.
4 авг 09, 14:04    [7495736]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Для Glory.
Поверьте, я благодарен всем отвечающим за потраченное для меня время и силы.
Я выполнил предложенный вами запрос. Точный ответ сообщить не могу ибо не имею право оглашать имена пользователей. Могу подтвердить, что это имя пользователя под которым я "подключался" к БД. Как и ожидалось. Вероятно я не понимаю хода ваших мыслей. Можно описать зачем потребовался запрос USER_NAME и какие выводы следуют из результата?
Спасибо.
4 авг 09, 14:41    [7495967]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
А вот что я обнаружил.

Запрос:
select * from sys.sysusers where name = 'Иванов',

выполненный через соединения под различными login-ами и user-ами дает запись с разными UID!!!
При этом SID записи представления sys.sysusers совпадает!
Теперь понятно поведение DATABASE_PRINCIPAL_ID.
Но тогда что такое UID и накой он нужен - совсем не понял.
Бред какой-то ....
4 авг 09, 15:15    [7496227]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Соображение ...
UID - идентификатор пользователя в "схеме" БД. У каждой "схемы" свой набор пользователей!
Проверил. У меня были одноименные пользователи Иванов в двух рассматриваемых "схемах". Только в adm_supir я его явно не создавал ...
Удалил я пользователя Иванов в adm_supir. Теперь Иванов другой БД "не видит" функции, зарегистрированной в adm_supir. И дать право GRANT EXECUTE on <функция> из схемы adm_supir от имени пользователя dbo не получается! Не виден пользователь Иванов другой схемы ...

"Покувыркался" и понял, одноименный пользователь Иванов в adm_supir создается при модификации login-а в закладке "User Mapping". Я пытаюсь таким образом дать подключенному через login права на чтение данных из adm_supir. Сделал еще раз. Снова создался пользователь Иванов в adm_supir. Имеет права на чтение схемы.

После этого GRANT EXECUTE on <функция> нормально выполняется. Но, теперь то понятно, что право EXECUTE функции в adm_supir получает пользователь Иванов в "схеме" adm_supir. Пользователь Иванов в другой схеме ничего не получает!
При подключении с login Иванов я подключаюсь сразу к двум пользователям двух схем!
При выполнении SELECT DATABASE_PRINCIPAL_ID в функции из схемы adm_supir я получаю в ней ИД Иванова в схеме adm_supir.
При выполнении SELECT DATABASE_PRINCIPAL_ID непосредственно - получаю ИД Иванова в схеме второй БД (не adm_supir).
При выполнении CURRENT_USER возвращаемые имена в функции и запросе SELECT CURRENT_USER будут одинаковые, но это лишь СОВПАДЕНИЕ имен !!!!
Ух .....
Ну и накой .... эта .... нужна.
Получается, фактически делегирования прав в SQL Server нет. Есть учетные записи в указанных при создании login-а схемах с конкретными правами в схемах. Права в каждой схеме могут быть расширены командами grant на объекты схемы от имени других учетных записей той же схемы.
Запутанно сделано, запутанно описал ...
Пожалуйста, подтвердите или опровергните ....
4 авг 09, 17:16    [7497172]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
Glory
Member

Откуда:
Сообщений: 104760
BOL - sys.sysusers

uid, smallint - User ID, unique in this database


После этого GRANT EXECUTE on <функция> нормально выполняется. Но, теперь то понятно, что право EXECUTE функции в adm_supir получает пользователь Иванов в "схеме" adm_supir. Пользователь Иванов в другой схеме ничего не получает!
При подключении с login Иванов я подключаюсь сразу к двум пользователям двух схем!
При выполнении SELECT DATABASE_PRINCIPAL_ID в функции из схемы adm_supir я получаю в ней ИД Иванова в схеме adm_supir.
При выполнении SELECT DATABASE_PRINCIPAL_ID непосредственно - получаю ИД Иванова в схеме второй БД (не adm_supir).
При выполнении CURRENT_USER возвращаемые имена в функции и запросе SELECT CURRENT_USER будут одинаковые, но это лишь СОВПАДЕНИЕ имен !!!!
Ух .....
Ну и накой .... эта .... нужна.
Получается, фактически делегирования прав в SQL Server нет. Есть учетные записи в указанных при создании login-а схемах с конкретными правами в схемах. Права в каждой схеме могут быть расширены командами grant на объекты схемы от имени других учетных записей той же схемы.


Вы почему то путаете схемы и базы.
База уже содержит схемы, но вы зачем то хотите использовать в контексте одной базы объекты другой базы.
Но все пользовательские процедуры и функции всегда работают в контексте той базы, где они созданы. И соответственно все системные функции в них тоже работают в контексте той базы, где создана процедура/функция
4 авг 09, 17:32    [7497303]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
Спасибо Glory.
Свою ошибку понял.
5 авг 09, 12:05    [7499620]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять работу DATABASE_PRINCIPAL_ID()  [new]
АлексейА
Member

Откуда:
Сообщений: 17
АлексейА
Спасибо Glory.
Свою ошибку понял.

Написал как-то неоднозначно.
Естественно я писал про свою ошибку :)
5 авг 09, 14:35    [7500849]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить