我需要一些关于触发器的帮助。我目前正在开发一个平台和一个数据库,以便在我的大学管理考试。这是我的问题:
我有 1 个超类型表,其中包含在平台上注册的所有人员。我必须能够区分每个人的功能“候选人”和“考官”。所以我有 2 个子类型表,一个用于所有考生,一个用于所有考官。为此,我使用了插入触发器。
此外,一个人可以同时是候选人和考官,但不能同时是。因此,在更新超类型表之后,我还需要一个触发器,以便能够从两个子类型表中的一个中删除特定行,并在另一个上插入用户信息。
以下是这 3 个表格的简化设计:
我的 INSERT 触发器:
ALTER TRIGGER [dbo].[role_insert]
ON [dbo].[alemp_persons]
FOR INSERT
AS
DECLARE @random_number int
SELECT @random_number = CAST(CAST(rand() as binary(2)) as int)
BEGIN
INSERT INTO dbo.alemp_candidates
(
id_person, random_number
)
SELECT id_person, @ random_number
FROM INSERTED
WHERE function='Candidate'
INSERT INTO dbo.alemp_examiners
(
id_person
)
SELECT id_person
FROM INSERTED
Where function='Examiner'
END
GO
我的更新触发器:
ALTER TRIGGER [dbo].[role_update] ON [dbo].[alemp_persons]
AFTER UPDATE
AS
DECLARE @id_person int
DECLARE @newFunction int SELECT @newFunction=function FROM inserted
DECLARE @random_number int SELECT @ random_number = CAST(CAST(rand() as binary(2)) as int)
IF @newFunction = 'Candidate'
BEGIN
DELETE
FROM dbo.alemp_examiners
WHERE id_person=@id_person
END
BEGIN
SET IDENTITY_INSERT dbo.alemp_candidates ON;
INSERT INTO dbo.alemp_candidates
(
id_person, random_number
)
SELECT @id_person, random_number
SET IDENTITY_INSERT dbo.alemp_candidates OFF;
END
IF @newFunction = 'Examiner'
BEGIN
DELETE
FROM dbo.alemp_candidates
WHERE id_person=@id_person
END
BEGIN
SET IDENTITY_INSERT dbo.alemp_examiners ON;
INSERT INTO dbo.alemp_examiners
(
id_person
)
SELECT @id_person
SET IDENTITY_INSERT dbo.alemp_examiners Off;
END
GO
正如我上面所说,我的 INSERT 触发器可以按我的意愿工作。但是,当我想更新一个人的功能时,我得到了一个错误:
当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为标识列指定显式值。