Страница 1 из 1

Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 16:29
sim
При расчете зарплаты часто выдается ошибка:
TBlockModifier.Run Ошибка модификации данных! Статус = 5. Обработано 143 записей.
и затем:
Дублирование уникального ключа. таблица PRMONTHUPDATING =>PDOC||08952eD0

Может быть, кто подскажет - в какую сторону порыться?
Версия 8.1, mssql, патчи свежие

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 17:42
Polimer
Может быть связано с отсутствием прав на новые таблицы?

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 20:03
sim
Polimer писал(а):Может быть связано с отсутствием прав на новые таблицы?
Не, права на новые таблицы мы пересчитали...
Да и до перехода на новые патчи (когда еще докомпиляции словаря не было) - тоже такая же ошибка выводилась.

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 20:19
Polimer
Если на реальной таблице у нас появляется такая ошибка(дублирование уникального ключа), запускаем процедурку приращения нрек для этой таблицы. Правда, в последнее время очень редко появляется.

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 21:28
sim
Polimer писал(а):Если на реальной таблице у нас появляется такая ошибка(дублирование уникального ключа), запускаем процедурку приращения нрек для этой таблицы. Правда, в последнее время очень редко появляется.
Да вот в том и фишка то, что такой таблицы среди реальных не наблюдается.
PRMONTH есть, а PRMONTHUPDATING - нет в словаре.

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 22:08
edward_K
скорей всего это просто синоним. Посмотри в сапорте какие там уникальные ключи - часто кроме nrec есть еще.
Раньше например был в нескольких таблицах tabn и tabn+cex - cex не совпал с лиц.счетом и получаем ошибку.
Здесь уникальный то только Nrec, но он не первый.

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 27 янв 2011, 23:27
spark
sim писал(а):При расчете зарплаты часто выдается ошибка:
TBlockModifier.Run Ошибка модификации данных! Статус = 5. Обработано 143 записей.
и затем:
Дублирование уникального ключа. таблица PRMONTHUPDATING =>PDOC||08952eD0

Может быть, кто подскажет - в какую сторону порыться?
Версия 8.1, mssql, патчи свежие
А запуск галактики с ключом /nusk+ не помогает?
Меня пару раз в подобных ситуациях именно это и спасало.

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 28 янв 2011, 13:41
sim
Polimer писал(а):Если на реальной таблице у нас появляется такая ошибка(дублирование уникального ключа), запускаем процедурку приращения нрек для этой таблицы. Правда, в последнее время очень редко появляется.
А можно поподробнее - как это сделать?

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 28 янв 2011, 13:42
sim
spark писал(а): А запуск галактики с ключом /nusk+ не помогает?
Меня пару раз в подобных ситуациях именно это и спасало.
Можно ли это сделать при работающих пользователях?

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 28 янв 2011, 14:18
galover
/nusk+ обычно помогает, проверяли на работающих юзерах

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 28 янв 2011, 14:48
Polimer
sim писал(а):
Polimer писал(а):Если на реальной таблице у нас появляется такая ошибка(дублирование уникального ключа), запускаем процедурку приращения нрек для этой таблицы. Правда, в последнее время очень редко появляется.
А можно поподробнее - как это сделать?
Вроде публиковал:

Код: Выделить всё

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[spNapSetNRECMax](@TableName VARCHAR(200))
AS BEGIN
  DECLARE @SQL VARCHAR(8000)

  SELECT @SQL = '
    DECLARE @NREC VARBINARY(8)
    SELECT @NREC = MAX(F$NREC) FROM T$' + @TableName + '
    EXEC spNapSetNREC ''' + @TableName + ''', @NREC'
  EXEC(@SQL)
  --PRINT @SQL
END
и

Код: Выделить всё

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[spNapSetNREC](@TableNameOrCode VARCHAR(80), @NewNREC VARBINARY(8))
AS
BEGIN
  DECLARE @I INT, @DbName VARCHAR(50), @NeedMax INT, @TableCode INT
  DECLARE @NREC0 VARBINARY(8), @NREC VARBINARY(8), @Base VARBINARY(2)
  SELECT
    @Base = CONVERT(VARBINARY(2), CONVERT(INT, SUBSTRING(@NewNREC, 1, 2)) & 0x8001)
  SELECT 
    @TableCode = dbo.fnTableCode(@TableNameOrCode),
    @DbName = UPPER(DB_NAME()), 
    @NeedMax=0, 
    @NREC0 = SUBSTRING(@Base, 1, 2) + SUBSTRING(0x000000000000, 1, 6), 
    @I = 0
  SELECT
    @NREC = @NREC0

  EXEC master..na_getnextnrec @DbName, @TableCode, @NREC OUTPUT, @NeedMax OUTPUT
  IF @NeedMax = 1 
    EXEC master..na_getnextnrecbymax @DbName, @TableCode, @NREC OUTPUT, @NeedMax OUTPUT, @NewNREC
  ELSE 
  IF @NREC >= @NewNREC
    PRINT 'spNAPSetNREC: NREC успешно приращен'
  ELSE
  BEGIN
    DECLARE @Diff BIGINT, @Msg VARCHAR(8000), @IMax BIGINT
    SELECT 
      @IMax = 1000000, 
      @Diff = CONVERT(BIGINT, @NewNREC) - CONVERT(BIGINT, @NREC)
    IF @Diff > @IMax BEGIN
      SELECT @Msg = 'spNAPSetNREC: приращение NREC на слишком большое значение (' + LTRIM(@Diff) + ')'
      RAISERROR(@Msg, 16, 1)
    END
    ELSE BEGIN
      PRINT 'spNapSetNREC: Вызываю na_getnextnrec в цикле...'
      --PRINT @NREC 
      --PRINT @NewNREC 

      WHILE @NREC < @NewNREC AND @I <= @IMax
      BEGIN
        --PRINT @NREC
        SELECT @NREC = @NREC0
        EXEC master..na_getnextnrec @DbName, @TableCode, @NREC OUTPUT, @NeedMax OUTPUT
        SELECT @I = @I + 1
      END
      --PRINT '@I = ' + LTRIM(@I)
      IF ISNULL(@NREC, 0) < @NewNREC 
      BEGIN
        SELECT @Msg = 'Ошибка в spNapSetNREC: ' + CHAR(10) + 
          'NREC не приращен до заданного значения. ' + 
          'Цикл прерван после ' + LTRIM(@I) + ' вызовов na_getnextnrec. ' + CHAR(10) + 
          'Для дополнительного приращения NREC повторно вызовите процедуру ' + 
          'spNapSetNREC.'
        RAISERROR(@Msg, 16, 1)
      END
    END
  END
  IF @NREC = @NewNREC PRINT 'spNapSetNREC: NREC успешно приращен.'
END

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 28 янв 2011, 18:29
sim
Загрузка с NUSK+ не помогла. К сожалению.
(кстати, использование данного ключа возможно только в монопольном режиме).
Кроме того, таблица PRMONTH была проверена всеми возможными способами на предмет содержания неуникальных записей. Таковых нет.

Re: Дублирование ключа в таблице PRMONTHUPDATING

Добавлено: 30 янв 2011, 01:45
Screw
PDOC - это одна из локальных таблиц в памяти интерфейса PrMonthUpdating. Никакие лечения базы тут не помогут. Скорее всего, обычный прикладной ляп. Постарайтесь как можно точнее выяснить обстоятельства возникновения ошибки и по возможности зарегистрируйте проблему в ПиР.