如何在没有硬编码的情况下对列施加 CHECK 约束,使其可接受值的范围来自另一个表?
这是一个简化的示例:
OneManyTable
RoleID TaskID
10 Val1
10 Val2
20 Val1
20 Val2
MetaDataTable
pkID Class Value
1 A Val1
2 A Val2
3 B Val3
4 B Val4
我想在 OneManyTable.TaskID 列上放置一个 CHECK 约束,以便可接受的值来自另一个表的列,即来自 MetadataTable.Value where MetadataTable.class='A'
我已经尝试创建格式的 CHECK 约束
TaskID in (Select Value FROM MetadataTable where class= 'A')
但这不受支持。
另一方面, ('Val1', 'Val2') 中的 TaskID 在 SQL2k8 中用作检查约束(不在 SQL2000 中!),但由于硬编码,它是不可接受的。
如何实现我想要的,无论是通过 CHECK 约束还是我不知道的其他一些花哨的机制?
PS。必须在数据库端,没有人向我建议的客户端检查。