вставка в представление в SQL-сервере - PullRequest
1 голос
/ 27 августа 2009

У меня SQL-сервер в качестве бэкэнда и я использую ms-доступ в качестве внешнего интерфейса.

У меня есть две таблицы (persons и managers), manager получено из persons (отношение 1: 1), таким образом, я создал представление managersFull, которое в основном:

    SELECT *
      FROM `managers` `m`
INNER JOIN `persons` `p`
        ON `m`.`id` = `p`.`id`

id в persons - автоинкремент, а первичный ключ, id в managers - первичный ключ и внешний ключ, ссылающийся на persons. id

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

Я говорю о managers форме, и я хочу иметь возможность одновременно вводить информацию о менеджере и персонале в одной форме

мой вопрос сейчас: возможно ли то, что я хочу сделать здесь? если нет, есть ли «простой» обходной путь, использующий триггеры вставки после вставки или несколько строк кода vba?

заранее спасибо

Ответы [ 4 ]

2 голосов
/ 27 августа 2009

Проблема в том, что вы просматриваете несколько таблиц. Если вы обращаетесь к нескольким таблицам, вы можете обновить или вставить только одну из них.

Также проверьте MSDN для получения более подробной информации об ограничениях и правильных стратегиях для просмотра обновлений

1 голос
/ 28 августа 2009

Принимая во внимание ODBC, нужно учесть несколько вещей:

  1. убедитесь, что у вас есть поле метки времени в таблице персон, и что оно возвращается в вашем представлении менеджеров. Вам также, вероятно, понадобится настоящий PK таблицы person в представлении менеджера (я предполагаю, что ваше представление берет FK, использованный для самостоятельного объединения, и называет его псевдонимом в качестве поля идентификатора - я бы сам этого не делал, так как Это сбивает с толку. Вместо этого я бы использовал реальное имя внешнего ключа в представлении менеджеров и оставил бы PK самостоятельно с его настоящим именем).

  2. попробуйте предикат DISTINCTROW для Jet / ACE в своем источнике записей. С помощью Jet / ACE это часто позволяет вставить в обе таблицы, когда это невозможно. Я не знаю наверняка, будет ли Jet достаточно умным, чтобы заставить SQL Server поступать правильно.

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

0 голосов
/ 30 августа 2009

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

Так что не используйте объединенную таблицу здесь. Просто воспользуйтесь настройкой формы + подформы, и вы сможете редактировать и поддерживать данные и данные в связанной дочерней таблице.

Это означает, что вы основываете форму на таблице, а не на представлении. И вы основываете форму на дочернем столе. Так что не используйте вид здесь.

0 голосов
/ 27 августа 2009

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

...