Один метод, который не требует триггеров, имел избыточность данных.
Поместите столбец type
в TableB вместе с ограничением. И добавить дополнительный уникальный ключ к TableA для внешнего ключа:
create table tableA (
id int primary key,
type int,
constraint unq_type_id unique (type, id)
);
create table tableB (
id int primary key,
type int,
tableAID int,
constraint fk_tableB_type_tableAID foreign key (type, tableAID) references tableA(type, id),
constraint chk_type check (type > 1)
);
Это хак, но это сделать то, что вы хотите без триггеров.
Разновидность этого метода не требует повторения type
в обеих таблицах, но это требует дополнительных столбцов:
create table tableA (
id int primary key,
type int,
typeIsValid as (case when type > 1 then 1 else 0 end) persisted,
constraint unq_type_id unique (typeIsValid, id)
);
create table tableB (
id int primary key,
tableAID int,
typeIsValid as (1),
constraint fk_tableB_typeIsValid_tableAID foreign key (typeIsValid, tableAID) references tableA(type, id) persisted
);
Это работает даже в SQL Fiddle.
Вы можете сделать это с помощью триггера INSERT/UPDATE. Это единственный способ сделать это, если вы хотите, чтобы принудительное исполнение было в SQL. –