Ссылочное ограничение срабатывает, но не может выбрать строки из таблицы, которые бы его инициировали - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь обновить кучу разных таблиц в моей базе данных. Однако, когда обновление завершено, я не могу удалить запись из другой таблицы из-за ограничения внешнего ключа. Тем не менее, другие базы данных на разных серверах примут изменения просто отлично. И после создания нового нового БД и применения к нему серии сценариев обновления для предварительного заполнения данных он также не работает.

Это должен быть SQL Server 2016.

У меня была попытка коллеги перестроить индексы и обновить использование, но она все еще не удалась.

--- Query 1
SELECT  ROW_NUMBER() OVER(ORDER BY c.[name], t.[name]),
        SCHEMA_NAME(t.schema_id) AS SchemaName,
        c.[name] AS ColName, 
        t.[name] AS TableName
FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
WHERE   c.[name] IN (...)
AND     t.[name] NOT IN (...)
ORDER BY ColName, TableName

Я выбираю коллекцию схем, столбцов и таблиц, которые соответствуют моим критериям, и генерирую динамический SQL для каждой комбинации.

--- Query 2
SET @sql = 'UPDATE ' + @schemaName + '.' + @tableName + ' SET ' + @colName + ' = ' + CONVERT(NVARCHAR, @p1) + ' WHERE ' + @colName + ' = ' + CONVERT(NVARCHAR, @p2)

Большинство / все таблицы, возвращаемые запросом 1, имеют ограничение FK для другой таблицы. И запрос 2, кажется, выполняется правильно без проблем.

Таблица определена следующим образом:

CREATE TABLE [Table1](
    [Table1ID] [int] NOT NULL,
    [ColX] [int] NOT NULL,
    [ColY] [int] NOT NULL,
    ...
    [ColZ] [int] NOT NULL,
    ...
) ON [PRIMARY]

ALTER TABLE [Table1] ADD  CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
    [Table1ID] ASC,
    [ColY] ASC,
    [ColZ] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

ALTER TABLE [Table1]  WITH CHECK ADD  CONSTRAINT [FK_Table1_ColY_Table2_ColY] FOREIGN KEY([ColY])
REFERENCES [Table2] ([ColY])

CREATE TABLE [Table2](
    [Table2ID] [int] IDENTITY(1,1) NOT NULL,
    [ColY] [int] NOT NULL,
    [ColZ] [int] NOT NULL,
    ...
) ON [PRIMARY]

ALTER TABLE [Table2] ADD  CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED 
(
    [Table2ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

ALTER TABLE [Table2] ADD  CONSTRAINT [UK_Table2_ColY] UNIQUE NONCLUSTERED 
(
    [ColY] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Я ожидаю, что когда я запущу следующее:

DELETE  FROM Table2
WHERE   ColY = @p2

что я не запускаю FK_Table1_ColY_Table2_ColY.

Тем более, что:

SELECT   *
FROM     Table1
WHERE    ColY = @p2

не возвращает записей.

Полное сообщение об ошибке выглядит следующим образом:

Msg 547, Level 16, State 0
The DELETE statement conflicted with the REFERENCE constraint 
"FK_Table1_ColY_Table2_ColY". The conflict occurred in database "localhost", table 
"dbo.Table1", column 'ColY'.

1 Ответ

0 голосов
/ 30 мая 2019

Похоже, что проблема была исправлена ​​в обновлении сервера sql.

Поддержка Microsoft: исправление ограничений ссылочной целостности, которые не оцениваются правильно.

Работаподробно описаны следующие исправления:

  1. Используйте уровень совместимости ниже 130.

  2. Измените таблицу ссылок, чтобы изменить структуру индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...