Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Execute  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 372
TaPaK
хорошо я согласен,

вы хоть точно это всё делаете на DatawareHouse

перед запросом добавил
use DatawareHouse
go


это называется "datawarehouse", а на самом деле у меня небольшая БД, 50 пользователей. Всем права раздаю ровно одинаково.
21 ноя 17, 14:29    [20972274]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
ответ на мой вопрос где?
Yasha123
покажите, плиз:

execute as user = 'MyUser';

select *
from sys.user_token;

select *
from sys.fn_my_permissions('GetDateInfo', 'object');
21 ноя 17, 14:30    [20972279]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
хорошо я согласен
TaPaK
хорошо я согласен,
ну так а вообще кому что дано на объект

select user_name(grantee_principal_id),*
from sys.database_permissions
where object_name(major_id) = 'GetDateInfo' 

пусто.
select user_name(grantee_principal_id),*
from sys.database_permissions

выводит список пользователей и кучу строк с пользователем public.
Все пользователи упоминаются ровно по одному разу, в колонках class, major_id и minor_id у всех стоят нули.

а проблемный логин хоть в public?
21 ноя 17, 14:36    [20972317]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 372
Yasha123
покажите, плиз:

execute as user = 'MyUser';

select *
from sys.user_token;

select *
from sys.fn_my_permissions('GetDateInfo', 'object')


а вот здесь вообще ересь какая-то.
пробую ради эксперимента вместо MyUser вписывать любых рабочих пользователей, выдаёт ошибку
Cannot execute as the database principal because the principal "MyUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.

А вставляю вот этого, с которым мучаюсь, запросы выполняются без проблем.

Первый выдаёт 4 строки
principal_idsidnametypeusage
580x0105000000000005150000001E1F1BEC1E85CED3DFC2B69706350000MSK\MyTroubleUserWINDOWS LOGINGRANT OR DENY
00x010500000000000904000000F6698AD2F9669343A2A3197A54FF564ApublicROLEGRANT OR DENY
163900x01050000000000090400000000000000000000000000000006400000db_datareaderROLEGRANT OR DENY
163910x01050000000000090400000000000000000000000000000007400000db_datawriterROLEGRANT OR DENY

второй запрос пустой.
21 ноя 17, 14:37    [20972319]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
Andy_OLAP
Нужно подавать хороший пример коллегам и не порочить профессию перед случайными посетителями портала.

профессию порочит некто, увешанный рыбьими хвостами.
когда репро-то будет, "денаим селект на таблицу,
а получаем EXECUTE permission was denied на процедуру"

ну, изучивший все MSDN, репро где?
экий нехороший пример подает коронованный эксперт,
громогласно несет фигню на форуме, подтверждать же ее ничем не собирается
21 ноя 17, 14:39    [20972335]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
хорошо я согласен
пробую ради эксперимента вместо MyUser вписывать любых рабочих пользователей, выдаёт ошибку
Cannot execute as the database principal because the principal "MyUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.


у вас поди юзеры- виндовые группы,
группу имперсонэйтить нельзя
21 ноя 17, 14:42    [20972350]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 372
хех
запрос
Select name,principal_id from sys.database_principals 

выдал

name principal_id
public0
dbo1
guest2
INFORMATION_SCHEMA3
sys4
MSK\MyTroubleUser58
db_owner16384
db_accessadmin16385
db_securityadmin16386
db_ddladmin16387
db_backupoperator16389
db_datareader16390
db_datawriter16391
db_denydatareader16392
db_denydatawriter16393
21 ноя 17, 14:44    [20972357]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
хорошо я согласен
второй запрос пустой.

ну а раз второй запрос пуст, нет ни EXECUTE, ни DENY.
а значит, или вы не выдаете EXECUTE, или он "не выдается":
у вас поди DDL-триггер,
ловит и откатывает выдачу прав индивидуальным учеткам,
ибо политика партии выдавать только группам
21 ноя 17, 14:46    [20972365]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
хорошо я согласен
хех
запрос
Select name,principal_id from sys.database_principals 

выдал

name principal_id
public0
dbo1
guest2
INFORMATION_SCHEMA3
sys4
MSK\MyTroubleUser58
db_owner16384
db_accessadmin16385
db_securityadmin16386
db_ddladmin16387
db_backupoperator16389
db_datareader16390
db_datawriter16391
db_denydatareader16392
db_denydatawriter16393

ну так каких же еще вы юзеров имперсонэйтите,
если боле никто в базу не отмаплен?
ну или вы больше никого не видите, тоже вариант.
---
вы сами-то хоть овнер базы?
---
под вашей учеткой
select * from sys.fn_my_permissions(null, 'database');

сколько строк выдает?
21 ноя 17, 14:49    [20972380]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
аааааа, блин, все еще банальнее.
вы сперва имперсонэйтили вашего юзера MSK\MyTroubleUser, так?
сейчас сделайте
select user

