Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Truncate + ForeignKey  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
Люди добрые, как можно очистить несколько таблиц, на которые ссылаются ForeignKey друг друга, либо таблицы в которых нет данных?

Механизм примерно понятен:
1) отключить ограничения
2) truncate нужных таблиц
3) включить ограничения

Но возник вопрос в реализации этого.

Может кто-нибудь помочь со скриптами отключения(удаления) ограничений.
Буду благодарен за ссылки на учебный материал по данной теме.
16 окт 12, 13:00    [13325952]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
QwerTech,

не отключить/включить, а именно удалить/создать
16 окт 12, 13:02    [13325966]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
QwerTech,

не отключить/включить, а именно удалить/создать
Или всё-таки DELETE в правильном порядке или в любом, но после отключения FK
16 окт 12, 13:03    [13325978]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
не отключить/включить, а именно удалить/создать
Хорошо бы если было бы именно отключить, как индексы.
USE tempdb
GO
CREATE TABLE [dbo].[First] (
	 [ID]	Int		IDENTITY
	 CONSTRAINT [PK_First]	PRIMARY KEY
	,[Name]	VarChar(250)	NOT NULL
)
CREATE TABLE [dbo].[Second] (
	 [ID]	Int		IDENTITY
	 CONSTRAINT [PK_Second]	PRIMARY KEY
	,FK	Int		NOT NULL
	 CONSTRAINT [FK_Second]	REFERENCES [dbo].[First]([ID])
	,Data	VarChar(250)	NOT NULL
)
GO
INSERT dbo.[Second] (FK,Data) VALUES (1,'Data')
GO
TRUNCATE TABLE dbo.[First]
GO
ALTER TABLE [dbo].[Second] WITH NOCHECK NOCHECK CONSTRAINT [FK_Second]
GO
INSERT dbo.[Second] (FK,Data) VALUES (1,'Data')
GO
TRUNCATE TABLE dbo.[First]
GO
SELECT * FROM dbo.[Second]
GO
DROP TABLE [dbo].[Second]
DROP TABLE [dbo].[First]
16 окт 12, 15:28    [13327376]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Можно бесполезно проголосовать: Truncate Table when FK are disable
M$ (24.05.2007)
Won't Fix because we will take your request into consideration for a future release of SQL Server
16 окт 12, 15:42    [13327500]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Хорошо что SWITCH хоть работает.
16 окт 12, 15:45    [13327543]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
люди добрые, а не подскажите документацию по switch
16 окт 12, 18:00    [13328758]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
QwerTech,

BOL читать религия не позволяет ?
16 окт 12, 18:01    [13328767]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
Maxx,

знания не позволяли, до того как вы об этом не написали.

Спасибо большое.
16 окт 12, 20:24    [13329377]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
Так и не смог найти внятного объяснения, что делает SWITCH в следующем примере.

USE tempdb;
GO
DROP TABLE 
    dbo.Child1, 
    dbo.Child2,
    dbo.Parent;
GO
-- Test tables
CREATE TABLE dbo.Parent (parent_id INT PRIMARY KEY);
CREATE TABLE dbo.Child1 (child_id INT PRIMARY KEY, parent_id INT NULL CONSTRAINT FK_C1_P REFERENCES dbo.Parent);
CREATE TABLE dbo.Child2 (child_id INT PRIMARY KEY, parent_id INT NULL CONSTRAINT FK_C2_P REFERENCES dbo.Parent);
GO
INSERT dbo.Parent VALUES (1), (2), (3);
INSERT dbo.Child1 VALUES (1, NULL), (2, 1), (3, 2), (4, 2), (6, 3);
INSERT dbo.Child2 VALUES (1, NULL), (2, 1), (3, 2), (4, 2), (6, 3);
GO
-- Error 4712
TRUNCATE TABLE dbo.Parent;

-- Disable constraint checking on the referecing tables
ALTER TABLE dbo.Child1 NOCHECK CONSTRAINT FK_C1_P;
ALTER TABLE dbo.Child2 NOCHECK CONSTRAINT FK_C2_P;

-- This would still fail
-- TRUNCATE TABLE dbo.Parent;

-- Can switch, truncate, and switch back
CREATE TABLE dbo.Workspace (parent_id INT PRIMARY KEY);
ALTER TABLE dbo.Parent SWITCH TO dbo.Workspace;
TRUNCATE TABLE dbo.Workspace;
ALTER TABLE dbo.Workspace SWITCH TO dbo.Parent;

-- Remove child rows
TRUNCATE TABLE dbo.Child1;
TRUNCATE TABLE dbo.Child2;

-- Success
ALTER TABLE dbo.Child1
    WITH CHECK 
    CHECK CONSTRAINT FK_C1_P;

ALTER TABLE dbo.Child2
    WITH CHECK 
    CHECK CONSTRAINT FK_C2_P;


Нашел только документацию по SWITCH для partitions
16 окт 12, 21:02    [13329460]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
QwerTech
Нашел только документацию по SWITCH для partitions
Разобрались? Ну и сколько секций у обычной таблицы?
16 окт 12, 21:07    [13329467]     Ответить | Цитировать Сообщить модератору
 Re: Truncate + ForeignKey  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
QwerTech,
ну а сие кому пишут то
ALTER TABLE

    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table 


+
SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_ partition_number_expression ]
Switches a block of data in one of the following ways:

Reassigns all data of a table as a partition to an already-existing partitioned table.

Switches a partition from one partitioned table to another.

Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

If table is a partitioned table, source_partition_number_expression must be specified. If target_table is partitioned, target_partition_number_expression must be specified. If reassigning a table's data as a partition to an already-existing partitioned table, or switching a partition from one partitioned table to another, the target partition must exist and it must be empty.

If reassigning one partition's data to form a single table, the target table must already be created and it must be empty. Both the source table or partition, and the target table or partition, must reside in the same filegroup. The corresponding indexes, or index partitions, must also reside in the same filegroup. Many additional restrictions apply to switching partitions. table and target_table cannot be the same. target_table can be a multi-part identifier.

source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. These include user-defined type variables and user-defined functions. They cannot reference Transact-SQL expressions.

For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.
16 окт 12, 21:42    [13329540]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить