21.01.2009, 15:39 | #1 |
Участник
|
Доступ к SQL
Всю голову себе уже сломал ища решение, подскажите кто знает...
CRM 4.0. Пишу расширение, которое должно напрямую работать с CRM'ной базой MS SQL. Ну а кроме того еще и с CRM-сервисами. К сожалению в данном конкретном расширении не обойтись без работы с SQL - то, что делается запросами нельзя заменить работой сервисов. Возникла проблема. Под администратором все работает, но если запускать расширение от имени простого пользователя, то возникает ошибка - у простого пользователя нет доступа к SQL. Можно подключить для расширения олицетворение. Но тогда наоборот есть доступ к SQL но сервисы работать отказываются. Я вижу несколько путей решения. 1. Коннектиться к SQL с правами админа (или другого пользователя, имеющего доступ к SQL), с этим пока не разбирался, но думаю что это возможно. Но тогда где то как то нужно хранить логин и пароль админа. 2. Отключить для расширения олицетворение. Но тогда нужно иметь имя и пароль пользователя, для того, чтобы создать NetworkCredential при создании подключения к сервисам. Имя текущего пользователя можно было бы получить программно, но пароль... Получается что как и в варианте 1 нужно где то как то хранить логин и пароль. 3. Выделить все части программы, где идет работа с SQL в отдельный веб-сервис и для него отключить олицетворение, чтобы он нормально работал с ДБ. Этот вариант тоже зело геморный да и общая скорость работы пострадает. Кто как решает подобные проблемы? |
|
21.01.2009, 15:44 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от ZooY
Всю голову себе уже сломал ища решение, подскажите кто знает...
CRM 4.0. Пишу расширение, которое должно напрямую работать с CRM'ной базой MS SQL. Ну а кроме того еще и с CRM-сервисами. К сожалению в данном конкретном расширении не обойтись без работы с SQL - то, что делается запросами нельзя заменить работой сервисов. Возникла проблема. Под администратором все работает, но если запускать расширение от имени простого пользователя, то возникает ошибка - у простого пользователя нет доступа к SQL. Можно подключить для расширения олицетворение. Но тогда наоборот есть доступ к SQL но сервисы работать отказываются. Я вижу несколько путей решения. 1. Коннектиться к SQL с правами админа (или другого пользователя, имеющего доступ к SQL), с этим пока не разбирался, но думаю что это возможно. Но тогда где то как то нужно хранить логин и пароль админа. 2. Отключить для расширения олицетворение. Но тогда нужно иметь имя и пароль пользователя, для того, чтобы создать NetworkCredential при создании подключения к сервисам. Имя текущего пользователя можно было бы получить программно, но пароль... Получается что как и в варианте 1 нужно где то как то хранить логин и пароль. 3. Выделить все части программы, где идет работа с SQL в отдельный веб-сервис и для него отключить олицетворение, чтобы он нормально работал с ДБ. Этот вариант тоже зело геморный да и общая скорость работы пострадает. Кто как решает подобные проблемы? Вот такую тему выкладывал - работает идеально Создание и регистрация плагина на Execute и Retreive Плюс выложите свои исходники - мож помогу чем.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
21.01.2009, 15:49 | #3 |
Участник
|
|
|
21.01.2009, 15:49 | #4 |
Участник
|
Да с плагинами то как раз проблем нет, там и с олицетворением все в порядке и работает он от имени Network Service... Проблема в том что это ASP.NET-страница.
Сам код выкладывать смысла нет, он работает, но только под админом, под обычным пользователем - проблема с правами доступа. |
|
21.01.2009, 15:54 | #5 |
Участник
|
|
|
21.01.2009, 16:22 | #6 |
Участник
|
|
|
21.01.2009, 16:40 | #7 |
Чайный пьяница
|
Цитата:
Сообщение от ZooY
Всю голову себе уже сломал ища решение, подскажите кто знает...
CRM 4.0. Пишу расширение, которое должно напрямую работать с CRM'ной базой MS SQL. Ну а кроме того еще и с CRM-сервисами. К сожалению в данном конкретном расширении не обойтись без работы с SQL - то, что делается запросами нельзя заменить работой сервисов. Возникла проблема. Под администратором все работает, но если запускать расширение от имени простого пользователя, то возникает ошибка - у простого пользователя нет доступа к SQL. Можно подключить для расширения олицетворение. Но тогда наоборот есть доступ к SQL но сервисы работать отказываются. Я вижу несколько путей решения. 1. Коннектиться к SQL с правами админа (или другого пользователя, имеющего доступ к SQL), с этим пока не разбирался, но думаю что это возможно. Но тогда где то как то нужно хранить логин и пароль админа. 2. Отключить для расширения олицетворение. Но тогда нужно иметь имя и пароль пользователя, для того, чтобы создать NetworkCredential при создании подключения к сервисам. Имя текущего пользователя можно было бы получить программно, но пароль... Получается что как и в варианте 1 нужно где то как то хранить логин и пароль. 3. Выделить все части программы, где идет работа с SQL в отдельный веб-сервис и для него отключить олицетворение, чтобы он нормально работал с ДБ. Этот вариант тоже зело геморный да и общая скорость работы пострадает. Кто как решает подобные проблемы?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
21.01.2009, 18:21 | #8 |
Участник
|
|
|
21.01.2009, 20:39 | #9 |
Moderator
|
А может проще пользователям прав на SQL сервере добавить? Чтобы было как у админа? Все проще, раз уж быдлокод практиковать решили? Права на доступ у пользователей, кстати, должны быть. Хотя возможно, что лишь для чтения.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
21.01.2009, 21:02 | #10 |
Участник
|
Цитата:
Прав на чтение у пользователей, кстати, нету - проверено. На самом деле есть вариант еще проще - пользователя, под которым работает AppPool добавить в CRM с правами админа, а в приложении выключить олицетворение. Вопрос только в том, на сколько это безопасно? |
|
22.01.2009, 09:23 | #11 |
Moderator
|
"Быдлокод" - это убогий и неправильный подход к решению задачи. Ансапорт может быть и элегантным...
Проверьте еще раз! Все пользователи, которым разрешено выполнение отчетов (по умолчанию все) входят в группу безопасности AD ReportingGroup, которой на SQL сервере разрешено выполнять SELECT против фильтрованных представлений и хранимых процедур. Но это если говорить о "поддерживаемом" функционале. По мне так проще создать на SQL роль с правами на доступ к определенным таблицам и дать ее UserGroup чем какую-то IIS учетку в святая святых допускать. Впрочем, дело ваше. Задача и без того, на мой взгляд надумана, вы уж извините.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
22.01.2009, 15:27 | #12 |
Участник
|
Задача не надумана. Клиенту нужно иметь возможность менять валюту записей некоторых сущностей, как то: договоров, предложений, возможных сделок. Это жизненно необходимо.Причем это не прихоть одной конкретной фирмы, а специфика работы все области деятельности компании. Кроме как прямым доступом в SQL эту задачу не решить. И на мой взгляд неправильно называть подход к решению задачи "убогим и неправильным" если неизвестна сама задача.
А насчет прав пользователей на чтение из SQL вы правы, доступ есть, это я малость тупонул. В моем случае одной никому, кроме администратора, не известной, с надежным паролем, записи даются некоторые права для доступа в CRM. Вы же предлагаете всем пользователям с их убогими паролями и стикерами с учетными данными на мониторе дать права на доступ к SQL. Ну даже и не знаю что лучше... Последний раз редактировалось ZooY; 22.01.2009 в 15:37. |
|
22.01.2009, 19:40 | #13 |
Moderator
|
По крайней мере будет понятно кого поломали и можно будет конкретного пользователя за взлом покарать! И все же, почему нельзя воспользоваться сервисом? Вот как сейчас вижу свойство :
Код: quote.transactioncurrencyid Property public Lookup transactioncurrencyid {get; set;}
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
22.01.2009, 20:15 | #14 |
Участник
|
Да, свойство такое есть и оно действительно get/set, но есть оно НО... Задание значения для этого свойства не дает никакого результата. Не выводиться никакой ошибки, просто значение не меняется. Set работает видимо только для создания записи.
Собственно задание этого свойства - это первое что я попробовал, когда начал решение задачи. Но увы... |
|
22.01.2009, 22:28 | #15 |
Moderator
|
Через веб интерфейс, мне помнится, оно нормально меняется для активных записей. Мне кажется вам следует искать ошибку в коде. Если пришлете пример, уверен, вместе мы разберемся!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
23.01.2009, 12:40 | #16 |
Участник
|
Ну например вот, простейший код для смены валюты в возможной сделке, только что написал его и проверил.
Код: string _organizationName = "Rainbow"; string _crmServiceUrl = "http://192.168.1.1:5555/mscrmservices/2007/crmservice.asmx"; // GUID существующей активной возможной сделки Guid _opportunityGuid = new Guid("{9133C5C5-26E9-DD11-9E20-0003FF25A266}"); // GUID валюты, доллара (у возможной сделки валюта - рубли) Guid _usdCurrencyGuid = new Guid("{E05CCF2C-5D28-DD11-82AF-0003FF25A266}"); CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = _organizationName; CrmService service = new CrmService(); service.Url = _crmServiceUrl; service.CrmAuthenticationTokenValue = token; service.Credentials = System.Net.CredentialCache.DefaultCredentials; opportunity opportunity = new opportunity(); opportunity.opportunityid = new Key(); opportunity.opportunityid.Value = _opportunityGuid; // Заодно меняется имя, чтобы было видно, что изменение вообще прошло. opportunity.name = DateTime.Now.ToShortTimeString(); opportunity.transactioncurrencyid = new Lookup(); opportunity.transactioncurrencyid.type = EntityName.transactioncurrency.ToString(); opportunity.transactioncurrencyid.Value = _usdCurrencyGuid; service.Update(opportunity); В результате имеем измененное имя и нетронутую валюту. Возможно конечно есть какие то тонкости смены валюты о которых я не знаю, и приведенного кода мало... |
|
24.01.2009, 13:44 | #17 |
Участник
|
Цитата:
Сообщение от ZooY
Ну например вот, простейший код для смены валюты в возможной сделке, только что написал его и проверил.
Код: string _organizationName = "Rainbow"; string _crmServiceUrl = "http://192.168.1.1:5555/mscrmservices/2007/crmservice.asmx"; // GUID существующей активной возможной сделки Guid _opportunityGuid = new Guid("{9133C5C5-26E9-DD11-9E20-0003FF25A266}"); // GUID валюты, доллара (у возможной сделки валюта - рубли) Guid _usdCurrencyGuid = new Guid("{E05CCF2C-5D28-DD11-82AF-0003FF25A266}"); CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = _organizationName; CrmService service = new CrmService(); service.Url = _crmServiceUrl; service.CrmAuthenticationTokenValue = token; service.Credentials = System.Net.CredentialCache.DefaultCredentials; opportunity opportunity = new opportunity(); opportunity.opportunityid = new Key(); opportunity.opportunityid.Value = _opportunityGuid; // Заодно меняется имя, чтобы было видно, что изменение вообще прошло. opportunity.name = DateTime.Now.ToShortTimeString(); opportunity.transactioncurrencyid = new Lookup(); opportunity.transactioncurrencyid.type = EntityName.transactioncurrency.ToString(); opportunity.transactioncurrencyid.Value = _usdCurrencyGuid; service.Update(opportunity); В результате имеем измененное имя и нетронутую валюту. Возможно конечно есть какие то тонкости смены валюты о которых я не знаю, и приведенного кода мало... Lookup curencMy = new Lookup { Value = new Guid("E05CCF2C-5D28-DD11-82AF-0003FF25A266") }; opportunity.transactioncurrencyid = curencMy; |
|
24.01.2009, 21:19 | #18 |
Участник
|
Ti1, какая интересная конструкция, это из какого языка?
Надо полагать на C# это будет выглядеть так: Код: Lookup curencMy = new Lookup(); curencMy.Value = new Guid("E05CCF2C-5D28-DD11-82AF-0003FF25A266"); opportunity.transactioncurrencyid = curencMy; |
|
25.01.2009, 20:07 | #19 |
Moderator
|
Блин, фигня какая-то. Сколько рылся в SDK ничего по этой тебе не нашел. Может быть вместе со сменой валюты надо значения еще каких-то полей менять? Поле Money оно же из 2, фактически, состоит: значение и значение в базовойвалюте. Буду на работе попробую. А если создавать объект программно, то связывание происходит нормально?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
26.01.2009, 01:31 | #20 |
Участник
|
Попробовал менять предполагаемый доход - результат нулевой.
Если создавать программно, то все нормально, устанавливается, та валюта, которая нужна. Последний раз редактировалось ZooY; 26.01.2009 в 01:38. |
|
|
|