и увидите MSK\MyTroubleUser.
это ж вы не сделали revert.
поэтому вы все еще MSK\MyTroubleUser,
и не можете остальных имперсонэйтить,
и в юзерах видите только этого MSK\MyTroubleUser
21 ноя 17, 14:57    [20972419]     Ответить | Цитировать Сообщить модератору
 Re: Execute  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 372
я вот чего не понял сейчас:
что это за особенный пользователь такой, что он при добавлении автоматом в principals добавляется?

Т.е.,захожу
  • в раздел security (глобальный, не в БД),
  • там папка logins,
  • правой клавишей - "New Login..."
    там жму Search, в открывшемся окне из виндовской группы выбираю этого пользователя.
    В usermapping указываю мою БД, чтобы пользователь создался и в ней, и отмечаю для него три галочки:
    db_datareader
    db_datawriter
    db_public

    Так вот: при выполнении этих действий ни один пользователь не добавлялся в таблицу principals, только этот добавился. Что с ним не так?
    Даже при повторном эксперименте: просто удалил двоих пользователь - проблемного и произвольного. Добавил обратно. В principals попал только этот пользователь, а для другого выдаёт ошибку "Cannot execute as...."

    К сообщению приложен файл. Размер - 32Kb
  • 21 ноя 17, 15:01    [20972445]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    хорошо я согласен
    Member

    Откуда:
    Сообщений: 372
    Yasha123
    вы сами-то хоть овнер базы?

    да
    21 ноя 17, 15:02    [20972449]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    хорошо я согласен
    Member

    Откуда:
    Сообщений: 372
    Yasha123
    select * from sys.fn_my_permissions(null, 'database');
    


    сколько строк выдает?

    62. Кучу всего.

    А для проблемного пользователя одну.
    А для остальных пользователей - "cannot execute as ...."
    21 ноя 17, 15:04    [20972459]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    вы можете вместо картинок писать текст запросов?
    и здесь показывать все в виде:
    запрос -- ошибка
    (и ошибку целиком, а не огрызыш)
    ---
    еще раз, когда пишут Cannot execute as...,
    это означает, или прав у вас нет (но сейчас-то вы сисадмин, в ГУИ не сильно имперсонэйтишься)
    или это логин-группа. группу имперсонэйтить нельзя.
    ---
    62 строки -- да, овнер.
    просто овнер базы видит **всех** юзеров,
    а вы что-то всего одного,
    были сомнения, уж не под ним ли вы все и выполняете
    21 ноя 17, 15:09    [20972479]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    хорошо я согласен
    А для проблемного пользователя одну.

    только CONNECT?
    ----
    у вас чего, в базе гость открыт?
    как вы объясняете, что в базе у вас всего 1 этот пользователь есть,
    а при этом "все все выполняют"?
    ---
    пойдите в мастер.
    сделайте там
     EXECUTE AS LOGIN = 'ANY_LOGIN_THAT_EXECUTES_EVERYTHING'
    

    впишите туда любого юзера, который в базе DatawareHouse "все выполняет".
    сделайте
    USE  DatawareHouse;
    SELECT USER;
    

    что там у нас, гость?
    21 ноя 17, 15:15    [20972510]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    еще кроме гостя можно конечно всех поголовно сисадминами сделать,
    вот тогда все они, даже неотмапленные, в базу попадут.
    не ваш ли случай?
    21 ноя 17, 15:29    [20972583]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    хорошо я согласен
    Member

    Откуда:
    Сообщений: 372
    Yasha123
    еще кроме гостя можно конечно всех поголовно сисадминами сделать,
    вот тогда все они, даже неотмапленные, в базу попадут.
    не ваш ли случай?

    а так и есть - они у меня сейчас поголовно сисадмины.

    вскрылись некоторые странности, я их тут даже перечислять не буду))) направление решения я уловил. Сижу, копаюсь.
    21 ноя 17, 16:53    [20972874]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    хорошо я согласен
    они у меня сейчас поголовно сисадмины.

    ну так сисадмины не нуждаются в выдаче прав, у них уже все есть.
    а вот тот "странный" юзер никакой не админ,
    и в базу-то он отмапился (видимо при попытке выдачи ему прав) под своей учеткой.
    дропните его в базе, как юзера, выдайте его логину сисадмина, как и всем.
    будет у вас всеобщее безобразие, но хотя бы однородное
    21 ноя 17, 17:15    [20972937]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    автор
    при выполнении этих действий ни один пользователь не добавлялся в таблицу principals, только этот добавился. Что с ним не так?

    не с ним не так, а с остальными.
    они уже в базе, и они dbo.
    их уже не отмапить второй раз, ибо 1 логин - 1 юзер.
    а этот НЕ админ, не dbo,
    вы его мапите и он сидит в базе, бесправный, под своей виндовой учеткой.
    и почему вы ему никак не могли выдать EXEC на процедуру,
    это есть великая тайна.
    наверное, в ГУИ мышью тыкали, а не код выполняли.
    21 ноя 17, 17:40    [20973027]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    хорошо я согласен
    Member

    Откуда:
    Сообщений: 372
    вчера не допёр до некоторых вещей. Только сейчас осознал, что за revert и т.д. Без этого не понимал, что за хрень творится)) запросы друг другу противоречат, особенно после перезапуска Management Studio.
    Подучил мат.часть, исследовал БД и...

    Для всех запросов делал USE Datawarehouse
    ЗАПРОС:
    select user_name(grantee_principal_id)  a, *
    from sys.database_permissions
    order by a
    

    ОТВЕТ:
    список из 50 пользователей и дополнил строками public
    Каждый пользователь представлен по одному разу,
    a(No column name)classclass_descmajor_idminor_idgrantee_principal_idgrantor_principal_idtypepermission_namestatestate_desc
    MSK\d.petrovaNULL0DATABASE00581CO CONNECTGGRANT

    Строки отличаются только в колонках: a и grantor_principal_id

    ЗАПРОС:
    REVERT;
    execute as user = 'MSK\d.petrova';
    select *
    from sys.user_token;
    

    ОТВЕТ:
    principal_idsidnametypeusage
    580x0105000000000005150000001E1F1BEC1E85CED3DFC2B69706350000MSK\d.petrovaWINDOWS LOGINGRANT OR DENY
    00x010500000000000904000000F6698AD2F9669343A2A3197A54FF564ApublicROLEGRANT OR DENY
    163900x01050000000000090400000000000000000000000000000006400000db_datareaderROLEGRANT OR DENY
    163910x01050000000000090400000000000000000000000000000007400000db_datawriterROLEGRANT OR DENY

    Результаты запросов для разных пользователей отличаются лишь в первой строке из четырёх, в первых трёх ячейках.
    d.petrova - и есть тот "проблемный пользователь", у которого нет прав к выполнению процедуры.
    + ещё пара запросов. Но они не информативные

    ЗАПРОС:
    REVERT
    EXECUTE AS LOGIN = 'MSK\подставляю.любого.существующего.пользователя'
    SELECT USER;
    

    ОТВЕТ: (не меняется)
    (no column name)
    dbo

    Только потому что вы просили сделать такой запрос.
    Делаю другой
    ЗАПРОС:
    REVERT
    EXECUTE AS USER= 'MSK\МойЛогин'
    SELECT USER;
    

    ОТВЕТ:
    (no column name)
    dbo

    Если подставляю других пользователей - то будет выдавать MSK\Введённый.Пользователь


    Вроде бы, всё должно работать. И в логи пишет, и функции вызывает нормально. Но вот одна процедура встала одному пользователю поперёк горла. Удалял, создавал пользователя заново - всё никак. А другие спокойно ей пользуются.
    22 ноя 17, 15:32    [20975436]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    теперь показывайте картинкой,
    как это вы выдаете EXECUTE проблемному юзеру.
    картинку студии с выполненным запросом:
    grant execute to test;
    

    а рядом, во втором окне, результат вот этого:
    select class_desc,
           permission_name,
    	   state_desc 
    from sys.database_permissions
    where user_name(grantee_principal_id) = 'test';
    


    К сообщению приложен файл. Размер - 17Kb
    22 ноя 17, 16:24    [20975667]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    хорошо я согласен
    REVERT
    EXECUTE AS LOGIN = 'MSK\подставляю.любого.существующего.пользователя'
    SELECT USER;
    

    ОТВЕТ: (не меняется)
    (no column name)
    dbo


    объясняю в третий и последний раз.
    скорее всего, дело было так:
    сперва ваши 50 логинов некто отмапил в вашу базу.

    руками никто ничего не писал, нащелкал мышью всем datareader/datawriter.
    затем кто-то из этих ридеров-райтеров обломался на EXECUTE.
    и тогда супер-админ еще раз нащелкал всем роль,
    на этот раз серверную -- sysadmin.
    и теперь все 50 юзеров отмаплены не в юзеров, которых вы видите, 50 штук,
    а все поголовно стали dbo.
    и когда вы их имперсонэйтите как логины,
    в базе они dbo.
    и не только в этой, во всех, в том числе и в мастере.

    и ничего больше выдавать никому не надо -- все счастливы и могут спокойно дропать вашу базу.

    что не то с последним юзером.
    ну раз вы его имперсонэйтили, а видел он только себя,
    он никакой не сисадмин.

    ну так или засовывайте его в роль,
    или руками выдайте EXECUTE
    22 ноя 17, 16:40    [20975731]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    хорошо я согласен
    Member

    Откуда:
    Сообщений: 372
    Сначала выполнил первый запрос - успешно
    потом выполнил второй. Всё делал для базы Datawarehouse

    К сообщению приложен файл. Размер - 2Kb
    22 ноя 17, 17:33    [20975896]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    хорошо я согласен
    Member

    Откуда:
    Сообщений: 372


    К сообщению приложен файл. Размер - 8Kb
    22 ноя 17, 17:33    [20975897]     Ответить | Цитировать Сообщить модератору
     Re: Execute  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    прецедуру теперь запустите от имени петровой и убедитесь, что хотя бы ушло
    The EXECUTE permission was denied...
    22 ноя 17, 17:38    [20975903]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить