数据库设计案例(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;


猜你喜欢

转载自blog.csdn.net/qq_39870734/article/details/79486822