Можно ли организовать ограничение внешнего ключа для данных в XML? - PullRequest
4 голосов
/ 07 марта 2012

Некоторые значения узлов внутри столбца XML ссылаются на целочисленные первичные ключи известных таблиц. Можно ли заставить SQL Server проверять такого рода отношения внешнего ключа?

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Ответ - нет, вы не можете.

Вы не можете напрямую использовать XML value() в отношениях FOREIGN KEY.Для удовольствия я попытался создать вычисляемый столбец, в результате которого вызывается .value('<some xpath>', 'int'), заключенный в пользовательскую функцию.Проблема в том, что вы также не можете использовать вычисляемый столбец в отношениях FOREIGN KEY.

Вне фактического ограничения вы можете попытаться выполнить проверку входящих операторов INSERT и UPDATE втриггер ... но это уже становится беспорядок решения.Как говорит Дэмиен, это действительно не относится к документу XML, если вы хотите применить ограничение внешнего ключа.

3 голосов
/ 27 марта 2015

Ответ - да, вы можете!

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

CREATE FUNCTION dbo.GetFooRef(@doc XML)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    RETURN @doc.value(N'(/doc/foo/@id)[1]','int');
END;

CREATE TABLE Foo(id INT PRIMARY KEY);

CREATE TABLE Bar(
    doc XML,
    ref AS (dbo.GetFooRef(doc)) PERSISTED FOREIGN KEY REFERENCES dbo.Foo(id)
);

INSERT INTO dbo.Bar(doc) VALUES ('<doc><foo id="1"/></doc>');
--The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Bar__ref__ ..."
INSERT INTO dbo.Foo(id) VALUES (1);
INSERT INTO dbo.Bar(doc) VALUES ('<doc><foo id="1"/></doc>');
0 голосов
/ 08 марта 2012

Я бы опубликовал это как комментарий, но у меня недостаточно репутации: D. Я думаю, что вы можете добавить ограничение, возвращающее значение функции, которая будет проверять все, что вы хотите в своем XML. Это не будет внешний ключ, но он по крайней мере проверит вашу целостность.

...