Как удалить связь между таблицами sql oracle
Отношения — это установленные связи между двумя или более таблицами. Отношения основаны на общих полях из более чем одной таблицы, часто связанных с первичными и иностранными ключами.
Основным ключом является поле (или поля), которое используется для уникальной идентификации каждой записи в таблице. Для основного ключа существует три требования: он не может быть null, он должен быть уникальным, и в таблице может быть только одно. Основной ключ можно определить либо путем создания индекса основных ключевых элементов после создания таблицы, либо с помощью оговорки CONSTRAINT в декларации таблицы, как показано в примерах, ниже в этом разделе. Ограничение ограничивает (или ограничивает) значения, вступающие в поле.
Иностранный ключ — это поле (или поля) в одной таблице, которое ссылается на основной ключ в другой таблице. Данные в полях из обеих таблиц абсолютно одинаковы, а в таблице с основной записью ключей (основная таблица) должны быть существующие записи перед таблицей с записью иностранного ключа (иностранной таблицей) с соответствующими или связанными записями. Как и основные клавиши, в декларации таблицы можно определить внешние клавиши с помощью оговорки CONSTRAINT .
Существует по сути три типа отношений:
- Один к одному Для каждой записи в основной таблице в иностранной таблице имеется только одна запись.
- Один к многим Для каждой записи в основной таблице в иностранной таблице имеется одна или несколько связанных записей.
- Много-много Для каждой записи в основной таблице имеется много связанных записей в иностранной таблице, а для каждой записи в иностранной таблице имеется много связанных записей в основной таблице.
Например, предположим, что вы хотите добавить таблицу счетов в базу данных счетов. Каждый клиент в таблице клиентов может иметь множество счетов-фактур , это классический сценарий. Вы можете взять основной ключ из таблицы клиентов и определить его как иностранный ключ в таблице счетов, тем самым устанавливая правильную связь между таблицами.
При определении связей между таблицами необходимо сделать объявления CONSTRAINT на уровне поля. Это означает, что ограничения определяются в заявлении CREATE TABLE . Чтобы применить ограничения, используйте ключевое слово CONSTRAINT после объявления поля, назови ограничение, назови таблицу, на которую ссылается, и назови поле или поля в этой таблице, которые будут соответствовать иностранному ключу.
В следующем заявлении предполагается, что таблица tblCustomers уже построена и что она имеет основной ключ, определенный в поле CustomerID. Теперь в заявлении создается таблица tblInvoices, определяющая ее основной ключ в поле InvoiceID. Кроме того, создается связь между таблицами tblCustomers и tblInvoices, определяя другое поле CustomerID в таблице tblInvoices. Это поле определяется как иностранный ключ, который ссылается на поле CustomerID в таблице клиентов. Обратите внимание, что имя каждого ограничения следует ключевому слову CONSTRAINT .
Обратите внимание, что основной индекс ключа (PK_InvoiceID) для таблицы счетов объявляется в заявлении CREATE TABLE . Чтобы повысить производительность основного ключа, для него автоматически создается индекс, поэтому нет необходимости использовать отдельное заявление CREATE INDEX . Теперь создайте таблицу доставки, которая будет содержать адрес доставки каждого клиента. Предположим, что для каждой записи клиента будет иметься только одна запись доставки, поэтому вы будете устанавливать отношения один к одному.
Обратите внимание, что поле CustomerID является как основным ключом для таблицы доставки, так и ссылкой на иностранный ключ в таблице клиентов.
Ограничения
Ограничения можно использовать для создания основных ключей и целостности ссылок, а также для ограничения значений, которые можно вставить в поле. В общем, ограничения можно использовать для сохранения целостности и согласованности данных в базе данных.
Существует два типа ограничений: ограничение на уровне одного поля или поля и ограничение на уровне нескольких полей или таблиц. Оба типа ограничений можно использовать в заявлении CREATE TABLE или ALTER TABLE .
Ограничение на одно поле, также известное как ограничение на уровне столбцов, объявляется с самим полем после того, как было объявлено поле и тип данных. Используйте таблицу клиентов и создайте основной ключ с одним полем в поле CustomerID. Чтобы добавить ограничение, используйте ключевое слово CONSTRAINT с именем поля.
Обратите внимание, что имя ограничения дано. Можно использовать ярлык для объявления основного ключа, полностью отметаемого в пункте CONSTRAINT .
Однако использование метода ярлыка приведет к случайному сгенерировать имя ограничения, что затруднит ссылку в коде. Всегда стоит назвать ограничения.
Чтобы снять ограничение, используйте пункт DROP CONSTRAINT с заявлением ALTER TABLE и укай имя ограничения.
Ограничения также могут использоваться для ограничения допустимых значений для поля. Можно ограничить значения NOT NULL или UNIQUE или определить ограничение проверки, которое является типом бизнес-правила, которое можно применить к полю. Предположим, что необходимо ограничить (или ограничить) значения полей имени и фамилии уникальными, что означает, что никогда не должно быть сочетания имени и фамилии, одинаковой для любых двух записей в таблице. Поскольку это ограничение с несколькими полями, оно объявляется на уровне таблицы, а не на уровне поля. Используйте пункт ADD CONSTRAINT и определите список с несколькими полями.
Ограничение проверки — это мощная SQL, которая позволяет добавлять проверку данных в таблицу, создавая выражение, которое может ссылаться на одно поле или несколько полей в одном или нескольких таблицах. Предположим, что необходимо убедиться, что суммы, вписаные в запись счетов, всегда больше $ 0,00. Для этого используйте ограничение проверки, объявив ключевое слово CHECK и выражение проверки в пункте ADD CONSTRAINT из заявления ALTER TABLE .
Выражение, используемое для определения ограничения проверки, также может относиться к более чем одному полю в одной таблице или к полям в других таблицах и может использовать любые операции, допустимые в Access SQL, такие как операторы SELECT, математические операторы и агрегированные функции. Выражение, определяющие ограничение проверки, может быть не более 64 символов.
Предположим, что необходимо проверить кредитный лимит каждого клиента, прежде чем он будет добавлен в таблицу клиентов. Используя заявление ALTER TABLE с оговорками ADD COLUMN и CONSTRAINT , создайте ограничение, которое будет проверять значение в таблице CreditLimit для проверки кредитного лимита клиента. Используйте следующие SQL для создания таблицы tblCreditLimit, добавьте поле CustomerLimit в таблицу tblCustomers, добавьте ограничение проверки в таблицу tblCustomers и проверьте ограничение проверки.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Надеюсь из прошлых, почти полностью теоретических, изложений стало немного яснее, что же все-таки есть реляционные данные и все, что с ними связано. Давайте сейчас попробуем просмотреть все это практически. Наша с вами учебная БД в схеме miller содержит, пять таблиц. Все они в принципе отвечают требованиям 3НФ. Но, когда я их создавал, я не связал столбцы этих таблиц между собой с помощью стандартных средств. А, вот сейчас давайте мы с вами это сделаем. Итак для примера организуем связь, которая чаше всего рекомендована к применению, типа один-ко-многим. Ярким примером для построения такой связи служит две из наших пяти таблиц это CUSTOMERS и SALESREPS. Оператор CREATE TABLE их DDL определений записан следующим образом:
Таблица CUSTOMERS:
Таблица SALESREPS:
При просмотре данных, этих таблиц почти сразу видно, что столбец таблицы SALESREPS - EMPL_NUM есть отношение один-ко-многим столбца CUST_REP для таблицы CUSTOMERS. Для определения связи между таблицами воспользуемся оператором ALTER TABLE и запишем вот такую конструкцию:
Все, связь между столбцами таблиц установлена! Все достаточно просто. Теперь действует ограничение ссылочной целостности и нарушить его нам с вами не позволят! Можно убедиться в этом. Столбец таблицы SALESREPS - EMPL_NUM содержит следующее множество значений 101 .. 110 и отдельно 120. Попробуйте что-нибудь вроде:
После ввода, получаем:
Естественно ошибка ORA-02291! А все потому, что множество 101 .. 110 и отдельно 120 не содержит числа 150! И по этому в данном случае не допустимо! Вот и получилось жесткое отношение один-ко-многим! Так же, можно и удалить связь, между столбцами таблиц применив оператор DROP. Но, нужно узнать имя ссылочной целостности в системе. Сейчас мы его знаем благодаря ошибке. А что если, в процессе работы нужно удалить ссылочную целостность, а потом снова восстановить ее! Для этого обратимся к представлению в вашей схеме USER_CONSTRAINTS. Оно содержит все имена ваших ограничений. Дадим такой запрос:
Там где поле CONSTRAINT_TYPE содержит значение R и есть наше ограничение (по моему от REFERENCES, точно не помню!) Получаем имя ограничения - SYS_C003548 (тоже номер был и в ошибке помните?). Вот теперь давайте от него избавимся:
Вот теперь ограничение снято. Повторим наш предыдущий запрос и посмотрим, что содержит USER_CONSTRAINTS сейчас:
Хорошо видно, что осталось только ограничение первичного ключа таблицы CUSTOMERS имеющее имя SYS_C003506. Кроме того, таблица может содержать ограничение на саму себя например все с той же таблицей SALESREPS можно проделать следующее:
Теперь таблица, как бы это лучше сказать - "самоограничилась", хотя это не всегда оправдано, но вполне применимо и может использоваться! Можете сами с этим всем поработать и определить приоритеты, при проектировании БД, оптимизации и определении ссылочных целостностей таблиц! Но, слишком не увлекайтесь, границы сознания не бесконечны и не стоит выходить за границы понимания, а уж во всяком случае выпускать за них свою БД. :)
В этом учебном пособии вы узнаете, как удалять внешний ключа в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
После создания foreign key, вам может быть понадобится удалить foreign key из таблицы. Вы можете сделать это с помощью оператора ALTER TABLE в SQL Server (Transact-SQL).
Синтаксис
Синтаксис удаления внешнего ключа в SQL Server (Transact-SQL):
Параметры или аргументы
table_name — имя таблицы, в которой был создан внешний ключ.
fk_name — имя внешнего ключа, который вы хотите удалить.
Пример
Рассмотрим пример того, как удалить внешний ключ в SQL Server (Transact-SQL).
Например, если вы создали внешний ключ следующим образом:
В этом примере внешнего ключа мы создали родительскую таблицу products . Таблица products имеет первичный ключ, который состоит из поля product_id .
Затем мы создали вторую таблицу под названием inventory , которая в этом примере внешнего ключа будет дочерней таблицей. Мы использовали оператор CREATE TABLE для создания внешнего ключа fk_inv_product_id в таблице inventory . Внешний ключ устанавливает связь между столбцом product_id в таблице inventory и столбцом product_id в таблице products .
Если необходимо удалить внешний ключ с наименованием fk_inv_product_id , то нужно выполнить следующую команду:
SQL FOREIGN KEY Ограничение
Внешний ключ — это ключ, используемый для связывания двух таблиц друг с другом.
Внешний ключ — это поле (или набор полей) в одной таблице, ссылающееся на первичный ключ в другой таблице.
Таблица, содержащая внешний ключ, называется дочерней таблицей, а таблица, содержащая выбранный ключ, называется ссылочной или родительской таблицей.
Посмотрите на следующие две таблицы:
PersonID | LastName | FirstName | Age |
---|---|---|---|
1 | Hansen | Ola | 30 |
2 | Svendson | Tove | 23 |
3 | Pettersen | Kari | 20 |
OrderID | OrderNumber | PersonID |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 2 |
4 | 24562 | 1 |
Обратите внимание, что столбец "PersonID" в таблице "Orders" указывает на столбец "PersonID" в таблице "лица".
Столбец "PersonID" в таблице "лица" является первичным ключом в таблице "лица".
Столбец "PersonID" в таблице "Orders" является внешним ключом в таблице "Orders".
Ограничение внешнего ключа используется для предотвращения действий, которые уничтожают связи между таблицами.
Ограничение внешнего ключа также предотвращает вставку недопустимых данных в столбец внешнего ключа, поскольку он должен быть одним из значений, содержащихся в таблице, на которую он указывает.
SQL внешний ключ при создании таблицы
Следующий SQL создает внешний ключ в столбце "PersonID" при создании таблицы "Orders":
SQL Server / Oracle / MS Access:
Чтобы разрешить именование ограничения внешнего ключа и для определения ограничения внешнего ключа для нескольких столбцов, используйте следующий синтаксис SQL:
MySQL / SQL Server / Oracle / MS Access:
Внешний ключ SQL при изменении таблицы
Чтобы создать ограничение внешнего ключа в столбце "PersonID", когда таблица "Orders" уже создана, используйте следующий код SQL:
MySQL / SQL Server / Oracle / MS Access:
Чтобы разрешить именование ограничения внешнего ключа и для определения ограничения внешнего ключа для нескольких столбцов, используйте следующий синтаксис SQL:
SQL Ограничение внешнего ключа
FOREIGN KEY — это ключ, используемый для соединения двух таблиц вместе.
FOREIGN KEY — это поле (или набор полей) в одной таблице, которое ссылается на первичный ключ в другой таблице.
Таблица, содержащая внешний ключ, называется дочерней таблицей, а таблица, содержащая ключ кандидат, называется ссылочной или родительской таблицей.
Посмотрите на следующие две таблицы:
PersonID | LastName | FirstName | Age |
---|---|---|---|
1 | Hansen | Ola | 30 |
2 | Svendson | Tove | 23 |
3 | Pettersen | Kari | 20 |
OrderID | OrderNumber | PersonID |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 2 |
4 | 24562 | 1 |
Обратите внимание, что столбец "PersonID" в таблице "Orders" указывает на столбец "PersonID" в таблице "Persons".
Столбец "PersonID" в таблице "Persons" является первичным ключом в таблице "Persons".
Столбец "PersonID" в таблице "Orders" является внешним ключом в таблице "Orders".
Ограничение внешнего ключа используется для предотвращения действий, которые могут привести к разрушению связей между таблицами.
Ограничение внешнего ключа также предотвращает вставку недопустимых данных в столбец внешнего ключа, поскольку это должно быть одно из значений, содержащихся в таблице, на которую он указывает.
SQL FOREIGN KEY в CREATE TABLE
Следующий SQL создает внешний ключ в столбце "PersonID" при создании таблицы "Orders":
SQL Server / Oracle / MS Access:
Чтобы разрешить именование ограничения внешнего ключа и определить ограничение внешнего ключа для нескольких столбцов, используйте следующий синтаксис SQL:
MySQL / SQL Server / Oracle / MS Access:
SQL FOREIGN KEY в ALTER TABLE
Чтобы создать ограничение внешнего ключа для столбца "PersonID", когда таблица "Orders" уже создана, используйте следующий SQL:
MySQL / SQL Server / Oracle / MS Access:
Чтобы разрешить именование ограничения внешнего ключа и определить ограничение внешнего ключа для нескольких столбцов, используйте следующий синтаксис SQL:
Система управления базами данных SQLite. Изучаем язык запросов SQL и реляционные базы данных на примере библиотекой SQLite3. Курс для начинающих.
Часть 11.6: Каскадное удаления данных в базах данных SQLite
- 27.06.2016
- SQLite библиотека, Базы данных
- 5 комментариев
Каскадное удаления данных в базах данных SQLite
Из этой записи вы узнаете для чего нужно каскадное удаление данных в реляционных базах данных и, как каскадное удаление облегчает жизнь разработчику. И увидите пример работы каскадного удаления данных из базы данных под управлением SQLite в таблицах, связанных связью многие ко многим, в общем, увидите в действие конструкцию ON DELETE CASCADE.
Каскадное удаление данных из базы данных SQLite
Мы уже рассмотрели всевозможные способы обеспечения целостности данных в базах данных под управлением SQLite. Успели разобраться с ограничениями уровня столбца и ограничениями уровня таблицы и чуть ранее рассмотрели каскадное обновление данных. Теперь перейдем к каскадному удалению данных в базах данных SQLite3.
При реализации связей между таблицами при помощи внешнего ключа или FOREIGN KEY мы сталкиваемся с такой проблемой: для удаления данных из таблиц базы данных нам необходимо выполнить две команды DELETE: сперва нужно удалить данные из таблицы справочника, а затем удалить строку из таблицы, которая ссылается на справочник. В противном случае SQLite скажет, что было нарушено ограничение внешнего ключа и не даст удалить данные.
Чтобы избежать такой проблемы и не писать лишние SQL запросы в SQLite было реализовано каскадное удаление данных из таблиц, при каскадном удаление данных мы не пишем лишний SQL запрос DELETE, а также гарантируем себе то, что целостность данных в базах данных не будет нарушена.
Операция каскадного удаления данных реализуется при помощи ключевой фразы ON DELETE CASCADE. Фраза ON DELETE CASCADE говорит SQLite о том, что сперва нужно удалить данные из справочника или домена данных, а затем данные нужно удалять из таблицы, которая ссылается на этот справочник.
Чтобы реализовать каскадное удаление данных из таблицы базы данных, нужно записать правило ON DELETE сразу после FOREIGN KEY, тогда SQLite начнет «понимать», что при удалении данных из справочника, ей нужно удалять и данные из связанных таблиц.
Давайте реализуем пример связи многие ко многим и посмотрим, как происходит каскадное удаление данных из базы данных SQLite3 и поймем, как работает конструкция ON DELETE CASCADE.
Примеры каскадного удаления данных из базе данных SQLite. ON DELETE в SQLite3
Чтобы посмотреть, как удалить данные каскадом, давайте создадим три таблицы в базе данных, которые будут связаны связью многие ко многим, воспользуемся командой CREATE:
Как сделать каскадное обновление и удаление sql
Список отделов
и
Список сотрудников
я их связал как видно выше через
а что еще нужно дописать чтобы добавить Каскадное удаление связанных записей и каскадное обновление
Дописать к констрейнту ON DELETE CASCADE
и каскадное обновление
так нужно или оно автоматом по умолчанию ставиться?
Сам недавно столкнулся.
Есть асинхронная репликация между двумя базами. Репликация типа мультимастер.
Предположим есть таблица t(id number, field varchar2(250)).
id — первичный суррогатный ключ.
field — уникальный бизнес-ключ.
Возникает конфликт: заводится 2 записи с одним и тем же уникальным бизнес-ключом. На первый взгляд, очевидное разрешение данного конфликта: выбираем одну запись, у второй обновляем суррогатный ключ на это значение, каскадно обновляем все внешние ключи.
наверно в допустимости такого варианта
наверно в допустимости такого варианта
наверно в допустимости такого варианта
Не очень понял. Как этого можно недопустить в моем примере? Имелось ввиду, записи заводятся на двух разных базах.
Это элементарно, Ватсон. В нормальных системах — просто не может возникнуть две записи (в т.ч. и на разных мастерах, даже изначально находящихся в глубоком offline по отношению друг другу) с одним и тем же значением первичного ключа (тем более суррогатным).
Достигается это, как правило за счет:
— или каждый мастер имеет строго свой диапазон значений PK (как вариант — сиквенс ограничивается сверзу и снизу)
— или в первичный ключ — конкатенируется ID мастера, на котором эта запись возникла
А случай же, когда каким то хреном (по причине дизайна) появилось две абсолютно не связанные между собой сущности, но с одним и тем же значением PK — это случай не PK, а UK (unique key).
К примеру — появилось два контрагента с одним и тем же INN и разными ID. По логике вещей (с т.з. холдинга) одному из отделений нужно явно сделать замену ID клиента на договоре (и нигде, кстате, кроме). Но, кстати, не факт ;)) (Говоря проще, сей операций "объединения" CLIENT_ID можно сделать и потом).
Следовательно — переделывать схему, в срочном порядке (впрочем, прыгание через репликатор-грабли — это совсем отдельная школа дизайна трамплинов)
Вы невнимательно читали мой пример там было заводится 2 записи с одним и тем же уникальным бизнес-ключом. Про дублирование первичного ключа речь не шла. Это и есть то, что Вы описали далее.
Я остановился на варианте с сиквенсом начинающимся с разных значений, increment by 100
Это типичный пример кривого дизайна. На контагента (юридическое или физическое лицо) может ссылаться только. кхм, договор (даже если его нет — пусть это будет фиктивный, разовый договор).
Т.е. та самая форма взаимоотношений, которая есть в реальной природе (Предприятие (мы в виде кучи отделений) многие ко многим на юрлица через договор, общий договор для всех отделений — есть нонсенс).
Все документы вяжутся только на договор. Нужно сделать "объединение" юр. лиц — мы только правим CLIENT_ID на редакции договора, и все).
Т.е. суть конфликтов в репликациях — алогична по своей сути (в реальной жизни таких ситуаций не бывает, а если и бывают — то крайне редко они бывают актуальны, даже в случаях дублированных контагентов это может быть проблемой только для юриста, который будет собирать исковые документы по банкроту, сидя в головной конторе. а всем остальным — как правило, до лампочки, сколько будет ИНН дубликатов).
Это типичный пример кривого дизайна. На контагента (юридическое или физическое лицо) может ссылаться только. кхм, договор (даже если его нет — пусть это будет фиктивный, разовый договор).
Т.е. та самая форма взаимоотношений, которая есть в реальной природе (Предприятие (мы в виде кучи отделений) многие ко многим на юрлица через договор, общий договор для всех отделений — есть нонсенс).
Все документы вяжутся только на договор. Нужно сделать "объединение" юр. лиц — мы только правим CLIENT_ID на редакции договора, и все).
Про кривой дизайн какой-то порожняк. Почему по договору не может быть несколько контактных лиц? Есть contract. У него есть id. Есть, пусть будет, Contract_person — контактные лица по контракту. В contract_person есть внешний ключ contract_id. Пример абстрактный, но что не так?
Кроме того, я что то не понял. Форинкей на уникей постоить нельзя по определению, т.е. каскадное удаление и обновление вообще теряет смысл (и даже не IMHO).
Что-то меня не понимают. Попробую чуть подробнее и ближе к жизни. В синтаксисе могу ошибиться.
Есть две таблицы
terminal( — информация о терминале
terminal_id number, — суррогатный первичный ключ.
terminal_num varchar2(100), — уникальный бизнес-номер терминала
constraint pk_terminal primary key(terminal_id),
constraint uk_terminal unique key(terminal_num)
)
terminal_comission(— информация о ставке комиссии терминала
terminal_id number,
from_date date,
comission number,
constraint fk_terminal_comission foreign key(terminal_id) referenced terminal(terminal_id))
Где я говорил про контактных лиц? По договору есть лица — контрагенты. Либо юридические, либо юридические и физические, как правило два лица, но может быть и три (четырехсторонние договора — не встречал)
Даже в этом случае у тебя кривой дизайн. Физическое лицо (человек, хомо сапиенс) — это совсем отдельная сучность, с уникеем вроде № (серия) паспорта (и то — не факт 😉
Ну дык вот, даже в договоре — участвует не сколько контактное лицо как физическое лицо, а контактное лицо — как должностная единица (если там, конечно, есть контактные лица как таковые, в приложении). А должностная единица, по определению, не может висеть на нескольких юридических лицах одновременно (даже если ИНН у них один). При том, что один хомо сапиенс — может быть представлен в виде нескольких должностных лиц (даже в одном предприятии).
Другой вопрос — надо ли оно (вести еще единую базу физ.лиц как таковых, в т.ч. отслеживать в ней уникальность).
Что-то меня не понимают. Попробую чуть подробнее и ближе к жизни. В синтаксисе могу ошибиться.
Есть две таблицы
terminal( — информация о терминале
terminal_id number, — суррогатный первичный ключ.
terminal_num varchar2(100), — уникальный бизнес-номер терминала
constraint pk_terminal primary key(terminal_id),
constraint uk_terminal unique key(terminal_num)
)
terminal_comission(— информация о ставке комиссии терминала
terminal_id number,
from_date date,
comission number,
constraint fk_terminal_comission foreign key(terminal_id) referenced terminal(terminal_id))
Есть 2 базы, для которых настроена асинхронная репликация. У обоих баз есть GUI. 2 пользователя на разных базах одновременно заводят терминал с одним и тем же бизнес-номером (terminal_num), terminal_id на базах получился разным. При синхронизации получился конфликт. Оставлять на обоих базах 2 терминала с одним и тем же бизнес-номером нехорошо, например, неудобно будет менять ставку комиссии. На мой взгляд, в этом случае логично было взять terminal_id с одной базы, на другой базе изменить terminal_id на это значение, каскадно обновить terminal_comission.terminal_id.
Бред какой то. Во первых, с какого бодуна дважды завели терминал с одним и тем же бизнес-номером? Если на то пошло, то базу терминалов должен вести кто-то один, централизованно, а не все, кому не лень.
Говоря проще — регистрация бизнес-терминалов (в реальной, живой ситуации?) — это вообще чья ответственность? Вот он и должен заводить, и всем рассылать.
Более того, даже если настроена такая идея фикс, что в центральном офисе кто то отслеживает отдельно дубликаты юридических и физических лиц (возможность дублирования есть, в силу того, что Пупкин И.А. как скоростной метеор успевает засветиться во всех отделениях одновременно), то такая ситуация — ну никак не отвественность CASCADE UPDATE на уровне DDL/DML.
По сути — должен быть совсем отдельный блок (как правило процедура в пакете) — которому централизованно и осмысленно (кем то) рассылается (в отделения) команда — заменить ID-такой то на ID-такой то. Она уже и отрабатывает данные моменты.
Вопрос только в том, что подобные вещи должны быть вынесены в строго ассоциативно/описательные сущности (как правило, строго локализованные, и не расползающиеся по базе данных, и особенно — боже упаси, в состав избыточно конктатенированных ключей/полей и прочего подобного).
По сути — это изменение должно быть простым, тривиальным, и никого ни на что не обязывающим (по сути — пара-тройка UPDATE, не более того).
Т.е. в случае выше — решили "объединить" клиентов — сверили (визуально) ИНН-ы, наименования, адреса (кстати) и прочие моменты, и только потом — поставили в рассылку команду объединения.
Аналогично — с физ. лицами.
Потому что может быть банальная и очень распостраненная ситуация — оператор, бедолага, в похмельном синдроме (к примеру) — просто ошибётся в одном номере (уникея). А твоя чудо мегасистем с "ахтоматическим" разрешением конфликтов — тупо сьест данный факт, и фактически — поломает нахрен базу данных во всех отделениях.
Говоря проще — регистрация бизнес-терминалов (в реальной, живой ситуации?) — это вообще чья ответственность? Вот он и должен заводить, и всем рассылать.
Попробуем про терминалы. Практически из жизни. Есть 2 базы: А и Б. На базе А завели терминал, база А упала, на базу Б он не успел реплицироваться. Работать надо продолжать, его заводят на базе Б. После подъема базы А возникает конфликт.
Еще раз для танкистов. Во первых — это не отделения дело, заводить ГЛОБАЛЬНЫЕ справочники.
Если есть вероятность, что этот терминал — чисто их отвественность — тогда пожалуйста (если никому тот терминал больше не нужен).
А во вторых — ты (считая разумным) — уверен, что "тетя Дуня", вместо того, чтобы ввести "12344" не ввела "12443", который уже присутствует на другой базе?
Еще раз для танкистов. Во первых — это не отделения дело, заводить ГЛОБАЛЬНЫЕ справочники.
Если есть вероятность, что этот терминал — чисто их отвественность — тогда пожалуйста (если никому тот терминал больше не нужен).
А во вторых — ты (считая разумным) — уверен, что "тетя Дуня", вместо того, чтобы ввести "12344" не ввела "12443", который уже присутствует на другой базе?
Как использовать каскадное удаление с SQL Server?
У меня есть 2 таблицы: T1 и T2, это существующие таблицы с данными. У нас есть отношения один ко многим между T1 и T2. Как изменить определения таблиц для выполнения каскадного удаления в SQL Server, когда запись из T1 удаляется, все связанные записи в T2 также удаляются.
Между ними существует внешнее ограничение. Я не хочу удалять таблицы или создавать триггер для удаления T2. Например, когда я удаляю сотрудника, все записи проверок тоже должны быть удалены.
T2 — обзоры производительности,
Вам нужно будет,
- Удалить существующее ограничение внешнего ключа,
- Добавьте новый с ON DELETE CASCADE включенной настройкой.
Чтобы добавить «Каскадное удаление» к существующему внешнему ключу в SQL Server Management Studio:
Сначала выберите ваш внешний ключ и откройте его «DROP and Create To ..» в новом окне запроса.
Затем просто добавьте ON DELETE CASCADE в ADD CONSTRAINT команду:
И нажмите кнопку «Выполнить», чтобы выполнить этот запрос.
Кстати, чтобы получить список ваших внешних ключей и увидеть, в каких из них включена функция «Каскадное удаление», вы можете запустить этот скрипт:
И если вы когда-нибудь обнаружите, что не можете DROP конкретную таблицу из-за ограничения внешнего ключа, но не можете определить, какой FK вызывает проблему, вы можете выполнить эту команду:
SQL в этой статье перечисляет все FK, которые ссылаются на конкретную таблицу.
Удалить таблицу из базы данных в SQL Server можно с помощью среды SQL Server Management Studio или Transact-SQL.
Каждое удаление таблицы следует тщательно планировать. Если на таблицу ссылаются существующие запросы, представления, определяемые пользователем функции, хранимые процедуры или программы, то удаление сделает эти объекты недействительными.
В этом разделе
Перед началом работы
Удаление таблицы с помощью следующих средств:
Перед началом
Ограничения
Инструкцию DROP TABLE нельзя использовать для удаления таблицы, на которую ссылается ограничение FOREIGN KEY. Сначала следует удалить ссылающееся ограничение FOREIGN KEY или ссылающуюся таблицу. Если и ссылающаяся таблица, и таблица, содержащая первичный ключ, удаляются с помощью одной инструкции DROP TABLE, ссылающаяся таблица должна быть первой в списке.
При удалении таблицы относящиеся к ней правила и значения по умолчанию теряют привязку, а любые связанные с таблицей ограничения или триггеры автоматически удаляются. Если таблица будет создана заново, нужно будет заново привязать все правила и значения по умолчанию, заново создать триггеры и добавить необходимые ограничения.
При удалении таблицы, которая содержит столбец varbinary (max) с атрибутом FILESTREAM, не будут удалены никакие данные, которые хранятся в файловой системе.
Инструкции DROP TABLE и CREATE TABLE нельзя выполнять для одной таблицы в одном пакете. В противном случае может произойти непредвиденная ошибка.
Любые представления или хранимые процедуры, которые ссылаются на удаляемую таблицу, необходимо явно удалить или изменить, чтобы убрать ссылку на таблицу.
безопасность
Permissions
Необходимо разрешение ALTER на схему, к которой принадлежит эта таблица, разрешение CONTROL для этой таблицы или членство в предопределенной роли базы данных db_ddladmin .
Использование среды SQL Server Management Studio
Удаление таблицы из базы данных
В обозревателе объектов выберите таблицу, которую необходимо удалить.
Щелкните таблицу правой кнопкой мыши и в контекстном меню выберите Удалить .
При удалении таблицы автоматически удаляются все связи с ней.
Использование Transact-SQL
Удаление таблицы в редакторе запросов
В обозревателе объектов подключитесь к экземпляру компонента Компонент Database Engine.
На стандартной панели выберите пункт Создать запрос.
Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить.
Читайте также: