На PK таблицы A ссылается FK таблицы B. Невозможно сбросить ПК Таблицы А

MS SQL-сервер

Я делаю звездную схему. Я установил PK's и FK для своих таблиц и теперь пытаюсь написать процедуру, которая отбрасывает ограничения, усекает таблицы, снова добавляет ограничения, а затем повторно заполняет таблицы. Когда я пытаюсь удалить ограничения, я получаю сообщение об ошибке:

«На ограничение PK_TIMEDIM ссылается таблица SalesFactTable, ограничение внешнего ключа FK_SALESFACTTABLE. Не удалось удалить ограничение».

EDIT: Решена одна проблема. Еще нашел. Я получаю ту же ошибку, за исключением того, что теперь есть таинственные, автоматически сгенерированные FK's, такие как FK__SalesFact__CUST___19DFD96B.

Пожалуйста, покажите мне, что я делаю неправильно.

ALTER PROCEDURE [dbo].[A11]
AS
BEGIN

--Drop constraints
ALTER TABLE SalesFactTable
DROP CONSTRAINT FK_SALESFACTTABLE

ALTER TABLE SalesFactTable
DROP CONSTRAINT PK_SALESFACTTABLE

ALTER TABLE TimeDim
DROP CONSTRAINT PK_TIMEDIM

ALTER TABLE CustomerDim
DROP CONSTRAINT PK_CUSTOMERDIM

ALTER TABLE PartDim
DROP CONSTRAINT PK_PARTDIM

--Truncate tables
TRUNCATE TABLE TimeDim
TRUNCATE TABLE CustomerDim
TRUNCATE TABLE PartDim
TRUNCATE TABLE SalesFactTable

--Add constraints
ALTER TABLE TimeDim
ADD CONSTRAINT PK_TIMEDIM PRIMARY KEY (TIME_ID)

ALTER TABLE CustomerDim
ADD CONSTRAINT PK_CUSTOMERDIM PRIMARY KEY (CUST_ID)

ALTER TABLE PartDim
ADD CONSTRAINT PK_PARTDIM PRIMARY KEY (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT FK_SALESFACTTABLE FOREIGN KEY (TIME_ID) REFERENCES TimeDim (TIME_ID),
FOREIGN KEY (CUST_ID) REFERENCES CustomerDim (CUST_ID),
FOREIGN KEY (PART_ID) REFERENCES PartDim (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT PK_SALESFACTTABLE PRIMARY KEY (TIME_ID, CUST_ID, PART_ID)

person Chiharu    schedule 09.12.2014    source источник
comment
Что ж, PK, вероятно, является первичным ключом, и на него ссылаются ограничения внешнего ключа. Вам нужно будет изменить порядок, чтобы сначала отбрасывались ограничения внешнего ключа?   -  person StuartLC    schedule 09.12.2014
comment
Это сработало. Благодарю вас! Я постараюсь помнить, что порядок важен в будущем.   -  person Chiharu    schedule 09.12.2014


Ответы (1)


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

**

ALTER PROCEDURE [dbo].[A11]
AS
BEGIN
  --Drop FK constraints
ALTER TABLE SalesFactTable
DROP CONSTRAINT FK_SALESFACTTABLE
    --Drop PK constraints
ALTER TABLE SalesFactTable
DROP CONSTRAINT PK_SALESFACTTABLE

ALTER TABLE TimeDim
DROP CONSTRAINT PK_TIMEDIM

ALTER TABLE CustomerDim
DROP CONSTRAINT PK_CUSTOMERDIM

ALTER TABLE PartDim
DROP CONSTRAINT PK_PARTDIM

--Truncate tables
TRUNCATE TABLE TimeDim
TRUNCATE TABLE CustomerDim
TRUNCATE TABLE PartDim
TRUNCATE TABLE SalesFactTable

--Add constraints
ALTER TABLE TimeDim
ADD CONSTRAINT PK_TIMEDIM PRIMARY KEY (TIME_ID)

ALTER TABLE CustomerDim
ADD CONSTRAINT PK_CUSTOMERDIM PRIMARY KEY (CUST_ID)

ALTER TABLE PartDim
ADD CONSTRAINT PK_PARTDIM PRIMARY KEY (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT FK_SALESFACTTABLE FOREIGN KEY (TIME_ID) REFERENCES TimeDim (TIME_ID),
FOREIGN KEY (CUST_ID) REFERENCES CustomerDim (CUST_ID),
FOREIGN KEY (PART_ID) REFERENCES PartDim (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT PK_SALESFACTTABLE PRIMARY KEY (TIME_ID, CUST_ID, PART_ID)    
person A_Sk    schedule 09.12.2014
comment
Спасибо за ваш ответ! Мне удалось успешно удалить ограничения, которые я создал, но теперь я получаю ту же ошибку, за исключением загадочных, автоматически сгенерированных (?) FK's, таких как FK__SalesFact__CUST___19DFD96B. - person Chiharu; 09.12.2014
comment
Вы можете отлаживать процедуру хранения??? и посмотрите, в какой части SP вы получаете эту ошибку?? - person A_Sk; 09.12.2014
comment
Отладчику не удалось запуститься, потому что мне было отказано в разрешении на выполнение. :( - person Chiharu; 09.12.2014
comment
Это странно. Новая ошибка возникает не при удалении PK_TIMEDIM, а при попытке удалить PK_CUSTOMERDIM и PK_PARTDIM. Я не уверен, почему он, кажется, относится к ним по-разному. - person Chiharu; 09.12.2014
comment
Ok. Таблица SalesFactTable каким-то образом дважды была связана с таблицами CustomerDim и PartDim. Возможно, это было частью проблемы... - person Chiharu; 09.12.2014