Права из скрипта

Всем привет!
Стоит задача раздать права на фин. операции, в зависимости от неких условий...

Делаю так:

        var DatasetCFR = Services.GetNewItemByUSI("ds_CashflowRight");
        ApplyDatasetFilter(DatasetCFR,'RecordID',Dataset.ValAsGUID('ID'),true);
        DatasetCFR.Open();
        if(!IsDatasetEmpty(DatasetCFR))
        {
        DatasetCFR.GotoFirst();
                while(!DatasetCFR.IsEOF)
                {
                DatasetCFR.Delete();
                }      
        }
       
// Назначаем новые
       
// Финансы общий
        DatasetCFR.Append();
        DatasetCFR.ValAsGUID('RecordID') = Dataset.ValAsGUID('ID');
        DatasetCFR.ValAsGUID('AdminUnitID') = '{6061DEFD-9679-4DB0-9F41-C22DB7692991}';
        DatasetCFR.Values('CanRead') = 1;
        DatasetCFR.Values('CanWrite') = 0;
        DatasetCFR.Values('CanDelete') = 0;
        DatasetCFR.Values('CanChangeAccess') = 0;
    DatasetCFR.Post();

Вот удаление прав проходит, а при добавлении вылетает ошибка:
[10.01.29 14.30.08.875] (E) Ошибка выполнения метода 'SelfOnDatasetAfterPost'. Ошибка сохранения записи. Оригинальное сообщение об ошибке: Текущий пользователь не имеет достаточно прав для добавления записей в таблицу 'vw_CashflowRight' «Call Stack»

В энтерпрайз мэнеджере права на vw_CashflowRight и tbl_CashflowRight даны всем! Через SQL навигатор всё добавляется. Смотрю по SQL Profiler... террасофт даже запрос на вставку не посылает!!!

В чём ошибка? Как можно решить эту задачу?
Раздавать права через администрирование не предлагать, т.к. права задаются на основе данных

Под админом всё работает!

Версия 3,2

Спасибо!

Нравится

13 комментариев

то что под администратором работает вполне естественно - он то права на раздачу прав наверняка имеет))
а вот для простых смертных пользователей такой скрипт может работать только в случае, если текущий пользователь сам имеет право на раздачу прав на данную запись - дайте на ту запись (на фин операцию), для которой прогоняется скрипт нужному пользователю полные права вручную и проверьте его вновь

А почему в самом SQL одним запросом не раздать права? Зачем из Террасофт?

--
www.it-sfera.com.ua

"Виталий Ковалишин aka samael" написал:А почему в самом SQL одним запросом не раздать права?

Одним запросом не получится потому, что при первом же сохранении таблицы в Администраторе измененный Вами триггер будет изменен системой на стандартный. Поэтому лучше добавить свой триггер изменения прав доступа.
________________
www.it-sfera.com.ua

Идея и состояла НЕ в запросе, а в переносе логики из скрипта на сторону SQL! Все права по-умолчанию в Terrasoft создаются именно триггером. Поэтому, проще написать свой триггер для данных целей :) Вот и все!

--
www.it-sfera.com.ua

"Александр Кудряшов" написал:

Вообщето странно, что под простым смертным не работает... я не нашол никаких тригеров на vw_CashflowRight и tbl_CashflowRight .

А если сделать как Вы сказали, то вылезает ошибка:

Ошибка выполнения метода 'SelfOnDatasetAfterPost'. Ошибка сохранения записи. Оригинальное сообщение об ошибке: Update or insert of view or function 'dbo.vw_CashflowRight' failed because it contains a derived or constant field «Call Stack»

Хотя запись создаётся и пользователь её создавший имеет прова на смену прав... А вот дальше скрипт не отработал...

"Виталий Ковалишин aka samael" написал:

Да идея хорошая, но я уже много написал в скриптах. То код, что я привёл это кусочек...
А руководству доложено, что всё хотово! :lol:

"Slovarik" написал:Ошибка выполнения метода 'SelfOnDatasetAfterPost'.

попробуйте сервис insert query сделать и им права прописать в таблицу, чтобы датасет не трогать
либо отключить для данного датасета обработку событий Dataset.DisableEvents непосредственно перед post

"Александр Кудряшов" написал:

мой датасет ds_CashflowRight, а у него нет никаких событий! И даже USI скрипта не прописан... Чтото я не понял совсем... Откуда взялось SelfOnDatasetAfterPost!

В топку всё!!!

Решение проблеммы найдено! Террасофт побеждён!!!
SQL рулит!!!

Переписал всё на SQL вот таким макаром:

Connector.DBEngine.ExecuteCustomSQL("insert into tbl_CashflowRight (RecordID,AdminUnitID,CanRead,CanWrite,CanDelete,CanChangeAccess) values ('"+Dataset.ValAsGUID('ID')+"','6061DEFD-9679-4DB0-9F41-C22DB7692991',1,0,0,0)", Parameters);

А на таблицу tbl_CashflowRight прописал прова в ручьную!
:lol:
Всё вроди работает... тьфу-тьфу-тьфу!

Всем ОГРОМНОЕ спасибо!

И проделали огромаднейшую дыру в безопасности. Пользователь теперь сможет запросто получить права на все записи tbl_Cashflow.
Все конечно не так плохо если Вы дали права на tbl_CashflowRight только ограниченному числу пользователей.

"Агутин Алексей" написал:И проделали огромаднейшую дыру в безопасности

:lol:
Да согласен! Готов выслушать Ваши предложения... Как решить задачу!? Где в терасофте настраиваются права на таблицу прав? Почему любой пользователь может удалить из таблицы ...Right всё, что захочет? Какие тригеры обробатывают попытку внесения новых записей и блокируют их от не администраторов (читайте внимательно первый пост)?
"Slovarik" написал:В энтерпрайз мэнеджере права на vw_CashflowRight и tbl_CashflowRight даны всем! Через SQL навигатор всё добавляется. Смотрю по SQL Profiler... террасофт даже запрос на вставку не посылает!!!

ГДЕ ЭТИ НАСТРОЙКИ???

Готов выслушать рациональные придложения, а про права это и так ясно...
Хотите поделюсь способом обеспечения почти абсолютной безопасности? Бронерованный, обесточенный и.т.д... сэиф. Выкльчить сервер, положит его туда и закопать... :cool: Никто не украдёт!!!

"Агутин Алексей" написал:только ограниченному числу пользователей

Да кстати... Дал права группе "Все пользователи" :lol::lol::lol: и ушёл в отпуск с чистой совестью!
Удачи!!!:wink:

"Slovarik" написал:Почему любой пользователь может удалить из таблицы ...Right всё, что захочет?

На самом деле ни один пользователь не имеет доступ к таблице прав - только администраторы. Обычные пользователи работают с этой таблицей только через соответствующее представление vw_*Right. Модифицировать (добавлять/удалять/изменять) запись этого представления пользователи могут только в том случае, если имеют право CanChangeAccess на соответствующую запись таблицы.

"Slovarik" написал:Как решить задачу!?

Решение уже было озвучено - переносить раздачу этих прав на сервер: т.е. создать триггер на AFTER INSERT, UPDATE, в котором проверять все необходимые условия и, в случае положительного исхода, добавлять записи в таблицу прав.

Показать все комментарии