PowerDesigner ошибка при удалении значений по умолчанию в MS SQL 2005

При генерации скрипта для изменения схемы данных PowerDesigner 15.2 переименовывает редактируемую таблицу во временную с префиксом tmp_, после чего выполняет ее создание, а затеем перезаливку данных из временной таблицы. Все было бы ничего, если бы эта умная программа удаляла все ограничения по умолчанию, которые привязаны к столбцам таблицы. Если этот скрипт применить к базе данных, то обязательно получите сообщение об ошибке

В базе данных уже существует объект с именем "DF_Имя_ограничения".

Для решения этой проблемы необходимо, что бы перед переименование все значения по умолчанию были удалены, поскольку после переименования таблица уже не будет существовать в базе.

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

В PowerDesigner выбрать пункт DataBase – Edit Current DBMS на вкладке General выбрать Script – Objects – Table – Rename

Редактировать DBMS

Редактировать DBMS

Там будет содержаться команда

[%R%?[exec ]][execute ]sp_rename %OLDTABL%, %NEWTABL%

Замените его на следующий текс

Declare @SqlText varchar(200), @DF_Name varchar(50)

Declare  C Cursor

for Select sobjects.name

from  sysobjects sobjects

Where parent_obj = object_id('%OLDTABL%') and sobjects.xtype = 'D'

open C

fetch next from c into @DF_Name

While @@fetch_status = 0

begin

set @SqlText = 'alter table %OLDTABL% Drop constraint '+@DF_Name

print @SqlText;

exec(@SqlText)

fetch next from c into @DF_Name

end

Close C

Deallocate C

[%R%?[exec ]][execute ]sp_rename %OLDTABL%, %NEWTABL%

Здесь явно прописан скрипт удаления ограничений. Плюсом этого ново введения будет , то что это будет выполняться автоматически всякий раз как PowerDesigner будет переименовывать таблицу, минус, то что это будет сохранено локально и если вы будите работать за другими компьютером, то вам придется повторить операцию.

Share

Tags: ,

12 Responses to “PowerDesigner ошибка при удалении значений по умолчанию в MS SQL 2005”

  1. Александр пишет:

    Спасибо, мне очень помогло!
    Есть ли еще баги такого рода в скриптах?

  2. Рад, что запись оказалась полезной для вас.
    Пока еще не обнаружил новых проблем. Если вы что то найдет пишите в комментариях постараюсь помочь.

  3. Александр пишет:

    Да, нашел!
    При существующей таблице tmp_PS скрипт на удаление этой таблицы генерируется дважды, причем второй раз до того как она используется:

    –1) первый раз!!! – Согласен!
    if exists (select 1
    from sysobjects
    where id = object_id(‘dbo.tmp_PS’)
    and type = ‘U’)
    drop table dbo.tmp_PS
    go

    –2) удаляем constraint-ы
    DECLARE @SqlText VARCHAR(200),
    @DF_Name VARCHAR(50)
    DECLARE C CURSOR
    FOR
    SELECT sobjects.name
    FROM sysobjects sobjects
    WHERE parent_obj = OBJECT_ID(‘PS’)
    AND sobjects.xtype = ‘D’
    OPEN C FETCH NEXT FROM c INTO @DF_Name
    WHILE @@fetch_status = 0
    BEGIN
    SET @SqlText = ‘alter table PS Drop constraint ‘ + @DF_Name
    PRINT @SqlText
    EXEC (@SqlText)
    FETCH NEXT FROM c INTO @DF_Name
    END
    CLOSE C
    DEALLOCATE C
    execute sp_rename PS, tmp_PS
    go

    –3) и второй раз (не в тему!), до того как создается таблица PS и копируются данные из tmp_PS:
    if exists (select 1
    from sysobjects
    where id = object_id(‘dbo.tmp_PS’)
    and type = ‘U’)
    drop table dbo.tmp_PS
    go

    /*===============*/
    /* 4) Table: PS */
    /*===============*/
    create table dbo.PS (
    ID_PS uniqueidentifier not null default newid(),
    ID_Sls uniqueidentifier null,
    ID_Psn int null,
    Column_4 varchar(10) null,
    constraint PK_PS primary key (ID_PS)
    on “PRIMARY”
    )
    on “PRIMARY”
    go

    –5) вставка
    insert into dbo.PS (ID_PS, ID_Sls, ID_Psn, Column_4)
    select ID_PS, ID_Sls, ID_Psn, Column_4
    from dbo.tmp_PS — а ее уже нет, и тут же вылетаем!..
    go
    ———————

    Если предварительно удалим таблицу tmp_PS руками, такой проблемы не возникает (пункт 3 – отсутствует!).

    Как от этого избавиться?
    Спасибо!

  4. Насколько я понял dbo.tmp_PS – это временная таблица куда временно копируются данные из основной перед ее пересозданием. Поскольку предпоалгается что база не содержит сременных таблиц, то уная програмка считает ее частью схему данных и пробует ее пересоздать, вот и пишет ее удаление еще раз. Если таблицы нет в базе то 3) ни сделает ничего плохого.

    Попробуйте выгрузить данные с использованием опции “Use alter statements when possible”. Думаю, что это вам поможет.

  5. Александр пишет:

    “Use alter statements when possible” – опция включена!
    Причем, если установить опцию “Drop temparary tables”, то добавляется пункт №6 аналогичный №1 – правильно!
    Но при существующей таблице tmp_PS, все равно сохраняется пункт №3 :(
    Думаю это можно вылечить, если найти где находится логика построения скрипта при изменении схемы данных. Где? – Пока не нашел!

  6. Александр, программа считает эту таблицу частью схемы даннх, потому и возникает такая коллизия, удалите ее и будет вам счастье.
    Database \ Edit Current DBMS
    ищите в папочках.
    MSSQLSRV2005::Script
    Там все скрипты для генерации схемы данных.
    Буду рад если вы сообщите о ваших изыканиях в комментариях.

  7. Buckie пишет:

    Thanks alot – your awensr solved all my problems after several days struggling

  8. Deacon пишет:

    This has made my day. I wish all potsigns were this good.

  9. hearing aids пишет:

    Great blog, how about links exchanging? Please contact me asap, Thanks.

  10. Flooniorgargy пишет:

    Thanks so much for giving everyone an update on this matter on your site.

  11. [...] и как редактировать можно прочитать в пред идущей статье, в которой также описано исправление ошибки [...]

  12. еще одно маленькое исправление скрипта дизайнера, которое поможет генерить скрипты, которые будут применяться к базе данных сразу.
    здесь

Leave a Reply