Базы данных допускают неверные внешние ключи от Rails Fixtures - PullRequest
1 голос
/ 13 августа 2010

Я использую Rails Fixtures для загрузки некоторых тестовых данных в свою базу данных и случайно ввел внешний ключ вне диапазона.

К моему удивлению, база данных приняла его, несмотря на наличие ограничений ссылочной целостности (это работает).Я пытался с PostgreSQL и MySQL InnoDB, и оба позволили.

Пример:

Наличие в базе данных «Flavors» с числовым первичным ключом (id) 5 записей (от 1 до 5).Я могу ввести неверные данные, выполнив:

Icecream_1: имя: мое мороженое flavour_id: 6

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

Спасибо.


Вот две таблицы.Имея 200 user_types (поддельные данные), я смог представить пользователя с user_type_id 201, но только из приборов, pgAdmin запрещает это.

CREATE SEQUENCE user_types_id_seq;
CREATE TABLE user_types (
id SMALLINT
  NOT NULL
  DEFAULT NEXTVAL('user_types_id_seq'),
name VARCHAR(45) 
  NOT NULL 
  UNIQUE,
PRIMARY KEY (id));

CREATE SEQUENCE users_id_seq;
CREATE TABLE users (
id BIGINT
    NOT NULL
    DEFAULT NEXTVAL('users_id_seq'),
user_type_id SMALLINT
    NOT NULL
    REFERENCES user_types (id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (id));


---------

Fixture

<% for i in (1..201) %>

user_<%= i %>:
    id: <%= i %>
    user_type_id: <%= i %>
<% end %>

И, как я уже сказал, и innoDb, и postgresql приняли плохой ключ.

Спасибо

Ответы [ 4 ]

1 голос
/ 13 августа 2010

PostgreSQL не принимает поврежденные данные, не волнуйтесь.В MySQL все зависит от движка (должен быть innoDB) и настроек (соединения) для параметра foreign_key_checks.

Как выглядят ваши таблицы и ограничения?Проверьте pgAdmin (или какой-либо другой клиент) и сбросьте здесь соответствующий кусок модели данных, чем мы можем вам помочь.

pgAdmin запрещает это.

Нет, вашБаза данных PostgreSQL запрещает это.pgAdmin - это просто клиент, и он только отправляет запрос в базу данных.База данных делает некоторые проверки, FK был нарушен и возвращает ошибку.

Похоже, вы работаете с неправильной базой данных (нет FK или MySQL с неверным механизмом и / или настройками), PostgreSQL работает нормально, еслиФК.

0 голосов
/ 13 августа 2010

Спасибо всем за ответы.

Кто-то на форуме ruby ​​понял это.Похоже, что триггеры, которые обеспечивают RI, отключены до загрузки приборов.

Я не знаю почему, но это решает тайну.

0 голосов
/ 13 августа 2010

Проверьте определения таблиц в вашей тестовой базе данных. IIRC, "rake db: test: prepare" не поддерживает точность при создании таблиц в тестовой базе данных.

0 голосов
/ 13 августа 2010

Я согласен с Фрэнком.Ваша тестовая база данных для PostgreSQL, скорее всего, настроена неправильно.Вы либо забыли создать ограничения FK, либо отключили их.

Тот факт, что вы получили ошибку в pgAdmin, указывает на то, что вы работаете с другой базой данных из pgAdmin и вашего тестового скрипта.

Что касается MySQL, я бы искалневерный механизм по умолчанию в тестовой базе данных или если вы также забыли создать ограничения FK (обратите внимание, что вы не получите ошибку, если создадите ограничение FK с механизмом, который не поддерживает ссылочную целостность в MySQL)

...