Sql Server 使用T-Sql 面向工业领域中商品的进货、销售、库存和记账等业务开发一个数据库应用系统:某客户、供应商以及他们之间往来的商品如汽车、电器等,需有效地记录这些商品进货、库存等账目,

根据以下业务要求要求完成数据库应用系统开发

面向工业领域中商品的进货、销售、库存和记账等业务开发一个数据库应用系统:某客户、供应商以及他们之间往来的商品如汽车、电器等,需有效地记录这些商品进货、库存等账目,并登记客户和供应商的往来款项以便及时收/款。(注意往来款项不需要即时结清。)
以下为系统开发的主要内容(100分)
1.(5分)描述该应用系统的业务逻辑(不超过100字)。
2.(10分)设计满足该应用系统业务需求的E-R图;
3.(20分)把E-R图转换成关系模型,说明主键和外键;满足1NF/2NF/3NF。
4.(5分)用T-SQL创建数据库,至少包括一个主数据文件和两个次数据文件,并放置在个不同文件组中。
5.(20分)用T-SQL创建与ER图相符的表,表放在不同文件夹下;建立表之间联系,实现主外键约束;至少建立一个规则并绑定;至少建立一个表级约束并注明功能。
6.(5分)用T-SQL在销售记录表上建立索引
7.(10分)用T-SQL完成向销售记录表或进货记录表中插入数据(注意满足主外键约束,记录不少于10条。
8.(10分)用T-SQL查询某客户在一年内的购买商品记录以及付款记录;并创建为视图。
9.(10分)用T-SQL在销售记录表或进货记录表上创建触发器完成相关表的数据更新。
10.(5分)用T-SQL完成销售人员角色的往来账目查询授权。

1. 新建查询创建数据库

1.1 创建文件夹
在这里插入图片描述
1.2 新建查询
在这里插入图片描述
输入以下sql然后执行

IF EXISTS(SELECT * FROM SYS.DATABASES WHERE NAME = 'manger')
DROP DATABASE manger

CREATE DATABASE manger	--创建数据库

ON PRIMARY				-- 默认文件组	主数据文件
(					
	NAME='manger_data',									-- 逻辑文件名
	FILENAME='F:\sqlServer\parmary\manger_data.mdf',	-- 物理文件名
	SIZE=5MB,											-- 初始大小5MB
	MAXSIZE=15MB,										-- 最大15MB
	FILEGROWTH=20%										-- 每次增加20%
),
FILEGROUP group1		-- 文件组1	次数据文件1
(
	NAME='manger_group1',
	FILENAME='F:\sqlServer\group1\manger_group1.ndf',
	SIZE=1MB,
	MAXSIZE=10MB,
	FILEGROWTH=1MB
),
FILEGROUP group2		-- 文件组2	次数据文件2
(
	NAME='manger_group2',
	FILENAME='F:\sqlServer\group2\manger_group2.ndf',
	SIZE=1MB,
	MAXSIZE=10MB,
	FILEGROWTH=1MB
)

LOG ON
(					--日志
	NAME='manger_log',
	FILENAME='F:\sqlServer\log\manger_log.ldf',
	SIZE=5MB,
	MAXSIZE=10MB,
	FILEGROWTH=1MB
)

此时数据库manger就创建好了
在这里插入图片描述

2.创建表

同样的,新建查询执行下面的sql

use manger;        
go  

---商品表
if exists(select * from sysobjects where name = 'commodity')   
drop table commodity   
create Table commodity   
(   
 commodity_id		int				not null	identity,				--商品编号		非空约束,自增约束
 commodity_name		varchar(50)		not null,							--商品名称		非空约束
 commodity_price	decimal(20,2)	not null,							--商品价格		非空约束
 commodity_detail	varchar(500),										--商品详情
 commodity_launch_date datetime		not null	default(getdate()),		--生产日期 默认得到系统时间		非空约束,默认值约束
 commodity_pic_address varchar(100),									--生产地址
 constraint PK_commodity_id			primary key (commodity_id)	--表级约束:主键 
);  


---客户表
if exists(select * from sysobjects where name = 'customer')   
drop table customer   
create Table customer   
(   
 customer_id		int				not null	identity,				--客户编号	非空约束,自增约束
 customer_name		varchar(50)		not null,							--客户名称	非空约束
 customer_address	varchar(100),										--客户地址
 customer_contact	varchar(50)		not null,							--联系方式	非空约束
 constraint PK_customer_id			primary key (customer_id)	--表级约束:主键
);


---供应商表
if exists(select * from sysobjects where name = 'supplier')   
drop table supplier   
create Table supplier   
(   
 supplier_id		int				not null	identity,				--供应商编号	非空约束,自增约束
 supplier_name		varchar(50)		not null,							--供应商名称	非空约束
 supplier_address	varchar(100),										--供应商地址
 supplier_contact	varchar(50)		not null,							--联系方式		非空约束
 constraint PK_supplier_id			primary key (supplier_id)	--表级约束:主键
);


---库存表
if exists(select * from sysobjects where name = 'stock')  
drop table stock;
create Table stock 
(   
 stock_id			int				not null	identity,				--库存编号		非空约束,自增约束
 stock_number		int				not null	default(0),				--库存数量		非空约束,默认值约束
 commodity_id		int				not null,							--商品编号		非空约束
 customer_id		int							default(null),			--客户编号		非空约束,默认值约束
 supplier_id		int							default(null),			--供应商编号	非空约束,默认值约束
 constraint PK_stock_id				primary key (stock_id),												-- 表级约束:主键
 constraint	FK_commodity_stock		foreign key (customer_id) references commodity(commodity_id),		-- 表级约束:外键
 constraint	FK_customer_stock		foreign key (customer_id) references customer(customer_id),			-- 表级约束:外键
 constraint	FK_supplier_stock		foreign key (supplier_id) references supplier(supplier_id)			-- 表级约束:外键
);



---付款记录表
if exists(select * from sysobjects where name = 'payment')   
drop table payment 
create Table payment 
(   
 payment_id			int				not null	identity,				--付款编号		非空约束,自增约束
 is_pay				bit				not null	default(0),				--是否付款		非空约束,默认值约束
 payment_date		datetime					default(getdate()),		--付款日期		默认值约束
 customer_id		int				not null,							--客户编号		非空约束
 supplier_id		int				not null,							--供应商编号	非空约束,
 constraint PK_payment_id			primary key (payment_id),										-- 表级约束:主键
 constraint	FK_customer_payment		foreign key (customer_id) references customer(customer_id),		-- 表级约束:外键
 constraint	FK_supplier_payment		foreign key (supplier_id) references supplier(supplier_id)		-- 表级约束:外键
);


-----------------------------------------------------------------------------规则rule
---删除规则
drop rule payment_pay_rule;

-- 创建规则
go
-- 支付状态的值只有0和1两种
create rule payment_pay_rule
as @value in (0,1);

go

-- 查看规则
--EXEC sp_helptext 'payment_pay_rule'

---将规则payment_pay_rule绑定到payment的is_pay列上,支付状态的值只有0,1两种 
exec sp_bindrule payment_pay_rule, 'payment.is_pay';


---将规则解除绑定
--exec sp_unbindrule 'payment.is_pay'
------------------------------------------------------------------------------规则rule

---进货记录表
if exists(select * from sysobjects where name = 'purchase')   
drop table purchase 
create Table purchase 
(   
 purchase_id			int				not null	identity,				--进货编号		非空约束,自增约束
 purchase_date			datetime		not null	default(getdate()),		--进货日期		非空约束,默认值约束
 purchase_number		int				not null,							--进货数量		非空约束
 purchase_final_price	decimal(20,2)	not null,							--成交价		非空约束
 commodity_id			int				not null,							--商品编号		非空约束
 customer_id			int							default(null),			--客户编号		非空约束,默认值约束
 supplier_id			int							default(null),			--供应商编号	非空约束,默认值约束
 constraint PK_purchase_id			primary key (purchase_id),										-- 表级约束:主键
 constraint	FK_commodity_purchase	foreign key (customer_id) references commodity(commodity_id),	-- 表级约束:外键
 constraint	FK_customer_purchase	foreign key (customer_id) references customer(customer_id),		-- 表级约束:外键
 constraint	FK_supplier_purchase	foreign key (supplier_id) references supplier(supplier_id)		-- 表级约束:外键
);


---销售记录表
if exists(select * from sysobjects where name = 'sales')   
drop table sales 
create Table sales 
(   
 sales_id				int				not null	identity,				--销售编号		非空约束,自增约束
 sales_date				datetime		not null	default(getdate()),		--销售日期		非空约束,默认值约束
 sales_number			int				not null,							--销售数量		非空约束
 sales_final_price		decimal(20,2)	not null,							--成交价		非空约束
 commodity_id			int				not null,							--商品编号		非空约束 
 customer_id			int							default(null),			--客户编号		非空约束,默认值约束
 supplier_id			int							default(null),			--供应商编号	非空约束,默认值约束
 constraint PK_sales_id				primary key (sales_id),											-- 表级约束:主键
 constraint	FK_commodity_sales		foreign key (customer_id) references commodity(commodity_id),	-- 表级约束:外键
 constraint	FK_customer_sales		foreign key (customer_id) references customer(customer_id),		-- 表级约束:外键
 constraint	FK_supplier_sales		foreign key (supplier_id) references supplier(supplier_id)		-- 表级约束:外键
);


----------------------------------------------------------------------索引index
-- 以sales表的sales_id与sales_date来建立索引
create index Index_sales_id_date
on sales(sales_id,sales_date)
--with (drop_existing=on)		--在创建时如果已有索引先删除
----------------------------------------------------------------------索引index

此时刷新以下数据库的表,就能看见创建的表了
在这里插入图片描述

3. 创建触发器

新建查询执行:

use manger;

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON


go
create trigger trigger_sales_purchase		--首次创建CREATE,后续修改ALTER:更新、新增触发器
on sales				--在sales表中创建触发器
after insert,update		--更新、新增事件触发
AS						--执行下面的SQL语句

DECLARE @PerID AS INT	--定义变量
SELECT @PerID=sales_id FROM inserted									--变量赋值:临时表inserted中存放的新id

IF EXISTS(SELECT purchase_id FROM purchase WHERE purchase_id=@PerID)	--如果记录已存在,执行UPDATE操作
BEGIN
	print(@PerID);

	UPDATE purchase SET							--将临时表inserted中的数据更新到purchase表中
		purchase_date=sales_date,
		purchase_number=sales_number,
		purchase_final_price=sales_final_price,
		purchase.commodity_id=inserted.commodity_id,
		purchase.customer_id=inserted.customer_id,
		purchase.supplier_id=inserted.supplier_id
		
	FROM inserted WHERE purchase_id=@PerID

END

ELSE IF @PerID IS  NOT NULL						--如果记录不存在且id不为空,执行INSERT操作
BEGIN

	print(@PerID);
	SET IDENTITY_INSERT purchase ON	--允许主键插入显式值

	INSERT INTO purchase(						--将临时表inserted中的数据插入purchase表中
	purchase_id,purchase_date,purchase_number,purchase_final_price,commodity_id,customer_id,supplier_id
	)SELECT 
	sales_id,sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id
	FROM inserted

	SET IDENTITY_INSERT purchase OFF		--禁止主键插入显式值

END

这个触发器的作用是将sales表与purchase表绑定,当sales发生插入或者更新数据时,会触发触发器而使得purchase同步更新


允许后,刷新即可看到
在这里插入图片描述


4. 插入数据

执行下面的sql

use manger;
go

-- 商品
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('自行车01',1200.00,'山地自行车,经久耐骑',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('自行车02',2400.00,'山地自行车,经久耐骑',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('自行车03',899.00,'山地自行车,经久耐骑',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('自行车04',6000.00,'山地自行车,经久耐骑',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('自行车05',5400.00,'山地自行车,经久耐骑',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('自行车06',1199.00,'山地自行车,经久耐骑',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('格力空调',1999.00,'一晚只需一度电',GETDATE(),'中国·上海')
insert into commodity(commodity_name,commodity_price,commodity_detail,commodity_launch_date,commodity_pic_address) values('海尔冰箱',10899.00,'节能王',GETDATE(),'中国·上海')

-- 客户
insert into customer(customer_name,customer_address,customer_contact)values('胡先生','湖南省长沙市','123456789')
insert into customer(customer_name,customer_address,customer_contact)values('乐骑车行','山东省济南市','123456789')
insert into customer(customer_name,customer_address,customer_contact)values('xdm自行车连锁店','四川省成都市','123456789')

-- 供应商
insert into supplier(supplier_name,supplier_address,supplier_contact)values('上海浩能','上海市奉贤区','123456789')
insert into supplier(supplier_name,supplier_address,supplier_contact)values('刘先生','宁波市余姚市小曹娥镇','123456789')
insert into supplier(supplier_name,supplier_address,supplier_contact)values('吉利汽车','上海市','123456789')

-- 库存
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(80000,1,null,1)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(2000,5,null,1)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(20,4,2,null)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(13,4,null,3)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(12,7,2,null)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(25,5,1,null)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(20000,1,null,1)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(9,3,2,null)
insert into stock(stock_number,commodity_id,customer_id,supplier_id)values(60000,2,null,2)


-- 销售记录表
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('1999-12-16 19:25:41',10,12000,1,1,1);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2001-12-16 19:25:41',1,2400,2,1,2);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2006-12-16 19:25:41',100,119900,6,1,3);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2008-12-16 19:25:41',10,12000,1,1,1);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2010-12-16 19:25:41',10,12000,1,2,1);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2012-12-16 19:25:41',10,12000,1,2,1);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2015-12-16 19:25:41',10,12000,1,3,1);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2019-12-16 19:25:41',5,12000,1,3,2);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2021-12-16 19:25:41',1,2400,2,2,2);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values('2021-12-16 19:25:41',100,119900,6,1,3);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values(GETDATE(),10,12000,1,1,3);
insert into sales(sales_date,sales_number,sales_final_price,commodity_id,customer_id,supplier_id) values(GETDATE(),10,11990,6,2,3);


-- 付款记录表
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'1999-12-16 19:25:41',1,1);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2001-12-16 19:25:41',1,2);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2006-12-16 19:25:41',1,3);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2008-12-16 19:25:41',1,1);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2010-12-16 19:25:41',2,1);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2012-12-16 19:25:41',2,1);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2015-12-16 19:25:41',3,1);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2019-12-16 19:25:41',3,2);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2020-12-16 19:25:41',2,2);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(1,'2021-12-16 19:25:41',1,3);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(0,'2021-12.31 15:22:34',1,3);
insert into payment(is_pay,payment_date,customer_id,supplier_id)values(0,GETDATE(),2,3);

运行结束后,打开表即可看到数据,这里可以查看以下进货记录表purchase,上面的sql中并没有为其插入数据,但是其中确是有数据的,就是触发器的作用了
在这里插入图片描述

5. 创建视图

use manger;
go

create view v_pay																			-- 根据查询结果创建视图
as
select * from payment where DATEDIFF(YYYY,payment_date,GETDATE())=0	and customer_id = (		-- 查询该顾客一年内的付款记录
	select customer_id from customer where customer_name='胡先生'							-- 嵌套查询,查询客户 胡先生 的编号
);


go

create view v_sale																			-- 根据查询结果创建视图
as
select * from sales where DATEDIFF(YYYY,sales_date,GETDATE())=0	and customer_id = (			-- 查询该顾客一年内的购买记录
	select customer_id from customer where customer_name='胡先生'							-- 嵌套查询,查询客户 胡先生 的编号
);

6. 创建角色并授权

use manger;
go

create role Select_SalesPerson  --创建角色
 
GRANT select ON OBJECT::sales
TO Select_SalesPerson;

ER图

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值