現有菜單: 一 二 三 四
如果要是實現: A用戶登錄後顯示菜單爲一、二
B用戶登錄後顯示菜單爲二、三
C用戶登錄後顯示菜單爲一、二、三
D用戶登錄後顯示菜單爲一、二、三、四
(1)進行相關的模型設計:
用戶信息: 用戶編號、用戶姓名
菜單:菜單編號、菜單名稱
關聯表:用戶編號、菜單編號
用戶信息表yonghu | ||||
字段名 | 數據類型 | 長度 | 說明 | 描述 |
Yhbh | Number | 10 | 不空,主鍵 | 用戶編號 |
yname | Varchar2 | 10 | 不空 | 用戶姓名 |
菜單信息表 caidan | ||||
字段名 | 數據類型 | 長度 | 說明 | 描述 |
Caib | Number | 8 | 不空,主鍵 | 菜單編號 |
cname | Varchar2 | 8 | 不空 | 菜單名稱 |
關聯表 guanlian | ||||
字段名 | 數據類型 | 長度 | 說明 | 描述 |
Yhbh | Number | 10 | 不空,主鍵 | 用戶編號 |
Caib | Number | 8 | 不空,主鍵 | 菜單編號 |
(2)實現至數據庫,進行數據的添加,
create table yonghu(
Yhbh number(10) not null,
yname varchar2(10) not null
);
alter table yonghu add constraint pk_yhbh primary key(Yhbh);
create table caidan(
caib number(8) not null,
cname varchar2(8) not null
);
alter table caidan add constraint pk_caib primary key(caib);
create table guanlian(
yhbhNumber(10) ,
caibNumber(8) not null
);
alter table guanlian add constraint pk_gl_yhbh primary key(yhbh);
alter table guanlian add constraint up_gl_caib unique(caib);
外鍵:alter table guanlian add constraint wj_yhbh foreign key
(yhbh) references yonghu(yhbh);
外鍵: alter table guanlian add constraint wj_caib foreign key
(caib) references caidan(caib);
添加:
insert into caidan values(10,'菜單一 ' );
insert into caidan values(20,'菜單二 ' );
insert into caidan values(30,'菜單三 ' );
insert into caidan values(40,'菜單四 ' );
insert into yonghu values(001,'奧利奧 ');
insert into yonghu values(002,'水果沙拉 ');
insert into yonghu values(003,'火龍果 ');
insert into yonghu values(004,'咩咩咩 ');
insert into guanlian values(001,10);
insert into guanlian values(001,20);
insert into guanlian values(002,20);
insert into guanlian values(002,30);
insert into guanlian values(003,10);
insert into guanlian values(003,20);
insert into guanlian values(003,30);
insert into guanlian values(004,10);
insert into guanlian values(004,20);
insert into guanlian values(004,30);
insert into guanlian values(004,40);
(3)並編寫出查詢用戶A的可操作菜單的語句。
select y.yhbh,c.cname from yonghu y left join guanlian g on y.yhbh=g.yhbh
left join caidan c on g.caib=c.caib;
延伸:
1、編寫觸發器,要求在刪除用戶的時候,將用戶和菜單的關聯關係也進行刪除。
當添加用戶時,默認給用戶設置’一’的菜單。
create or replace trigger tg_yonghu
after
delete or insert
on yonghu
for each row
begin
if deleting then
delete from guanlian where yhbh=:old.yhbh;
elsif inserting then
insert into guanlian values(:new.yhbh,10);
end if;
end;
2、給用戶表添加密碼字段,寫一個存儲過程,名稱爲getLoginResult,通過傳入用戶名和密碼,調用存儲過程時,
如果用戶登錄成功,則顯示登陸結果爲1,並顯示該用戶的菜單信息;
如果用戶登錄失敗,則顯示登陸結果爲2,並輸出'用戶名或者密碼錯誤';
create or replace procedure getLoginResult(gl_yname yonghu.yname%type,gl_mima yonghu.mima%type,gl_out out number)
as
cursor c_yb is select y.yname,c.cname from yonghu y
left join guanlian g on y.yhbh=g.yhbh
left join caidan c on g.caib=c.caib;
cn number;
begin
select count(*) into cn from yonghu where yname=gl_yname and mima=gl_mima;
if cn=0 then
gl_out:=2;
dbms_output.put_line('用戶名或密碼錯誤');
elsif cn=1 then
gl_out:=1;
for a in c_yb loop
dbms_output.put_line('菜單:'||a.cname);
end loop;
end if;
end;
declare
gl_out number;
begin
getLoginResult('奧利奧 ','123',gl_out);
dbms_output.put_line(gl_out);
end;