Вопрос

ошибка открытия источника данных ds_Account

Добрый день, есть CRM v 3.30.49 sql версия.

При переходе в закладке Контрагенты со Все контрагенты на Мои Контрагенты выдает ошибка открытия источника данных ds_Account, Вложенный запрос вернул больше одного значения и т.д.

Ошибка только у этого пользователя у других не проявилась

Нравится

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

Забыл упомянуть есть фильтр ОбщиеОтветственный текущий контакт

Добрый вечер.

В Вашем случае нужно отладиться и определить, в какой момент возникает ошибка.

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

Это поможет Вам определить причину ошибки и устранить её.

Вот что получилось, пользователь был привязан ответственным к контрагентам, удалил привязку у всех контрагентов кроме одного, при попытке его выбрать быстрым фильтром по наименованию ОШИБКА ОТКРЫТИЯ ИСТОЧНИКА ДАННЫХ DS_ACCOUNT. Что это может быть? дубль? и как его теперь удалить?

Олег, эта ошибка означает, что у Вас в sq_Account есть колонка или фильтр подзапроса, в котором по смыслу должна быть одно значение результата, а реально подзапрос выдаёт несколько.

Вроде:

select * from tbl_A where A = (select A from tbl_B where B = 1)

Тут, если в tbl_B одна запись с B = 1, то хорошо, а если две и более, то будет такая же ошибка. Для предотвращения можно в подзапросе дописывать top 1.

 

Нужно в профайлере (можно встроенном) отловить этот запрос, после которого выдаёт ошибку, а затем запускать его в СУБД, выясняя, где именно и почему в нём неправильный результат подзапроса.

т.е. дубль ? я правильно понял? запись в sq_Account правильная, она может выбирать например ответственного а там дважды привязали например сотрудника и возникает эта ошибка? не совсем понял где найти запрос sq_Account. я просматриваю таблицы напрямую через SQL Server Management Studio, SQL Query. как там увидеть этот запрос?

Увидеть все идущие от программы в базу запросы можно в SQL Server Profiler.

Запрос я тоже увидел, я имел ввиду где и как его отредактировать? 

В TSAdmin исправить sq_Account, если ошибка в нём. Прежде чем что-то изменять, точно выясните, в чём причина выборки нескольких строк в подзапросе.

Oleg Fchuk,

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

Тут, если в tbl_B одна запись с B = 1, то хорошо, а если две и более, то будет такая же ошибка. Для предотвращения можно в подзапросе дописывать top 1. такой вариант не подходит он выбирает первого попавшегося ответственного, это не точно нужно...  В TSAdmin исправить sq_Account там все в виде конструктора, мне нужен код в виде текста он где-то в базе храниться? На сколько я понимаю Вложенный запрос вернул больше одного значения это ограничение SQL. Получается что база спроектирована не правильно не проверяет на уникальность записи (например ключом или тригером ) которые потом выбираются вложенным запросом. Пользователи бездумно лепят записи и возникают ошибки. Нет защиты от дурака. Хорошо с этим понятно, как теперь это исправить? у меня есть запись в tbl_Account которую я могу увидеть только через SQL Query, через оболочку выдает ошибку, что с этим делать?

Oleg Fchuk пишет:

В TSAdmin исправить sq_Account там все в виде конструктора, мне нужен код в виде текста он где-то в базе храниться?

Нигде, на ходу генерируется.

 

Oleg Fchuk пишет:

На сколько я понимаю Вложенный запрос вернул больше одного значения это ограничение SQL. Получается что база спроектирована не правильно не проверяет на уникальность записи (например ключом или тригером ) которые потом выбираются вложенным запросом.

Где надо, там как раз проверяется.

 

 

Oleg Fchuk пишет:

Хорошо с этим понятно, как теперь это исправить? у меня есть запись в tbl_Account которую я могу увидеть только через SQL Query, через оболочку выдает ошибку, что с этим делать?

Дело не в записи, а в условии выборки подзапроса. Для начала, нужно понять, какой. Попробуйте отловить профайлером и потом запускать проблемный запрос прямо в базе и выяснить, в какой его части ошибка возникает.

выяснил следующее подзапрос к таблице tbl_MountedStaff там есть две записи сделанные одним пользователем недавно 05,06,2020 по времени полностью идентичные до секунды 2020-06-05 10:04:17.647  2020-06-05 10:04:17.647. Пользователя вычислил... Вопрос первый не совсем понял что это за таблица и за что она отвечает?  Если средствами SQL удалить запись какие будут послествия? Еще в догонку значение поля IsPrimary в таблице tbl_MountedStaff может быть 1 у двух и более записей?

Вероятно, проектная доработка. Сложно сказать, не зная, что за продукт у Вас. Посмотреть заголовок таблицы можно, найдя её в дереве справа в TSAdmin.

Вопрос закрыт сделал апдейт поля IsPrimary одной строки в которой было значение 1 (поменял на 0) в таблице tbl_MountedStaff . Человек говорит что у него при записи зависла программа... Полагаю была не завершена транзакция SQL и получилось две записи с одинаковым значением.

Но ID у них точно должен быть разным, во всех таблицах есть ограничение на уровне базы. Достаточно ли IsPrimary = 0 и можно ли удалять запись, зависит от логики на уровне Вашей системы. Если на обе записи из других таблиц есть ссылки, может потребоваться их скорректировать на оставшуюся или удалить тоже.

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