Прежде всего, избавьтесь от таких ключевых слов из названия таблицы, как [User]
, user_id
и т. Д.
Это действительно проблематично и раздражает.
Во-вторых, почему 2 введите [User]
стол, id
, user_id
? Это не требуется.
Я буду хранить только id
или user_id
.
В-третьих, знание реальной структуры таблицы или даже назначения каждой таблицы поможет в улучшении моделирования данных.
Из таблицы [User]
видно, что id
и user_type
равны composite primary key
.
Так и должно быть. Если это так, тогда вы не можете определить FK constraint
, так как user_type
недоступен ни в таблице Teacher
, ни в таблице Student
.
И что, к примеру, выглядит, например, первые данныевставляется в Student
или Teacher
, затем данные вставляются в таблицу User
в том же Transaction
.
Таким образом, во всех вышеприведенных сценариях Instead of Trigger
является идеальным сценарием в этом состоянии.
Мой сценарий просто демо,
Create Proc spStudentInsert
as
set nocount on
set xact_abort on
begin try
begin tran
--bulk insert or single insert ,no problem
insert into Student
insert into [User]
if (@@Trancount>0)
commit
end try
begin catch
if (@@Trancount>0)
rollback
end catch
CREATE TRIGGER INSTEADOF_TR_I_User ON [user]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @Flag BIT = 1
IF NOT EXISTS (
SELECT 1
FROM Student S
INNER JOIN inserted i ON i.id = S.id
)
SET @Flag = 0
ELSE IF NOT EXISTS (
SELECT 1
FROM Teacher T
INNER JOIN inserted i ON i.id = T.id
)
AND @Flag = 1
SET @Flag = 0
IF (@Flag = 0)
BEGIN
RAISERROR (
N'Invalid user'
,16
,1
)
RETURN
END
END
В случае, если я ошибаюсь по поводу id, user_type
composite PK
, тогда вы можете сделать другой путь,
PK идентификатора пользователя FK в Studentстол, а также стол учителя. Кроме того, id - это PK в соответствующей таблице.
Итак, сначала вы вставляете в таблицу User
, затем вставляете в таблицу Student
или Teacher
.
Таким образом, дизайн в этом случае будетбыть,
CREATE TABLE [dbo].[User](
id INT NOT NULL ,
user_type CHAR(1) NOT NULL,
user_name VARCHAR(10) NOT NULL,
user_password VARCHAR(255) NOT NULL,
CONSTRAINT [PK_user] PRIMARY KEY (id)
)
INSERT INTO [dbo].[User] ([id] ,[user_type],[user_name] ,[user_password])
VALUES (1 ,1,'S','Ram_001','********')
--drop table [User]
--alter table [user]
-- drop constraint PK_user
CREATE TABLE Student( id INT NOT NULL PRIMARY KEY,name VARCHAR(50) NOT NULL);
ALTER TABLE Student
add CONSTRAINT FK_StudentUser FOREIGN KEY (id) REFERENCES [User] (id);
INSERT INTO [dbo].[Student]([id],[name]) VALUES(1,'Ram'),(5,'Raman');
--select * from [Student]
CREATE TABLE Teacher( id INT NOT NULL PRIMARY KEY,name VARCHAR(50) NOT NULL);
ALTER TABLE Teacher
add CONSTRAINT FK_TeacherUser FOREIGN KEY (id) REFERENCES [User] (id);
INSERT INTO [dbo].Teacher([id],[name]) VALUES(1,'Raj'),(2,'Rahul');
Так что, как явствует из вашего вопроса, я создам Instead of Trigger
и пойду с этим model
.