在新插入行的 CHECK 约束上使用 sql 函数

Using sql function on CHECK constraint for newly inserted row

首先,我的学士论文需要这方面的帮助。我在 sql server 2008 Release 2 上做整个数据库。 问题出在检查约束上,该约束正在使用一个独立工作的函数,但在约束中没有使用。约束的结果应该是这样的:一个员工每天只能出差一次。

Table 商务旅行:

CREATE TABLE SluzebniCesta(
idSluzCesty int PRIMARY KEY NOT NULL,
DatumCesty DATE NOT NULL,
CasOdjezdu TIME(0) NOT NULL,
CasPrijezdu TIME(0),
CONSTRAINT Odjezd_prijezd CHECK(CasPrijezdu > DATEADD(hour,2,CasOdjezdu))
);

Table包含出差的雇员:

CREATE TABLE ZamNaCeste(
idZamNaCeste int PRIMARY KEY NOT NULL,
SluzebCestaID int NOT NULL,
ZamestnanecID int NOT NULL,
FOREIGN KEY (ZamestnanecID) REFERENCES Zamestnanec(idZamestnance),
FOREIGN KEY (SluzebCestaID) REFERENCES SluzebniCesta(idSluzCesty)
);

外键 ZamestnanecID 是员工 ID,SluzebCestaID 是商务旅行 ID。

现在的功能:

CREATE FUNCTION myCheckZamNaCeste(@SluzebCestaID int, @ZamestnanecID int)
RETURNS int
AS
BEGIN
    DECLARE @retVal int;
    DECLARE @Zamestnanec int;
    DECLARE @SluzebniCesta int;
    SET @Zamestnanec = (SELECT idZamestnance FROM Zamestnanec WHERE idZamestnance=@ZamestnanecID);
    SET @SluzebniCesta = (SELECT idSluzCesty FROM SluzebniCesta WHERE idSluzCesty=@SluzebCestaID);
    IF EXISTS ( SELECT DatumCesty FROM SluzebniCesta
    WHERE idSluzCesty = @SluzebniCesta
    AND DatumCesty IN (SELECT DatumCesty FROM ZamNaCeste
    LEFT JOIN SluzebniCesta
    ON ZamNaCeste.SluzebCestaID = SluzebniCesta.idSluzCesty
    WHERE ZamestnanecID=@Zamestnanec))
    BEGIN
    SET @retVal=0;
    END
    ELSE
    BEGIN
    SET @retVal=1;
    END
    return @retVal
END
GO

table 的变更 table 包含员工及其商务旅行的证据:

ALTER TABLE ZamNaCeste
ADD CONSTRAINT check_cesty_zamestnance CHECK(dbo.myCheckZamNaCeste(SluzebCestaID,ZamestnanecID)=1);

当我尝试输入任何新行时,即使函数提供了正确的数据,约束也会被打破。 return 1 是好的结果....

首先,我不确定,但看起来函数中的两个 set 语句正在从表中检索与作为参数传入的值完全相同的值.

其次,我没有看到任何限制当天行程的东西。任何地方。

如果您想将员工的出差限制为每天一次,那很容易。

CREATE TABLE ZamNaCeste(
    idZamNaCeste int PRIMARY KEY NOT NULL,
    SluzebCestaID int NOT NULL,
    ZamestnanecID int NOT NULL,
    TripDate      date not null,
    FOREIGN KEY (ZamestnanecID) REFERENCES Zamestnanec(idZamestnance),
    FOREIGN KEY (SluzebCestaID) REFERENCES SluzebniCesta(idSluzCesty),
    constraint UQ_OneTripPerDay unique( ZamestnanecID, TripDate )
);

唯一约束确保同一员工不能在同一天记录多次旅行。

好吧,最后我用一个更复杂、更好看的解决方案解决了问题。就业受到达和离开时间的限制。我用一个函数解决了它 returns 不正确出现的次数,如果它为零而不是它没问题并且它有效:

SELECT COUNT(*) FROM(SELECT * FROM SluzebniCesta JOIN ZamNaCeste ON SluzebniCesta.idSluzCesty = ZamNaCeste.SluzebCestaID) AS a JOIN (SELECT * FROM SluzebniCesta2 JOIN ZamNaCeste ON SluzebniCesta.idSluzCesty = ZamNaCeste.SluzebCestaID)AS b ON a.SluzebCestaID b.SluzebCestaID AND a.CasOdjezdu b.CasOdjezdu AND a.ZamestnanecID = b.ZamestnanecID AND (SELECT SluzebniCesta.DatumCesty FROM SluzebniCesta WHERE SluzebniCesta.idSluzCesty = a.SluzebCestaID) = (SELECT SluzebniCesta.DatumCesty FROM SluzebniCesta WHERE SluzebniCesta.idSluzCesty = b.SluzebCestaID)