在插入值触发之前检查

发布于 2025-01-25 05:29:38 字数 1632 浏览 1 评论 0原文

我有一个表如下:

CREATE TABLE [dbo].[Vaccination]
(
    [MedicalID] [int] NOT NULL PRIMARY KEY,
    [VaccineName] [varchar](20) NOT NULL,
    [VaccineDate] [date] NOT NULL,
    [DoseNo] [int] NOT NULL PRIMARY KEY,
    [FacilityName] [varchar](20) NOT NULL,
)

因此,我有一个约束,只能在表中允许2个值:剂量1和剂量2

ALTER TABLE [dbo].[Vaccination] 
    ADD CONSTRAINT No_of_Doses CHECK ([DoseNo] = 1 OR [DoseNo] = 2)

我想创建一个触发器,而仅在1st确实存在的第二剂量的值仅在第二剂量的情况信息。同样,要插入的第一剂毫无问题。

这是我的尝试:

CREATE TRIGGER Dose1Check
ON [dbo].[Vaccination]
BEFORE INSERT
BEGIN
    INSERT INTO [dbo].[Vaccination]
        SELECT 22, 'Moderna', '2022-04-22', 1, 'CVS'
        WHERE IF EXISTS (SELECT 1
                         FROM [dbo].[Vaccination]
                         WHERE [MedicalID] = 22 AND [DoseNo] = 1)
            SELECT * 
            FROM [dbo].[Vaccination];
END

上述触发器的代码的以下部分(独立执行)不允许我插入第一剂量。

 INSERT INTO [dbo].[Vaccination]
     SELECT 22, 'Moderna', '2022-04-22', 1, 'CVS'
     WHERE 
         IF EXISTS (SELECT 1
                    FROM [dbo].[Vaccination]
                    WHERE [MedicalID] = 22 AND [DoseNo] = 1)
             SELECT * FROM [dbo].[Vaccination];

这是表的一些值

MedicalID,  VaccineName,    VaccineDate,    DoseNo, FacilityName
14, Moderna,    2022-04-22, 1,  Daisy Family Health
14, Moderna,    2022-04-26, 2,  Daisy Family health
15, Moderna,    2022-04-28, 1,  Daisy Family Health
15, Moderna,    2022-04-22, 2,  Daisy Family Health
16, Pfizer, BioNTech,   2022-04-28  1   Daisy Family Health

I have a table as follows:

CREATE TABLE [dbo].[Vaccination]
(
    [MedicalID] [int] NOT NULL PRIMARY KEY,
    [VaccineName] [varchar](20) NOT NULL,
    [VaccineDate] [date] NOT NULL,
    [DoseNo] [int] NOT NULL PRIMARY KEY,
    [FacilityName] [varchar](20) NOT NULL,
)

So I have a constraint that allows only 2 values into the table: dose 1 and dose 2

ALTER TABLE [dbo].[Vaccination] 
    ADD CONSTRAINT No_of_Doses CHECK ([DoseNo] = 1 OR [DoseNo] = 2)

I want to create a trigger where the value for 2nd dose to be inserted only if 1st does exist else display an error message. Also the 1st dose to be inserted without any problems.

Here is my attempt to it:

CREATE TRIGGER Dose1Check
ON [dbo].[Vaccination]
BEFORE INSERT
BEGIN
    INSERT INTO [dbo].[Vaccination]
        SELECT 22, 'Moderna', '2022-04-22', 1, 'CVS'
        WHERE IF EXISTS (SELECT 1
                         FROM [dbo].[Vaccination]
                         WHERE [MedicalID] = 22 AND [DoseNo] = 1)
            SELECT * 
            FROM [dbo].[Vaccination];
END

The following part of the code of the above trigger, when executed independently, is not allowing me to insert the 1st dose as well.

 INSERT INTO [dbo].[Vaccination]
     SELECT 22, 'Moderna', '2022-04-22', 1, 'CVS'
     WHERE 
         IF EXISTS (SELECT 1
                    FROM [dbo].[Vaccination]
                    WHERE [MedicalID] = 22 AND [DoseNo] = 1)
             SELECT * FROM [dbo].[Vaccination];

Here are some values for the table

MedicalID,  VaccineName,    VaccineDate,    DoseNo, FacilityName
14, Moderna,    2022-04-22, 1,  Daisy Family Health
14, Moderna,    2022-04-26, 2,  Daisy Family health
15, Moderna,    2022-04-28, 1,  Daisy Family Health
15, Moderna,    2022-04-22, 2,  Daisy Family Health
16, Pfizer, BioNTech,   2022-04-28  1   Daisy Family Health

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

太阳公公是暖光 2025-02-01 05:29:38

首先,您的示例数据暗示该表具有复合主键(MedicalId,doseno)。 Thus

CREATE TABLE [dbo].[Vaccination](
    [MedicalID] [int] NOT NULL ,
    [VaccineName] [varchar](20) NOT NULL,
    [VaccineDate] [date] NOT NULL,
    [DoseNo] [int] NOT NULL CHECK (DoseNo IN (1,2)),
    [FacilityName] [varchar](20) NOT NULL,
    Primary Key ([MedicalID],[DoseNo])
)

You can check if inserted data contain out of order doseNo with a trigger

create trigger Dose1Check
  on [dbo].[Vaccination]
  after insert as
begin
  if exists (
    select 1
    from ( -- check single dose insertions only
          select [MedicalID], max(DoseNo) DoseNo
          from inserted
          group by [MedicalID]
          having count(*) = 1
    ) i
    left join [dbo].[Vaccination] v on i.[MedicalID] = v.[MedicalID] and v.DoseNo = 1
    where v.[MedicalID] is null and i.DoseNo = 2 )
  begin
      RAISERROR ('Bad DoseNo' , 16, 1)
      ROLLBACK TRANSACTION;
  end
end

db<>fiddle< /a>

First your sample data imply the table has a composite primary key (MedicalID, DoseNo). Thus

CREATE TABLE [dbo].[Vaccination](
    [MedicalID] [int] NOT NULL ,
    [VaccineName] [varchar](20) NOT NULL,
    [VaccineDate] [date] NOT NULL,
    [DoseNo] [int] NOT NULL CHECK (DoseNo IN (1,2)),
    [FacilityName] [varchar](20) NOT NULL,
    Primary Key ([MedicalID],[DoseNo])
)

You can check if inserted data contain out of order doseNo with a trigger

create trigger Dose1Check
  on [dbo].[Vaccination]
  after insert as
begin
  if exists (
    select 1
    from ( -- check single dose insertions only
          select [MedicalID], max(DoseNo) DoseNo
          from inserted
          group by [MedicalID]
          having count(*) = 1
    ) i
    left join [dbo].[Vaccination] v on i.[MedicalID] = v.[MedicalID] and v.DoseNo = 1
    where v.[MedicalID] is null and i.DoseNo = 2 )
  begin
      RAISERROR ('Bad DoseNo' , 16, 1)
      ROLLBACK TRANSACTION;
  end
end

db<>fiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文