Расположение каскадом удаляет в PostgreSQL

То, что вы смотрите, называется расстоянием редактирования, и вот приятное объяснение на wiki . Существует множество способов определения расстояния между двумя словами и желаемого, которое называется расстоянием Левенштейна, и здесь реализована реализация DP в python.

def levenshteinDistance(s1, s2):
    if len(s1) > len(s2):
        s1, s2 = s2, s1

    distances = range(len(s1) + 1)
    for i2, c2 in enumerate(s2):
        distances_ = [i2+1]
        for i1, c1 in enumerate(s1):
            if c1 == c2:
                distances_.append(distances[i1])
            else:
                distances_.append(1 + min((distances[i1], distances[i1 + 1], distances_[-1])))
        distances = distances_
    return distances[-1]

И пара больше реализаций здесь .

5
задан Fleury26 14 December 2017 в 15:03
поделиться

6 ответов

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

CREATE TABLE "header"
(
  header_id serial NOT NULL,
  CONSTRAINT header_pkey PRIMARY KEY (header_id)
);

CREATE TABLE detail
(
  header_id integer,
  stuff text,
  CONSTRAINT detail_header_id_fkey FOREIGN KEY (header_id)
      REFERENCES "header" (header_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);
insert into header values(1);
insert into detail values(1,'stuff');
delete from header where header_id=1;
alter table detail drop constraint detail_header_id_fkey;
alter table detail add constraint detail_header_id_fkey FOREIGN KEY (header_id)
      REFERENCES "header" (header_id) on delete cascade;
delete from header where header_id=1;
alter table detail add constraint detail_header_id_fkey FOREIGN KEY (header_id)
      REFERENCES "header" (header_id) on delete restrict;
4
ответ дан 14 December 2019 в 13:52
поделиться

Можно хотеть изучить использование схем с PostgreSQL. Я сделал это в прошлых проектах позволить различным группам людей или разработчиков иметь свои собственные данные. Затем можно использовать сценарии для создания нескольких копий базы данных для просто таких ситуаций.

0
ответ дан 14 December 2019 в 13:52
поделиться

Вы могли создать ограничения внешнего ключа как ДОПУСКАЮЩИЕ ЗАДЕРЖКУ. Затем Вы смогли бы временно отключить их, в то время как Вы вычищаете данные и повторно включаете им, когда Вы сделаны. Взгляните на этот вопрос.

1
ответ дан 14 December 2019 в 13:52
поделиться

@Tony: Нет, схемы могут быть полезными, и действительно, мы используем их для данных раздела в нашей базе данных. Но я говорю о попытке вычистить уязвимые данные прежде, чем позволить консультанту иметь копию дб. Я хочу те данные, которые уводят.

0
ответ дан 14 December 2019 в 13:52
поделиться

Я не думаю, что необходимо было бы обработать файл дампа как этот. Сделайте дамп/восстановление потоковой передачи и процесс это. Что-то как:

createdb -h scratchserver scratchdb
createdb -h scratchserver sanitizeddb

pg_dump -h liveserver livedb --schema-only | psql -h scratchserver sanitizeddb
pg_dump -h scratchserver sanitizeddb | sed -e "s/RESTRICT/CASCADE/" | psql -h scratchserver scratchdb

pg_dump -h liveserver livedb --data-only | psql -h scratchserver scratchdb
psql -h scrachserver scratchdb -f delete-sensitive.sql

pg_dump -h scratchserver scratchdb --data-only | psql -h scratchserver sanitizeddb
pg_dump -Fc -Z9 -h scratchserver sanitizedb > sanitizeddb.pgdump

где Вы храните, все Ваш УДАЛЯТЬ sqls в удаляют-sensitive.sql. sanitizeddb база данных/шаги может быть удалена, если Вы не возражаете, консультант, получающий дб с КАСКАДНЫМИ внешними ключами вместо, ОГРАНИЧИВАЮТ внешние ключи.

Могли бы также быть лучшие пути в зависимости от того, как часто необходимо сделать это, насколько большой база данных, и какой процент данных чувствителен, но я не могу думать о более простом способе сделать это несколько раз для довольно размерной базы данных. Вам была бы нужна другая база данных, в конце концов, поэтому если у Вас уже нет slony кластера, не может избежать цикла дампа/восстановления, который мог бы быть трудоемким.

0
ответ дан 14 December 2019 в 13:52
поделиться
TRUNCATE table CASCADE;

Я новичок в Postgres, поэтому я не уверен в компромиссе между TRUNCATE и DROP.

1
ответ дан 14 December 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: