簡體   English   中英

檢查數據庫db2中的約束

[英]Check constraint in database db2

我正在設計一個數據庫,其中包含以下實體:

create table Director(
    ID integer not null,
    YearsExperience integer not null,
    StudioAffiliation varchar(30),
    NetWorth REAL,
    primary key (ID)
);

create table Movie(
    ID varchar(20) not null,
    Title varchar(40) not null,
    Genre char(1) not null,
    ReleaseDate date not null,
    Earning real not null,
    primary key (ID)
);

現在,Director和Movie具有2種關系:Direct和WonAward。 后者是為了記錄導演是否憑借他/她執導的電影獲得了獎項或更多獎項:

create table Directs(
    DirectorID integer not null,
    MovieID varchar(20) not null,
    primary key (DirectorID, MovieID),
    foreign key (DirectorID) references Director (ID) on delete cascade,
    foreign key (MovieID) references Movie (ID) on delete cascade
);

create table WonAward(
    DirectorID integer not null,
    MovieID varchar(20) not null,
    AwardName varchar(30) not null,
    Year integer not null,
    Budget REAL not null,
    primary key (DirectorID, MovieID),
    foreign key (DirectorID) references Director (ID) on delete cascade,
    foreign key (MovieID) references Movie (ID) on delete cascade
);

我需要確保導演只獲得他/她執導的電影的獎項。 現在,我嘗試使用Check來實現這一點,但是在WonAward關系結束時,以下兩個條件始終給我帶來錯誤:

check (DirectorID = (SELECT DirectorID FROM Directs WHERE Directs.MovieID = MovieID)),
 check (MovieID = (SELECT MovieID FROM Directs WHERE Directs.DirectorID = DirectorID))

這是我不斷得到的錯誤:

DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0548N  A check constraint or generated column that is defined with "SELECT" 
is invalid.  SQLSTATE=42621

在沒有這些限制的情況下,我發現用戶可以進入數據庫,從而獲得非他們導演的電影導演獎。 我怎樣才能做到這一點?

您無法創建檢查約束來查詢相關行之外的數據。 您可以做的是創建一個觸發器,以驗證是否滿足條件。 CREATE TRIGGER文檔中有一些示例,可以根據您的需求進行自定義。

從定義外鍵WonAwardDirects ,而不是:

create table WonAward(
    DirectorID integer not null,
    MovieID varchar(20) not null,
    AwardName varchar(30) not null,
    Year integer not null,
    Budget REAL not null,
    primary key (DirectorID, MovieID),
    foreign key (DirectorID, MovieID) references Directs
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM