2013-07-18 2 views
0

Я пробовал искать около часа через все вопросы внешнего ключа/сортировки, но я не могу найти что-то даже отдаленно близко к моему вопросу.Возможно ли создать внешний ключ на 2 столбцах с разными коллажами?

У меня есть 2 таблицы от двух разных поставщиков программного обеспечения, которые находятся в одной базе данных. Один поставщик жестко координирует свои сопоставления с Latin1_General_BIN, а другой использует базу данных по умолчанию (в данном случае Latin1_General_CI_AS). Возможно ли, не изменяя ни один из столбцов, создать внешние ключи между этими двумя типами сортировки?

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

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = 
( 
    SELECT name FROM sys.foreign_keys 
    WHERE parent_object_id = OBJECT_ID('Table1') 
    AND referenced_object_id = OBJECT_ID('Table2') 
) 

Любая помощь будет действительно оценить

PS Я просто не могу понять, как работает этот код, если кто-нибудь поможет мне, я помещаю в 4 требуемых пространства, но он все еще просто показывает мой код как текст :(

+0

Попробуйте дополнительные перерывы перед четырьмя пробелами и убедитесь, что у каждого rw есть пробелы (или одна вкладка работает также) –

+0

Вы такие умные штаны, спасибо Дэвиду, дополнительный разрыв линии сделал трюк :) Как сделать вы делаете вкладку? Каждый раз, когда я нажимаю вкладку, он переключает фокус на следующий элемент управления. – Storm

+0

Обычно я редактирую свой код в блокноте ++, а затем выбираю его все и нажимаю один раз (тогда я вставляю его в stackoverflow). Таким образом, я могу проверить свой синтаксис для SQL или C# или python или что-то в то же самое время. Вы можете сделать тот же трюк в студии управления сервером sql и, возможно, в визуальной студии. –

ответ

0

Добавление ограничения внешнего ключа из поле одного сопоставления в поле другого сопоставления не может быть выполнено. Появится сообщение об ошибке 1757.

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

Если ничего не работает, и вам действительно нужно устранить этот тип ограничений, а производительность не является проблемой, добавьте che ck ограничения и/или триггеры, которые будут проверять ссылочную целостность данных, помещенных в таблицы. Эти правила должны будут отображать все значения в одной таблице для сопоставления другой, чтобы сравнивать значения, поэтому они будут медленными, и вам будет очень сложно использовать индексы, действуйте с осторожностью.

Например, у вас может быть триггер insert в таблице ссылок, который проверяет, существует ли запись с вставленной строкой в ​​указанной таблице. Затем вам также нужно будет добавить триггер обновления и удаления для ссылочной таблицы, чтобы он не выходил за пределы значений, на которые ссылаются записи в таблице ссылок или каскады обновлений/удалений. В основном вы реплицируете внешние ключи, и он становится очень медленным и масштабируется ужасно.

Короткий ответ: не делайте этого, позвольте таблицам оставаться развязанным или исправить сопоставление одного из них.

+0

Спасибо за вышеупомянутый Дэвид, мы используем триггеры ссылочной целостности для определенных таблиц для очень конкретных экземпляров, поэтому я слышу, что вы там говорите. Я также понимаю изменение сортировки, поскольку это то, что мы обычно делаем, но, к сожалению, нам не разрешено изменять сортировку ссылочных столбцов для любой из двух таблиц, поскольку они имеют решающее значение для целостности каждого из двух программ производителей , Однако то, что мне действительно нравится, это то, что вы сказали о возможном добавлении суррогатного ключа, хотя и не в самом верном виде. Я вернусь к тебе после того, как я быстро выйду из спецификации. Благодаря! – Storm

0

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

правые, так первое, что я сделал, была я получил разрешение от поставщика кто есть триггер требует внешнего ключа, чтобы создать новый столбец в своей таблице в качестве сохраняемого вычисляемого столбца в сверке другой таблицы продавцов:

DECLARE @Collation nvarchar(100) 
DECLARE @SQL  nvarchar(1000) 
SET @Collation = (SELECT collation_name FROM sys.columns WHERE OBJECT_ID IN (SELECT OBJECT_ID FROM sys.objects WHERE type = 'U' AND name = 'Vendor1Table') AND name = 'Vendor1Column') 
SET @SQL = 'ALTER TABLE [Vendor2Table] ADD [Vendor2ComputedColumn] AS [Vendor2Column] COLLATE ' + @Collation + ' PERSISTED' 
EXECUTE(@SQL) 
GO 

Далее я добавил кандидат ключ к вычисляемого столбца:

ALTER TABLE [Vendor2Table] ADD CONSTRAINT [CCUNQ1_x] UNIQUE NONCLUSTERED 
(
    [Vendor2ComputedColumn] ASC 
) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
ON [PRIMARY] 
GO 

Тогда, я просто создал внешний ключ к вычисляемого столбца:

ALTER TABLE [dbo].[Vendor1Table] WITH CHECK ADD CONSTRAINT [CCFOK01_x] FOREIGN KEY ([Vendor1Column]) 
REFERENCES [dbo].[Vendor2Table] ([Vendor2ComputedColumn]) 
GO 

ALTER TABLE [dbo].[Vendor1Table] CHECK CONSTRAINT [CCFOK01_x] 
GO 

и, наконец, оригинальный SQL Script проходит с триумфом:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = 
( 
    SELECT name FROM sys.foreign_keys 
    WHERE parent_object_id = OBJECT_ID('Vendor1Table') 
    AND referenced_object_id = OBJECT_ID('Vendor2Table') 
) 

Надеется, это небольшое пошаговое руководство поможет некоторым другим души нибудь :)

Спасибо за помощь Давиде, оцените его!

Смежные вопросы