3

明確にするために、これは宿題の質問です。

これはリレーショナルスキーマです。

  • PaperInvolvementpaperNr, academicId, paperRole
  • AcademicacademicId, acadName, employer

したがって(academicID)、はテーブルの主キーでAcademicあり、テーブル(paperNr, academicId)の主キーですPaperInvolvement

これが私に求められているトリガーです:

  • 挿入PaperInvolvement後、更新
  • Academic更新後オン
  • 同じ会社で働いている2人の学者が反対の役割で同じ論文に関与するのを防ぎます。
  • ストアドプロシージャを使用するか、トリガーで完全にカバーします

このテーブルで使用できる役割は2つだけですReviewerAuthor

これは私がこれまでに行ったことです:

CREATE TRIGGER TR_PaperInvolvement_1
ON PaperInvolvement
AFTER INSERT, UPDATE
AS
IF EXISTS
(
SELECT a.academicId, paperRole, paperNr
FROM
(SELECT academicId
FROM Academic
GROUP BY employer, academicId) AS a
JOIN
(SELECT academicId, paperRole, paperNr
FROM PaperInvolvement

GROUP BY paperNr, academicId, paperRole) AS p_inv
ON a.academicId = p_inv.academicId
WHERE paperRole = 'Author' AND paperRole = 'Reviewer'

)
BEGIN
RAISERROR('Cannot have 2 Academics from the same company to work on
different roles for this paper.',16,1)
ROLLBACK TRANSACTION
END
GO

私の質問は、要件(箇条書きに記載したもの)に基づいて、これが質問に答える正しい方法ですか?

4

1 に答える 1

1

これを試して

CREATE TRIGGER TR_PaperInvolvement_Modify
ON PaperInvolvement
AFTER INSERT, UPDATE
AS
begin
    if exists
    (
        select P.paperNr, A.employer
        from PaperInvolvement as P   
            inner join Academic as A on A.academicID = P.academicID 
        where P.paperNr in (select i.paperNr from inserted as i)
        group by P.paperNr, A.employer
        having
            count(case when P.paperRole = 'Author' then 1 end) > 0 and
            count(case when P.paperRole = 'Reviewer' then 1 end) > 0
    )
    begin
        raiserror('Cannot have 2 Academics from the same company to work on different roles for this paper.', 16, 1)
        rollback transaction 
    end
end
于 2012-12-05T17:52:45.087 に答える