0

첫 번째로, 저는 학사 학위 논문에 도움이 필요합니다. SQL Server 2008 Release 2에서 전체 데이터베이스를 수행하고 있습니다. 문제는 자체적으로 작동하지만 제약 조건에서 사용하지 않는 함수를 사용하는 check 제약 조건에 있습니다. 제약 조건의 결과는 다음과 같아야합니다. 한 명의 직원이 하루에 한 번의 버스 여행 만 할 수 있습니다.새로 삽입 된 행에 대한 CHECK 제약 조건에 sql 함수 사용

표 탈취 여행 다음은 그 탈취 여행을가는 직원 포함

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)) 
); 

테이블 :

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 [email protected]); 
    SET @SluzebniCesta = (SELECT idSluzCesty FROM SluzebniCesta WHERE [email protected]); 
    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 [email protected])) 
    BEGIN 
    SET @retVal=0; 
    END 
    ELSE 
    BEGIN 
    SET @retVal=1; 
    END 
    return @retVal 
END 
GO 

그리고 직원의 증거와 자신의 탈취 여행이 포함 된 테이블에 대한 ALTER 테이블 :

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

을 그리고 제약 새로운 행을 입력 할 때 함수가 올바른 데이터를 제공하더라도 손상되었습니다. 반환 1은 좋은 결과입니다 ....

답변

0

처음에는 확실하지 않지만 함수의 두 set 문이 테이블에서 정확히 동일한 값을 검색하는 것 같습니다 매개 변수로 전달됩니다.

두 번째로, 나는 같은 날에 여행을 제한하는 것을 보지 못한다. 어딘가에.

직원의 여행을 1 일 1 회로 제한하려는 경우 쉽습니다.

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) 
); 

고유 한 제약 조건으로 동일한 직원이 같은 날에 둘 이상의 출장을 기록 할 수 없습니다.

+0

때로는 그냥 쉬운 솔루션을 볼 수 없습니다 어려운 방법으로 만들려고 노력합니다. 어쨌든 감사합니다. – Caen

+0

기분 나쁘게 느끼지 마십시오. 나는 매우 복잡한 (그리고, 내가 추가 할 수있는 혁신적인) 솔루션을 개발 한 몇 년 동안의 횟수를 세지는 못합니다. 문제를 실제로 해결 한 한두 개의 줄만 제외하고 모든 것을 삭제합니다. 단순함은 어려운 도전입니다. 그러나 검사가 끝날 때까지 가슴을 쾅쾅 치지 않을 것입니다. :-P 그래서 우리에게 정보를 알려주세요. – TommCatt

0

결국 나는 더 정교하고보기 좋은 해결책으로 해결했습니다. 취업은 도착 및 퇴근 시간에 따라 제한됩니다. 그리고 내가 잘못 발행 수의 수를 반환하는 함수와 그것을 해결, 그 모든 권리 이외의 제로 경우와 그것을 작동합니다 : 당신이 있기 때문에 잘 :-) 화려입니다

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)