Firebird SQL: подзапрос в инструкции ALTER? - PullRequest
2 голосов
/ 17 июня 2011

У меня есть схема базы данных Firebird, которая была настроена различными CREATE TABLE сценариями. Эти сценарии были переданы в систему контроля версий (см. сайты Скотта Аллена ).

Теперь я хочу создать новый скрипт, в котором я хочу, чтобы моя база данных отбрасывала ограничение NOT NULL для одного столбца в определенной таблице:

ALTER TABLE myTable DROP CONSTRAINT c

Имя ограничения (например, INTEG_219) можно получить с помощью запроса к системной таблице:

SELECT rc.rdb$constraint_name
FROM   rdb$relation_constraints rc
       join rdb$check_constraints cc
       on rc.rdb$constraint_name = cc.rdb$constraint_name
WHERE  rc.rdb$constraint_type   = 'NOT NULL'
       and rc.rdb$relation_name = 'MYTABLE'
       and cc.rdb$trigger_name  = 'ACOLUMN'

Можно ли объединить эти операторы в одну команду ALTER?

Ответы [ 2 ]

6 голосов
/ 17 июня 2011

Я советую вам взглянуть на ИСПОЛНИТЕЛЬНОЕ ЗАЯВЛЕНИЕ .

и здесь в FAQ Firebird

execute BLOCK 
as declare variable stmt VARCHAR(2500) = 'SELECT ''ALTER TABLE MYTABLE myTable DROP CONSTRAINT ''|| rc.rdb$constraint_name||'';'' FROM   rdb$relation_constraints rc
           join rdb$check_constraints cc
           on rc.rdb$constraint_name = cc.rdb$constraint_name WHERE  rc.rdb$constraint_type   = ''NOT NULL''
           and rc.rdb$relation_name = ''MYTABLE''
           and cc.rdb$trigger_name  = ''ACOLUMN'''; 
begin   
  execute STATEMENT stmt; 
end;
0 голосов
/ 14 ноября 2013

Этот ответ основан на ответе Хьюза Ван Ландегема и ответа Норберта на этот ответ, так что не стесняйтесь его не голосовать :)

execute BLOCK 
as 
    declare variable stmt VARCHAR(2500); 
    declare variable cname varchar(255);
begin
    SELECT rc.rdb$constraint_name
        FROM   rdb$relation_constraints rc
               join rdb$check_constraints cc
               on rc.rdb$constraint_name = cc.rdb$constraint_name
        WHERE  rc.rdb$constraint_type   = 'NOT NULL'
               and rc.rdb$relation_name = 'MYTABLE'
               and cc.rdb$trigger_name  = 'ACOLUMN'
        INTO :cname;
    stmt = 'alter table myTable drop constraint ' || cname;
    execute STATEMENT stmt; 
end;

Я также использую Firebird 2.5 и не смог запустить оригинальный ответ Хьюза Ван Ландегема. Ошибка, которую я получил, была Не найдено сообщение для кода ошибки 335544928 , и я думаю, что это как-то связано со встроенным выбором.

...