是否可以为XML中的数据安排外键约束?

时间:2012-03-07 18:54:08

标签: sql-server xml sql-server-2008 tsql foreign-key-relationship

XML列中的某些节点值引用已知表的整数主键。是否可以让SQL Server检查这种外键关系?

3 个答案:

答案 0 :(得分:4)

答案是否定的,你不能。

您无法在value()关系中直接使用XML FOREIGN KEY。为了好玩,我尝试创建一个计算列,其结果是在用户定义的函数中调用.value('<some xpath>', 'int')。麻烦的是你也不能在FOREIGN KEY关系中使用计算列。

在实际约束之外,您可以尝试在触发器中执行传入的INSERTUPDATE语句的验证......但这已经成为一个解决方案的混乱。正如Damien所说 - 如果你想强制执行外键约束,那么它实际上不属于XML文档。

答案 1 :(得分:3)

答案是肯定的,你可以!

通过约束您的文档包含固定数量的此类引用,您可以为您的外键创建持久计算列。

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>');

答案 2 :(得分:0)

我会将其作为评论发布,但我没有足够的声誉:D。我认为你可以添加一个约束来返回一个函数的值,该函数可以在你的xml中有效。它不会是外键,但它至少会检查你的完整性。