Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как отключить проверку внешних ключей при создании базы? / 18 сообщений из 18, страница 1 из 1
25.12.2019, 17:05
    #39907973
VinniL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Добрый день!
Просьба дать совет.
Как отключить проверку внешних ключей на всю базу?

Есть скрипт создании базы с 30 таблицами с огромной кучей внешних ключей.
При создании первой таблицы ключ ссылается на еще не созданную, и выдает ошибку, и так 30 раз. Хочу отключить эту проверку, чтобы создать все таблицы. А потом включить снова.


Заранее благодарю!
...
Рейтинг: 0 / 0
25.12.2019, 17:20
    #39907983
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
VinniL,

Сгенерировать скрипт и выполнить (все делать на нужной базе)

генерация скрипта на выключение

Код: sql
1.
2.
3.
4.
SELECT 
       'ALTER TABLE '+QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))+'.'+QUOTENAME(OBJECT_NAME(parent_object_id))+' NOCHECK CONSTRAINT '+QUOTENAME([name])
FROM 
     sys.foreign_keys;



генерация скрипта на включение

Код: sql
1.
2.
3.
4.
SELECT 
       'ALTER TABLE '+QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))+'.'+QUOTENAME(OBJECT_NAME(parent_object_id))+' CHECK CONSTRAINT '+QUOTENAME([name])
FROM 
     sys.foreign_keys;
...
Рейтинг: 0 / 0
25.12.2019, 17:22
    #39907984
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
А откуда взялся этот скрипт?

Как бы он должен быть написан в правильной последовательности.

Либо вам надо поставить таблицы в правильном порядке. Либо надо сначала создать все таблицы, а потом только создавать внешние ключи.

К тому же может быть ситуация, когда есть ссылка A -> B -> C -> A . Тогда вам надо выкрутиться
...
Рейтинг: 0 / 0
25.12.2019, 17:23
    #39907985
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
VinniL,

Что-то вроде этого:
Код: sql
1.
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"



Если чисто для fk - получаете их перечисление через служебные представления, а потом в курсоре в динамике их отключаете
...
Рейтинг: 0 / 0
25.12.2019, 17:25
    #39907987
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
entrypoint,

Только нужно еще их сделать is_true
...
Рейтинг: 0 / 0
25.12.2019, 17:34
    #39907989
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Критик
VinniL,

Что-то вроде этого:
Код: sql
1.
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"



Если чисто для fk - получаете их перечисление через служебные представления, а потом в курсоре в динамике их отключаете


В данном случае отключит все ограничения не только FK
...
Рейтинг: 0 / 0
25.12.2019, 17:40
    #39907992
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Критик
entrypoint,

Только нужно еще их сделать is_true


что это ? имеете ввиду is_not_trusted ? Для этого FK нужно пересоздать
...
Рейтинг: 0 / 0
26.12.2019, 11:45
    #39908361
VinniL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Благодарю всех за ответы.

Пошел долгим путем, вынести в начале скрипты создания всех таблиц, далее скрипт создания вторичных ключей.
Пусть долгий, но зато наверняка.
...
Рейтинг: 0 / 0
26.12.2019, 13:31
    #39908421
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
VinniL,

в SSIS пакете можно отключить проверку целостности при выполнении задач потока данных. Создайте SSIS решение, для 30 таблиц максимум час работы на создание, можно и за 20 минут справиться. К тому же балк вставка.
...
Рейтинг: 0 / 0
26.12.2019, 13:41
    #39908426
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Владислав Колосов
VinniL,

в SSIS пакете можно отключить проверку целостности при выполнении задач потока данных. Создайте SSIS решение, для 30 таблиц максимум час работы на создание, можно и за 20 минут справиться. К тому же балк вставка.
Судя по описанию, у ТС бругая проблема: при создании первой же таблицы в скрипте создаются ФК на другие таблицы, которых ещё нет. Потом то же самое со второй таблицей, и т.д.

VinniL,
Единственно возможное решение - сделать правильные скрипты, которые сначала создают таблицы, потом ФК.
Или поправить существующий скрипт (таблиц всего 30, работы на 10 минут).
...
Рейтинг: 0 / 0
26.12.2019, 13:45
    #39908429
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
alexeyvg,

SSIS как раз и решает эту проблему - особенно помогает при "замыкании" FK на ту же таблицу. Т.е. автоматизирует отключение и включение FK при загрузке данных. Я раньше не знал об этой галке и скриптами отключал.
...
Рейтинг: 0 / 0
26.12.2019, 13:48
    #39908433
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Владислав Колосов
alexeyvg,

SSIS как раз и решает эту проблему - особенно помогает при "замыкании" FK на ту же таблицу. Т.е. автоматизирует отключение и включение FK при загрузке данных. Я раньше не знал об этой галке и скриптами отключал.
А, интересно, не знал.
То есть SSMS будет анализировать скрипт, и не выполнять в нём ALTER TABLE (или соотв указания в CREATE TABLE)?
...
Рейтинг: 0 / 0
26.12.2019, 13:51
    #39908435
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
alexeyvg
Единственно возможное решение - сделать правильные скрипты, которые сначала создают таблицы, потом ФК.
Или поправить существующий скрипт (таблиц всего 30, работы на 10 минут).
Ещё вариант - выполнять скрипт, пока всё не создастся :-)
Ведь, если там ошибки, соответствующий батч просто не выполнится. И так, постепенно, все таблицы и констрейны создадутся.
Единственно, если в скрипте есть какие то действия с данными, результат может быть некорректный.
...
Рейтинг: 0 / 0
26.12.2019, 14:08
    #39908448
Сруль.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Автору темы с моим почтением.
https://srulbond1.blogspot.com/
Здесь блог про некую программку,
в меру корявую, ибо делалась для себя, а не на продажу.
А кто хочет взять, так только на правах дарённого коня.
У ней есть опция генерации скрипта внешних ключей.
И опция скрипта на их полное уничтожение.

Излишне говорить, что оба скрипта надо сперва сохранить.
Наше дело предложить, ваше дело отказаться.
У моих юзеров лица вытягиваются, когда я им рассказываю,
если рассказываю, как обошёл их внешние ключи.
Лучше не рассказывать.

Да. чтоб вы знали, сама программа только строит скрипты и ничего
не стирает.
Стираете вы собственноручно из Ентерпрайса.
...
Рейтинг: 0 / 0
26.12.2019, 14:23
    #39908465
Сруль.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
А это те же звери со скриптом на построение.
Строить не ломать-прога может зависнуть до 3-х минут,
ноу паник.
...
Рейтинг: 0 / 0
26.12.2019, 14:37
    #39908477
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
alexeyvg
alexeyvg
Единственно возможное решение - сделать правильные скрипты, которые сначала создают таблицы, потом ФК.
Или поправить существующий скрипт (таблиц всего 30, работы на 10 минут).
Ещё вариант - выполнять скрипт, пока всё не создастся :-)
Ведь, если там ошибки, соответствующий батч просто не выполнится. И так, постепенно, все таблицы и констрейны создадутся.
Единственно, если в скрипте есть какие то действия с данными, результат может быть некорректный.


Это не прокатит, если reference идут inline

CREATE TABLE dbo.PurchaseOrderDetail
(
PurchaseOrderID int NOT NULL
REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
LineNumber smallint NOT NULL,
ProductID int NULL
REFERENCES Production.Product(ProductID),
UnitPrice money NULL,
OrderQty smallint NULL,
ReceivedQty float NULL,
RejectedQty float NULL,
DueDate datetime NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL
CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()),
ModifiedDate datetime NOT NULL
CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()),
LineTotal AS ((UnitPrice*OrderQty)),
StockedQty AS ((ReceivedQty-RejectedQty)),
CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber
PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
WITH (IGNORE_DUP_KEY = OFF)
)
ON PRIMARY;
...
Рейтинг: 0 / 0
26.12.2019, 16:32
    #39908548
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
alexeyvg
Владислав Колосов
alexeyvg,

SSIS как раз и решает эту проблему - особенно помогает при "замыкании" FK на ту же таблицу. Т.е. автоматизирует отключение и включение FK при загрузке данных. Я раньше не знал об этой галке и скриптами отключал.
А, интересно, не знал.
То есть SSMS будет анализировать скрипт, и не выполнять в нём ALTER TABLE (или соотв указания в CREATE TABLE)?


Как внутри работает, я не подсматривал, настраивается чеком "проверять ограничения" в назначении потока.
...
Рейтинг: 0 / 0
27.12.2019, 11:48
    #39908907
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить проверку внешних ключей при создании базы?
Владислав Колосов
alexeyvg
пропущено...
А, интересно, не знал.
То есть SSMS будет анализировать скрипт, и не выполнять в нём ALTER TABLE (или соотв указания в CREATE TABLE)?


Как внутри работает, я не подсматривал, настраивается чеком "проверять ограничения" в назначении потока.


Это опция включает или не включает настройки BCP механизма. Никаких altet table тут не делается.

Если вы посмотрите SqlBulkCopy под C#, то там тоже есть эти настройки. Остальное происходит в ядре субд.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как отключить проверку внешних ключей при создании базы? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]