數據庫設計案例(1)

現有菜單:       

如果要是實現:  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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章