09信计2011-2012(一)《数据库原理及应用》课程设计设计题目医药销售管理系统设计时间2011.12.29至2012.1.4学生姓名学生学号所在班级指导教师医药销售管理系统1 可行性研究近年来,中国医药行业迅速发展,药店企业多业态经营,仓储式大型超市、中等规模超市、便利连锁综合发展。
随着规模的扩大,传统的医药管理已经不能适应发展的需要,很难在激烈的竞争中生存。
通过对从事医药产品的零售、批发等工作企业的深入调查,发现其业务主要包括企业药品销售、出入库管理、企业的财务、人事管理等。
医药管理是一项琐碎、复杂而又十分细致的工作。
手工进行企业日常的药品销售、出入库的工作,容易出现“开空单”的现象,且呆账、错账时有发生,而且费时费力。
本系统在设计中考虑和克服了上述问题,实现了企业管理工作的系统化、规范化和自动化。
2 需求分析2.1任务概述根据医药管理系统的需求分析结果总结系统内实体及联系并绘制系统的局部ER 图然后画出全局ER图。
结合需求分析与概念结构设计把设计好的ER图转换为DBMS所支持的数据模型所符合的逻辑结构,运用SQL数据库管理系统建好表和相关约束2.1.1目标要求本系统能够投入实际的使用并且满足基本的功能要求。
要求具有较高的可靠性、安全性和易维护性,具有较高的可移植性。
本系统实现了以下的功能:基本信息模块:包括药品信息、员工信息、客户信息、供应商信息四个子模块。
(1)进货管理模块:包括入库登记、入库登记查询二个子模块。
(2)库房管理模块:包括库存查询、库存盘点、退货处理三个子模块。
(3)销售管理模块:包括销售登记、销售退货、销售报表查询三个子模块。
(4)财务统计模块:包括当日统计、当月统计二个子模块。
(5)系统维护模块:包括数据安全管理、操作员管理、权限设置三个模块。
说明:根据对现实中医药销售管理业务,将用户分为二类超级管理员(经理)、普通管理员(操作员)。
2.1.2 运行环境Windows 98/2000/XP/2003操作系统下,安装并配置软件Microsoft SQL Server 2000数据库管理系统。
2.2数据需求2.2.1 数据字典(DD)绘制DFD,只是对数据处理和彼此之间的联系进行了说明。
为进一步明确数据的详细内容和数据加工过程,应将数据流图中的全部数据流及其组成部分的数据元素,数据存储,数据加工,通过数据字典描述清楚,以便于此后系统设计的进行。
这就需要开发人员编写详细的数据字典,来描述系统开发过程的细节。
下面列出本系统中的数据项、数据流、数据存储、加工处理和数据结构的数据字典。
数据字典可采用图表格式或较紧凑的记录格式描述,本文采用的是图表格式。
数据项的DD表列举如下:表2.1 药品编号的数据字典表2.2 药品名称表2.3 密码审核日期2.2.2 数据库描述使用SQL SERVER2000作为后台数据库,就可以行使基于网络连接的用户认证。
从而给不同的子系统分配不同的数据库使用角色,让他们彼此之间使用的数据库隔离开来,以达到较高的安全性。
2.3 功能需求2.3.1 功能划分本系统实现了以下的功能:(1)基本信息模块(2)进货管理模块(3)库房管理模块(4)销售管理模块(5)财务统计模块(6)系统维护模块2.3.2 功能描述(1)基本信息模块:包括药品信息、员工信息、客户信息、供应商信息四个子模块。
(2)进货管理模块:包括入库登记、入库登记查询二个子模块。
(3)库房管理模块:包括库存查询、库存盘点、退货处理三个子模块。
(4)销售管理模块:包括销售登记、销售退货、销售报表查询三个子模块。
(5)财务统计模块:包括当日统计、当月统计二个子模块。
(6)系统维护模块:包括数据安全管理、操作员管理、权限设置三个模块2.3.3 数据流图(DFD):数据流图是组织中信息运动的抽象。
是在调研的基础上,从系统的科学性、管理的合理性、实际运动的可行性角度出发。
将信息处理功能和彼此之间的联系自顶向下,逐层分解,从逻辑上精确地描述系统应具有的数据加工功能、数据输入、数据输出、数据存储及数据来源和去向(外部实体)等项目。
在数据流程图中可以很清楚的看到数据的流向,药品信息的数据分别能够流向经理、员工和顾客。
药品销售信息的信息也流经理。
药品销售信息记录的是药品销售和退还的信息。
顾客表信息从顾客流出又可以流回到顾客和员工、经理。
2. 4 一致性需求在医药销售管理系统相关的表之间,有较强的关联性,为了实现一致性的需求,我们在各个表之间建立起了一致性约束。
2. 5 完整性需求根据医药销售系统的要求,为保持数据的完整性,采用了数据库的事务机制,防止出现操作故障。
3 概要设计3.1总体设计3.1.1 系统结构示意图医药销售管理系统结构示意图通过对系统的数据流图进行分析,进一步进行功能分解,直到分解成含义明确,功能单一的功能模块,从而得到系统的功能模块结构图。
3.2 接口设计3.2.1 外部接口通过一定的计算机硬件,建立服务器系统,管理员通过管理服务器系统,与用户进行交互,从而达到资源共享的目的,实现图书管理系统。
3.2.2 内部接口程序内部需要共同的数据定义和描述,此系统是智能办公化管理系统的一个子系统,必须和这个系统的其他子系统统一数据定义等,才能使该系统性能达到最好,并且要尽量消除和其他子系统模块之间存在的数据冗余,才能使整个智能办公系统做到高效,方便。
3.3 E-R图在系统的数据库设计中,先要对系统分析得到的数据字典中的数据存储进行分析,分析各数据存储之间的关系,然后才能得出系统的关系模式。
可以采用E-R图的方法来进行数据结构分析,E-R设计方法是一种通过E-R图来描述现实世界信息结构的DB设计方法。
E-R 图由实体、属性、联系三部分组成。
各分E-R图说明如下:①经理E-R图:②供应商E-R图:③员工E-R图:④药品销售清单E-R图:⑤客户E-R图:⑥药品E-R图:⑦整体E-R图:4 逻辑设计4.1关系模式转换药品信息(药品编号,药品名称,药品类别代号,售价,进价,库存量,供应商,有效期)外码:药品类别代号、供应商药品分类索引信息(药品类别代号,类别说明)员工信息(员工号,姓名,用户名,密码,职位,权限)客户信息(客户号,客户名称,联系人,联系方式,客户所在城市)供应商信息(供应商号,供应商名称,联系人,联系方式,供应商所在城市)药品销售信息(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商,总额,销售员编码)外码:销售员编码、药品编码4.2模式优化在上述关系模式中,每一个分量都是不可分割的数据项所以都符合第一范式;而且前四个关系模式都是单个属性作为码,没有任何非主属性对码部分函数依赖,在药品销售信息内虽由三个属性作为码,但也不存在非主性对码的部分函数依赖,所以上都符合第二范式;药品信息、药品类别索引、客户信息、供应商信息四个关系模式中都不存在非主属性对码的传递函数依赖,都属于第三范式。
在员工信息关系模式中,员工是按照权限分类的,职位不同权限也不同,这样该关系模式就存在了非主属性对码的传递依赖:职工号->职位,职位->权限,所以就将用员工信息分解为如下现个模式:①员工信息(员工号,姓名,用户名,用户口令,职位)②职位权限信息(职位,权限)本系统不考虑职工信息的管理,为了使销售员编号与销售员的职工号连系起来,并能通过职工姓名和职位来修改用户信息所以把员工的部分信息(职工号,姓名,职位)和经理(用户名,密码)合成了员工信息(员工号,姓名,用户名,密码,职位,权限)以便系统功能的实现,所以在此不采用模式分解。
药品销售信息中有大量的数据冗余,表达不明确,将其分解为如下两个模式:①药品销售主表(销售编码,销售日期,销售员编号,总金额)②药品销售子表(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商)5数据库实现5.1 创建数据库表药品信息(药品编号,药品名称,药品类别代号,售价,进价,库存量,供应商,有效期)外码:药品类别代号、供应商药品分类索引信息(药品类别代号,类别说明)员工信息(员工号,姓名,用户名,密码,职位,权限)客户信息(客户号,客户名称,联系人,联系方式,客户所在城市)供应商信息(供应商号,供应商名称,联系人,联系方式,供应商所在城市)药品销售信息(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商,总额,销售员编码)外码:销售员编码、药品编码5.2 创建视图由供应商信息表“FirmInfor”建立一个视图,该视图由供应商信息表的所有列构成*/ create view 供应商信息(供应商编码,供应商名称,联系人,联系电话,所在城市)asselect* from FirmInfor5.3创建存储过程与触发器建立INSERT触发器/*建立INSERT触发器*/create trigger MedID_insert on MedIDfor insertas if(select count(*)from MedID_med,insertedwhere MedID_med.MedKindeCode=inserted.MedKindeCode)=0 rollback transaction建立DELETE触发器create trigger delete_MedID on MedIDfor deleteasselect* from MedIDdeclare @MedKindeCode char(10)select @MedKindeCode=MedKindeCode from deleteddelete from MedIDwhere MedKindeCode=@MedKindeCodeselect*from MedID建立UPDATE触发器create trigger MedID_update on MedIDfor updateasif update(MedKindeCode)beginraiserror('you can not modify this column',16,1) rollback transactionend6 测试7 课程设计总结本次课程设计调查从事医药产品的零售、批发等工作的企业,根据其具体情况,设计医药销售管理系统。
加深了对数据库课程知识的理解。
由于时间仓促,软件还有很多不足之处,如:药品信息查询部分不够完善,软件代码交冗余、效率不高等等,都相关功能缺乏认识造成的。
在今后的学习中我们会加强理论的实践的结合,通过不断摸索来弥补自己在软件制作方面的差距。
参考文献:[1] 苗雪兰,刘瑞新,宋歌.数据库系统原理及应用教程[M].北京.机械工业出版社.2010[2] 萨师煊,王珊.数据库系统概论[M].北京:高等教育出版社.1997[3] 刘真原.SQL SERVER2000培训教程[M].北京:清华大学出版社.2003[4] 李清国.Windows 2000+ ASP SQL Server案例教程[M].上海: 中科多媒体电子出版社.2001[5] 李晓黎.ASP+SQLSERVER网络应用系统开发指南[M].北京.人民邮电出版社.2004附录:create database MedicalManagerSystem/*创建医药销售管理系统*/use MedicalManagerSystemcreate table MedID/*创建药品类别索引信息*/(MedKindeCode char(10) constraint MI_PRI PRIMARY KEY,KindExplanation varchar(12) NOT NULL)create table MedInfor/*创建药品信息表*/(MedicineCode char(6) constraint M_PRIM PRIMARY KEY,MedicineName varchar(8) NOT NULL,MedKindeCode char(10) FOREIGN KEY REFERENCES MedID(MedKindeCode), Price Money,ListPrice Money,Number Int,FirmCode char(10) FOREIGN KEY REFERENCES FirmInfor(FirmCode),Userfulllife Datetime)create table GueInfor/*创建客户信息表*/(GuestCode char(10) constraint G_PRIM PRIMARY KEY,GuestName varchar(16) NOT NULl,GLink varchar(12),GLinkTell varchar(11),City varchar(8))create table FirmInfor/*创建供应商信息表*/(FirmCode char(10) constraint F_PRIM PRIMARY KEY,FirmName varchar(16) NOT NULL,Link varchar(12),LinkTell varchar(11),City varchar(8))create table WorkInfor/*创建员工信息表*/(WorkNo char(10) constraint W_PRIM PRIMARY KEY,Name varchar(12),UserRegName char(6) NOT NULL,Password char(10) NOT NULL,Position char(10),Power Int)create table sellMain/*创建医药销售主表*/(SaleNo int constraint SM_PRIM PRIMARY KEY,WorkNo char(10) FOREIGN KEY REFERENCES WorkInfor(WorkNo),SaleDate DateTime,Amount Money)create table sellChild/*创建医药销售子表*/(SaleNo int constraint SC_PRIM PRIMARY KEY,MedicineCode char(6) FOREIGN KEY REFERENCES MedInfor(MedicineCode),MedicineName varchar(32) NOT NULL,Price Money,Number Int,Uint char(8),Amount Money)/*插入数据的存储过程*/create proc MedID_proc@MedKindeCode char(10),@KindExplanation varchar(12)asinsert into MedID (MedKindeCode,KindExplanation) values(@MedKindeCode ,@KindExplanation )exec MedID_proc '0001','口腔溃疡'exec MedID_proc '0002','感冒'exec MedID_proc '0003','发烧'exec MedID_proc '0004','拉肚子'exec MedID_proc '0005' ,'外伤'create proc MedInfor_proc@MedicineCode char(6),@MedicineName varchar(8),@MedKindeCode char(10),@Price money,@ListPrice money,@Number int,@FirmCode char(10),@Userfulllife Datetimeasinsert into MedInfor(MedicineCode ,MedicineName,MedKindeCode,Price,ListPrice,Number,Supplicer,Userfulllife)values(@MedicineCode,@MedicineName,@MedKindeCode,@Price,@ListPrice,@Number,@FirmCode,@Userfulllife)exec MedInfor_proc '1001','板蓝根','0002',5,3,'100','014','2010-12-5'exec MedInfor_proc '2002','四季感康','0002',14,10.5,'150','051','2010-12-12'exec MedInfor_proc '2003','银黄颗粒','0002',12,8.8, '120 ','014','2012-10-6'exec MedInfor_proc '2004','感冒清热软胶囊','0002',17,12, '150','015', '2011-11-1'exec MedInfor_proc '3001','阿斯匹林','0003',15,11,'100','014','2010-12-1'exec MedInfor_proc '3002','布洛芬','0003',21,17.5,'120','051','2010-6-5'exec MedInfor_proc '4001','泻利挺','0004',25,20,'120','015','2012-10-2'exec MedInfor_proc '4002','诺氟沙星胶囊','0004',15,12,'100','015','2012-9-16'exec MedInfor_proc '5001','碘酒','0005',5,2.5,'50' ,'051','2012-10-12'exec MedInfor_proc '5002','创口贴','0005',2,1,'250','014','2015-5-1'create proc GueInfor_proc@GuestCode char(10),@GuestName varchar(16),@GLink varchar(12),@GLinkTell varchar(11), @City varchar(8)asinsert into GueInfor(GuestCode,GuestName,GLink,GLinkTell,City) values(@GuestCode,@GuestName,@GLink,@GLinkTell,@City)exec GueInfor_proc '015112','zhangsan','xiaozhang','668401','jiaxing'exec GueInfor_proc '065114','lisi','xiaofang','614425','yuyao'exec GueInfor_proc '052114','wangwu','xiaowu','659024','wenzhou'exec GueInfor_proc '043115','zhaoliu','xiaowu','615874','shangyu'exec GueInfor_proc '014221','awu','xiaozhang','651283','linan'exec GueInfor_proc '025471','asha','xiaofang','691472','dongyang'create proc FirmInfor_proc@FirmCode char(10),@FirmName varchar(16),@Link varchar(12),@LinkTell varchar(11),@City varchar(8)asinsert into FirmInfor(FirmCode,FirmName,Link,LinkTell,City)values(@FirmCode,@FirmName,@Link,@LinkTell,@City)exec FirmInfor_proc '015','yangshengtang','xiaotai','681472','huzhou'exec FirmInfor_proc '014','baozhilin','zhangqing','658421','deqing'exec FirmInfor_proc '051','pinmingdayaofang','oudan','65417','xiangshan'create proc WorkInfor_proc@WorkNo char(10),@Name varchar(12),@UserRegName char(6),@Password char(10),@Position char(10),@Power Intasinsert into WorkInfor(WorkNo,Name,UserRegName,Password,Position,Power)values(@WorkNo,@Name,@UserRegName,@Password,@Position,@Power)exec WorkInfor_proc '075101','ZKL','zkl01','456789','jingli',''exec WorkInfor_proc '075201','ZJM','zjm01','123789','dongshi',''exec WorkInfor_proc '075215','WMX','wmx05','147258','xiaomi',''exec WorkInfor_proc '075120','ZZW','zzm20','123456','buzhang',''create proc sellMain_proc@SaleNo int,@WorkNo char(10),@SaleDate DateTime,@Amount Moneyasinsert into sellMain(SaleNo,WorkNo,SaleDate,Amount)values(@SaleNo,@WorkNo,@SaleDate,@Amount)exec sellMain_proc '12','075101','2009-1-1',1000exec sellMain_proc '13','075201','2009-1-1',1500exec sellMain_proc '15','075215','2009-1-1',800exec sellMain_proc '20','075120','2009-1-1',1200alter proc sellChild_proc@SaleNo int,@MedicineCode char(6),@MedicineName varchar(32),@Price Money,@Number Int,@Uint char(8),@Amount Moneyasinsert into sellChild(SaleNo,MedicineCode,MedicineName,Price,Number,Uint,Amount)values(@SaleNo,@MedicineCode,@MedicineName,@Price,@Number,@Uint,@Amount)exec sellChild_proc '13','1001','板蓝根',5,'20','bao',100exec sellChild_proc '15','2002','四季感康',14,'15','he',210exec sellChild_proc '20','3001','阿斯匹林',15,'20','he',300/*删除数据的存储过程*/create proc MedID_delete_proc@MedKindeCode char(10)asdelete from MedIdwhere MedKindeCode=@MedKindeCodeexec MedID_delete_proc '0002'create proc MedInfor_delete_proc@MedicineName varchar(8)asdelete from MedInforwhere MedicineName=@MedicineNamecreate proc GueInfor_delete_proc@GuestCode char(10)asdelete from GueInforwhere GuestCode=@GuestCodecreate proc FirmInfor_delete_proc@FirmCode char(10)asdelete from FirmInforwhere FirmCode=@FirmCodecreate proc WorkInfor_delete_proc@WorkNo char(10)asdelete from WorkInforwhere WorkNo=@WorkNocreate proc sellMain_delete_proc@SaleNo intasdelete from sellMainwhere SaleNo=@SaleNocreate proc sellChild_delete_proc@SaleNo intasdelete from sellChildwhere SaleNo=@SaleNo/*修改数据的存储过程*/create proc MedID_update_proc@MedKindeCode char(10),@KindExplanation varchar(12),@MedKindeCode1 char(10)asupdate MedIDset MedKindeCode=@MedKindeCode,KindExplanation=@KindExplanationwhere MedKindeCode=@MedKindeCode1exec MedID_update_proc '0002','感冒','0001'create proc MedInfor_update_proc@MedicineCode1 char(6),@MedicineName varchar(8),@MedKindeCode char(10),@Price money,@ListPrice money,@Number int,@FirmCode char(10),@Userfulllife Datetime,@MedicineCode char(6)asupdate MedInforsetMedicineCode=@MedicineCode1,MedicineName=@MedicineName,MedKindeCode=@MedKin deCode,Price=@Price,ListPrice=@ListPrice,Number=@Number,FirmCode=@FirmCode,Userfulllife=@Userfulllife,MedicineCode=@MedicineCodewhere MedKindeCode=@MedKindeCodecreate proc GueInfor_update_proc@GuestCode1 char(10),@GuestName varchar(16),@GLink varchar(12),@GLinkTell varchar(11), @City varchar(8),@GuestCode char(10)asupdate GueInforsetGuestCode=@GuestCode1,GuestName=@GuestName,GLink=@GLink,GLinkTell=@GLinkTell, City=@Citywhere GuestCode=@GuestCodecreate proc FirmInfor_update_proc@FirmCode1 char(10),@FirmName varchar(16),@Link varchar(12),@LinkTell varchar(11),@City varchar(8),@FirmCode char(10)asupdate FirmInforsetFirmCode=@FirmCode1,FirmName=@FirmName,Link=@Link,LinkTell=@LinkTell,City=@Cit ywhere FirmCode=@FirmCodecreate proc WorkInfor_update_proc@WorkNo1 char(10),@Name varchar(12),@UserRegName char(6),@Password char(10),@Position char(10),@Power Int,@WorkNo char(10)asupdate WorkInforsetWorkNo=@WorkNo1,Name=@Name,UserRegName=@UserRegName,Password=@Password,Po sition=@Position,Power=@Powerwhere WorkNo=@WorkNocreate proc sellMain_update_proc@SaleNo1 int,@WorkNo char(10),@SaleDate DateTime,@Amount Money,@SaleNo intasupdate sellMainset SaleNo=@SaleNo1,WorkNo=@WorkNo,SaleDate=@SaleDate,Amount=@Amountwhere SaleNo=@SaleNocreate proc sellChild_update_proc@SaleNo1 int,@MedicineCode char(6),@MedicineName varchar(32),@Price Money,@Number Int,@Uint char(8),@Amount Money,@SaleNo intasupdate sellChildsetSaleNo=@SaleNo1,MedicineCode=@MedicineCode,MedicineName=@MedicineName,Price=@ Price,Number=@Number,Amount=@Amountwhere SaleNo=@SaleNo/*建立存储过程实现单表查询*//*建立名为“单表查询1”的存储过程,用来查询某种药品的信息*/create proc 单表查询1@MedicineCode char(6)ASselect *from MedInforwhere MedicineCode=@MedicineCode/*建立名为“单表查询2”的存储过程,用来查询某个客户的信息*/create proc 单表查询2@GuestCode char(10)ASselect *from GueInforwhere GuestCode=@GuestCode/*建立名为“单表查询3”的存储过程,用来查询某个员工的信息*/create proc 单表查询3@WorkNo char(10)ASselect *from WorkInforwhere WorkNo=@WorkNo/*建立名为“单表查询4”的存储过程,用来查询某个供应商的信息*/create proc 单表查询4@FirmCode char(10)ASselect *from FirmInforwhere FirmCode=@FirmCode/*建立名为“单表查询5”的存储过程,用来查询某个药品代码对应的药品类型的信息*/ create proc 单表查询5@MedKindeCode char(10)ASselect *from MedIDwhere MedKindeCode=@MedKindeCode/*建立存储过程实现连接查询*//*建立名为“连接查询1”的存储过程,用来查询某个药品名称对应的药品类型的信息*/ create proc 连接查询1@MedicineName varchar(8)asselect MedicineName ,KindExplanationfrom MedInfor,MedIDwhere MedID.MedKindeCode=MedInfor.MedKindeCode andMedicineName=@MedicineName/*建立名为“连接查询2”的存储过程,用来查询某个供应商提供的药品类型*/create proc 连接查询2@FirmName varchar(16)asselect FirmName,KindExplanationfrom MedInfor,MedID,FirmInforwhere MedID.MedKindeCode=MedInfor.MedKindeCode andMedInfor.FirmCode=FirmInfor.FirmCode andFirmName=@FirmName/*建立名为“连接查询3”的存储过程,用来查询某个销售员销售某种药品的数量*/ create proc 连接查询3@Name varchar(12),@MedicineName varchar(8)asselect name ,MedInfor.MedicineName,sellChild.Numberfrom WorkInfor,sellChild,MedInfor,sellMainwhere WorkInfor.WorkNo=sellMain.WorkNo andsellMain.SaleNo=sellChild.SaleNo andsellChild.MedicineCode=MedInfor.MedicineCode andname=@Name andMedInfor.MedicineName=@MedicineName/*建立名为“连接查询4”的存储过程,用来查询某类药品的销售量*/ create proc 连接查询4@KindExplanation varchar(12)asselect KindExplanation,sellChild.Numberfrom sellChild,MedID,MedInforwhere MedID.MedKindeCode=MedInfor.MedKindeCode andMedInfor.MedicineCode=sellChild.MedicineCode andKindExplanation=@KindExplanation/*建立名为“连接查询5”的存储过程,用来查询某个员工销售的药品类型*/ create proc 连接查询5@Name varchar(12)asselect Name,KindExplanationfrom sellChild,MedID,MedInfor,sellMain,WorkInforwhere MedInfor.MedicineCode=sellChild.MedicineCode andMedID.MedKindeCode=MedInfor.MedKindeCode andWorkInfor.WorkNo=sellMain.WorkNo andsellMain.SaleNo=sellChild.SaleNo andName=@Name建立存储过程实现嵌套查询/*建立名为“嵌套查询1”的存储过错,用来查询某类药品的销售量*/ create proc 嵌套查询1@KindExplanation varchar(12)asselect Numberfrom sellChildwhere MedicineCode In(select MedicineCodefrom MedIDwhere KindExplanation=@KindExplanation) /*建立名为“嵌套查询2”的存储过错,用来查询某个供应商提供的商品*/ create proc 嵌套查询2@FirmName varchar(16)asselect MedicineNamefrom MedInforwhere FirmCode In (select FirmCodefrom FirmInforwhere FirmName=@FirmName)/*建立存储过程实现集合查询*//*建立名为“集合查询1”的存储过错,用来查询提供某类商品的供应商数*/create proc 集合查询1@MedicineName varchar(8)asselect avg(FirmCode)from FrimInforwhere FirmCode in(select FirmCodefrom MedInfor,FrimInforwhere MedInfor.FirmCode=FrimInfor.FirmCode andMedicineName=@MedicineName)/*建立名为“集合查询2”的存储过错,用来查询药品种类数*/create proc 集合查询2asselect count(MedKindeCode)from MedID/*视图建立*//*1,由药品类别表“MedID”建立一个视图,该视图由药品类别表的所有列构成*/ create view 药品类别(药品类别代码,类别说明)asselect* from MedID/*2,由客户信息表“GueInfor”建立一个视图,该视图由客户信息表的所有列构成*/ create view 客户信息(客户编码,客户名称,联系人,联系电话,所在城市)asselect* from GueInfor/*3,由供应商信息表“FirmInfor”建立一个视图,该视图由供应商信息表的所有列构成*/ create view 供应商信息(供应商编码,供应商名称,联系人,联系电话,所在城市)asselect* from FirmInfor/*建立INSERT触发器*/create trigger MedID_insert on MedIDfor insertas if(select count(*)from MedID_med,insertedwhere MedID_med.MedKindeCode=inserted.MedKindeCode)=0rollback transaction/*建立DELETE触发器*/create trigger delete_MedID on MedIDfor deleteasselect* from MedIDdeclare @MedKindeCode char(10)select @MedKindeCode=MedKindeCode from deleted delete from MedIDwhere MedKindeCode=@MedKindeCodeselect*from MedID*/建立UPDATE触发器*/create trigger MedID_update on MedIDfor updateasif update(MedKindeCode)beginraiserror('you can not modify this column',16,1) rollback transactionend。