Вход | Регистрация
 
1С:Предприятие :: Администрирование

Ошибка SQL State: 23000 Native: 1505 - обновление решения проблемы

Ошибка SQL State: 23000 Native: 1505 - обновление решения проблемы
Я
   Чес
 
25.05.07 - 22:32
При загрузке в монопольном режиме SQL ругается:
SQL State: 23000
Native: 1505
Message: [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 2. Most significant primary key is ' 6OJ '.


Решение описано тут:

http://www.forum.mista.ru/topic.php?kb=1&id=9962

Вношу свои предложения:
Arhitektor искал дублирования записи по ключу, заданному определенным индексом методом монопольного входа в 1С после исправления каждой ошибки. Есть более рациональный метод:

Немного теории: SQL пытается создать ключ из нескольких полей, при анализе файла 1Cv7.DDS видим следующее

//Начало
#===============================================================================
#==TABLE no 4      : Ссылки документов
# Name    |Descr                         |SQLTableNam|RecordLock
T=1SCRDOC |Ссылки документов             |_1SCRDOC   |          
#-----Fields-------
# Name                  |Descr               |Type|Length|Precision
F=ROW_ID                |Row ID              |I   |0     |0        
F=MDID                  |Md ID of select     |I   |0     |0        
F=PARENTVAL             |Parent Value        |C   |23    |0        
F=CHILD_DATE_TIME_IDDOC |Child date          |C   |23    |0        
F=CHILDID               |Child Doc ID        |C   |9     |0        
F=FLAGS                 |Flags of refers     |Y   |0     |0        
#----Indexes------
# Name                           |Descr         |Unique|Indexed fields                                              |Type      
I=PK__1SCRDOC                    |ROW_ID        |1     |ROW_ID                                                      |1          
I=CHILD                          |Child Referenc|1     |CHILDID,MDID,PARENTVAL                                      |0          
I=PARENT                         |Parent Referen|1     |MDID,PARENTVAL,CHILD_DATE_TIME_IDDOC                        |0      
//Окончание

Из части "Indexes" понятно, что дублирующиеся ключи SQL пытается создать из полей CHILDID,MDID,PARENTVAL
Соотвественно, наша задача - сразу найти все записи в таблице, где эти поля дублируются
для этого
1. Открываем Enterprise Manager
2. В списке баз находим нашу убитую, раскрываем
3. Щелкаем Tables, в списке таблиц находим _1SCRDOC
4. По ней правой кнопкой - Open Table - Query
5. И еще раз п.4, сейчас объясню зачем.

В появившемся на экране конструкторе запросов пишем следующее:

SELECT     CHILDID, MDID, PARENTVAL, COUNT(*) AS cnt
FROM         _1SCRDOC
GROUP BY MDID, PARENTVAL, CHILDID
HAVING      (COUNT(*) > 1)

Нажимаем кнопку Run (с красным вопросительным знаком)
Внизу появится таблица с результатами нашего запроса. Количество "дублей" может быть разное. Для каждого из них проделываем следующее:
Во втором открытом конструкторе запросов пишем следующее:

SELECT     *, MDID AS Expr1, CHILDID AS Expr2, PARENTVAL AS Expr3
FROM         _1SCRDOC
WHERE     (CHILDID LIKE '%8ZYS%')

8ZYS - это то, что у вас находится в первом столбике первого запроса. Для каждого дубля копируете оттуда, вставляете в этот запрос и выполняете, пока дубли не закончатся :)

После выполнения запроса внизу получаем результат. ищем записи, где поля CHILDID,MDID,PARENTVAL одинаковы (больше 2-х не встречал)
Теперь одну из записей надо удалить. Какую - я, как и Архитектор, удалял с большим ID. не принципиально.

В принципе все. Запускаете 1С в монопольном режиме - реиндексация - и Выходим! из предприятия, для того что бы сделать Выгрузку - загрузку данных.

На этом все.
 
 
   Чес
 
2 - 25.05.07 - 22:32
(1) Фига себе :)
   romix
 
Модератор
3 - 25.05.07 - 23:42
(3) А кинь Телепату в Книгу Знаний, а то здесь он не найдет..
   Чес
 
4 - 26.05.07 - 10:44
(3) ок
   Чес
 
5 - 01.06.07 - 11:53
Корректировка:
в после выполнения п.4

4. По ней правой кнопкой - Open Table - Query

Выполняем следующий запрос:
SELECT     _1SCRDOC.*
FROM         (SELECT     CHILDID, MDID, PARENTVAL, COUNT(*) AS cnt, MAX(ROW_ID) AS rd
                      FROM          _1SCRDOC
                      GROUP BY MDID, PARENTVAL, CHILDID
                      HAVING      (COUNT(*) > 1)) DERIVEDTBL INNER JOIN
                     _1SCRDOC ON DERIVEDTBL.rd = _1SCRDOC.ROW_ID


Результатом запроса будут все строки, которые нам надо удалить.
   Чес
 
6 - 03.06.07 - 15:44
А чего в базу знаний не ложите? :)

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует