限制用户数量的SQL触发器
我还在学习如何使用SQL,我需要一些帮助来创建这个数据库 我创建了以下表格:限制用户数量的SQL触发器,sql,oracle,triggers,limit,Sql,Oracle,Triggers,Limit,我还在学习如何使用SQL,我需要一些帮助来创建这个数据库 我创建了以下表格: create table Worker (Num_Worker number(20) PRIMARY KEY, Name varchar2(30), ID number(8), Password varchar2(20)); create table Area (Code_Area number(10) PRIMARY KEY, Name varchar2(30), Current_workers number(2)
create table Worker
(Num_Worker number(20) PRIMARY KEY,
Name varchar2(30),
ID number(8),
Password varchar2(20));
create table Area
(Code_Area number(10) PRIMARY KEY,
Name varchar2(30),
Current_workers number(2)
Max_workers number(2));
create table Timetable
(ID_Timetable number(10) PRIMARY KEY,
Time_Entrance date,
Time_Exit date,
Code_Area number(10),
Num_Worker number(20),
Foreign Key (Num_Worker) references Worker(Num_Worker),
Foreign Key (Code_Area) references Area(Code_Area));
据推测,每个工人都可以选择一个工作区域,但每个区域都有一个限制或同时限制工人
工作人员将创建一个新的时间表,但在创建该时间表之前,应检查他选择的区域,以检查当前的\u工作人员是否与Max \u工作人员的值相同,如果是,则不应让其发生
我一直在尝试为它创建一个触发器,但是我没有找到正确的语法,我也不知道如何做,或者是否有比使用触发器更好的方法。
到目前为止,我所做的就是:
create trigger limit_worker_per_zone
before insert
on Timetable
for each row
as
BEGIN
if (select Current_Workers from Area) >= (select Max_workers from Area) <-Not sure...
BEGIN
???
END
END
如果你能在这方面帮助我,我将不胜感激。与此同时,我仍将自己寻找更多信息,但帮助越多越好。尝试将此作为起点:
CREATE OR REPLACE TRIGGER LIMIT_WORKER_PER_ZONE
BEFORE INSERT ON TIMETABLE
FOR EACH ROW
AS
nCurrent_workers NUMBER;
nMax_workers NUMBER;
BEGIN
SELECT CURRENT_WORKERS,
MAX_WORKERS
INTO nCurrent_workers,
nMax_workers
FROM AREA
WHERE CODE_AREA = :NEW.CODE_AREA;
IF nCurrent_workers = nMax_workers THEN
NULL; -- add code here to do the appropriate thing when the area is already full
ELSE
NULL; -- add code here to to the appropriate thing if the area is not full
END IF;
END LIMIT_WORKER_PER_ZONE;
我将让你来充实这件事
分享和享受。最好说明您正在使用的数据库。@Gordon的意思是您正在使用MySql、Microsoft SQL Server、Oracle、Postgres等。或者更直白地说,您的问题只是胡言乱语,只要您不说出您正在使用的RDBMS和版本的名称。这不是PostgreSQL,我可以从varchar2中看出。在这方面你根本没有异常处理。另外,您可能应该将变量声明为area.current\u workers%type;
CREATE TRIGGER limit_worker_per_zone
BEFORE INSERT
ON Timetable
FOR EACH ROW
DECLARE
v_total NUMBER;
BEGIN
BEGIN
SELECT max_workers - current_workers
INTO v_total
FROM Area
WHERE Code_Area = :NEW.Code_Area;
exception when no_data_found then
v_total := 1;
END;
IF v_total <= 0 THEN
raise_application_error(990000, 'workers full for this area');
END IF;
END limit_worker_per_zone;