Se você realmente precisa A_or_B_ID
do TableZ, você tem duas opções semelhantes:
1) Adicione anuláveis A_ID
e B_ID
colunas à tabela z, faça A_or_B_ID
uma coluna computada usando ISNULL nessas duas colunas e adicione uma restrição CHECK de modo que apenas um A_ID
ouB_ID
não seja nulo
2) Adicione uma coluna TableName à tabela z, restrita para conter A ou B. agora crie A_ID
eB_ID
como colunas computadas, que só são não nulas quando sua tabela apropriada é nomeada (usando a expressão CASE). Faça-os persistentes também
Em ambos os casos, você agora tem A_ID
e B_ID
colunas que podem ter chaves estrangeiras apropriadas para as tabelas base. A diferença está em quais colunas são calculadas. Além disso, você não precisa de TableName na opção 2 acima se os domínios das 2 colunas de ID não se sobrepõem - desde que sua expressão de caso possa determinar qual domínioA_or_B_ID
enquadra
(Obrigado ao comentário por corrigir minha formatação)