На работе у нас установлен Microsoft Dynamics CRM 4.0, и сотрудники используют логин в локальной сети для входа в веб-интерфейс CRM.
Мы добавили настраиваемый вход на основе SQL Server (на сервер и db * _MSCRM) с ролью db_datareader. Новый логин может выбирать из представлений, однако он возвращает пустой набор результатов. Если я вхожу в SQL Server Management Studio, используя свой идентификатор локальной сети, и запускаю sql для того же представления, я получаю ожидаемые данные.
Есть идеи, что отсутствует или неправильно?
ОБНОВИТЬ
В конечном итоге мне удалось обойти эту проблему. Проблема заключалась в том, что sql за представлением был связан с настраиваемой таблицей пользователей, что не позволяло моему входу в sql sever возвращать какие-либо данные, поскольку их не было в этой настраиваемой таблице пользователей (SystemUserBase)
left join SystemUserBase u on (u.SystemUserId = dbo.fn_FindUserGuid() and u.IsDisabled = 0)
left join UserSettingsBase us on us.SystemUserId = u.SystemUserId
left join OrganizationBase o on u.OrganizationId = o.OrganizationId
Я предполагаю, что Microsoft разработала это таким образом, чтобы продукт был самообслуживаемым, тогда как вам не нужен администратор базы данных для добавления пользователей в базу данных. Администрирование пользователей осуществляется через приложение. А безопасность обеспечивается за счет просмотров.
В любом случае мне удалось обойти это, передав идентификатор SystemUserId для моего идентификатора LAN, при этом я был авторизован как общий логин sql. Есть функция, которая возвращает guid для идентификатора локальной сети, вошедшего в систему в данный момент: print dbo.fn_FindUserGuid();
. Затем я просто запустил модифицированную копию представления sql:
declare @user_guid char(36);
set @user_guid = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; /* obfuscated */
...
left join SystemUserBase u on (u.SystemUserId = @user_guid and u.IsDisabled = 0)
...
Мне также пришлось удалить все ссылки на любые функции, для которых общий логин не имел прав на выполнение (т.е. dbo.fn_UTCToTzSpecificLocalTime
). Или я мог бы предоставить каждому право на выполнение.
В качестве альтернативы я могу изучить возможность создания записи в SystemUserBase
table для моего общего входа в систему, чтобы я не был привязан к своему LAN-гиду.
ОБНОВЛЕНИЕ 2
Мне удалось исключить необходимость в моем LAN-гиде (SystemUserBase.SystemUserBase
). Я просто удалил все предложения where, связанные с разрешениями. Затем все, что нужно для поиска StringMap, - это OrganizationBase.OrganizationId
гид, а OrganizationBase.LanguageCode
В нашем случае это en-us или 1033.
Если бы меня не волновали поисковые запросы, мне бы ничего не понадобилось. Я бы просто пошел против таблиц напрямую без предложений StringMaps или разрешений where.
Чтобы использовать отфильтрованные представления, вам необходимо установить CRMReaderRole при входе в систему, а затем, прежде чем запрашивать данные, вам нужно установить CONTEXT_INFO
Одноразовая установка
USE [CRM_MSCRM]
GO
EXEC sp_addrolemember N'CRMReaderRole', N'your sql login here'
GO
затем сделайте это, прежде чем запрашивать отфильтрованные представления
SELECT @uid = SystemUserId FROM CRM_MSCRM.dbo.SystemUserBase WHERE FullName = 'CRM USER TO IMPERSONATE'
SET CONTEXT_INFO @uid
ПРИМЕЧАНИЕ. Это будет работать с пользователем SQL, но не будет работать со связанным сервером. Протестировано в CRM 2011 UR 17
Ваш подход неверен.
Если вы хотите использовать отфильтрованные представления, вы должны использовать пользователя домена с учетной записью CRM. Приложение имеет собственный уровень безопасности поверх уровня безопасности базы данных. Итак, хотя вы предоставили пользователю доступ к самой базе данных, приложение позаботится о безопасности в отношении его привилегий CRM. Видеть Отфильтрованные просмотры
Отфильтрованные представления полностью соответствуют модели безопасности Microsoft Dynamics CRM. Когда вы запускаете отчет, который получает данные из отфильтрованных представлений, роль безопасности Microsoft Dynamics CRM определяет, какие данные вы можете просматривать в отчете.
Также имейте в виду, что в основном единственное реально поддерживаемое использование прямого доступа к базе данных в Dynamics CRM - это создание отчетов (и это ограничивается отфильтрованными представлениями). Вам не следует напрямую взаимодействовать с базой данных по каким-либо другим причинам.