CREATE DATABASE [exp7]
ON PRIMARY
( NAME = N'exp7',
FILENAME = N'D:\SQLDatabase\exp7.mdf' ,
SIZE = 5120KB ,
MAXSIZE = 10240KB ,
FILEGROWTH = 1024KB )
LOG ON
( NAME = N'exp7_log',
FILENAME = N'D:\SQLDatabase\exp7_log.ldf' ,
SIZE = 1024KB ,
MAXSIZE = 5120KB ,
FILEGROWTH = 1024KB )
GO
USE [exp7]
GO
--2.表的创建
/*部门(部门号,名称,经理名,地址,电话号码)*/
/*Part 部门表的创建*/
CREATE TABLE Part(
PartNo char(10) NOT NULL primary key,--部门号
PName char(20) NOT NULL CONSTRAINT UK_dName unique,--部门名称
PmangerName char(8) ,--经理名
Paddress char(50) ,--地址
Ptelephone char(20) ,--电话号码
);
CREATE TABLE Worker(
WorkerNo char(8) NOT NULL primary key,--职工编号
WorkerName char(8) NOT NULL,--职工姓名
Wage int NOT NULL CONSTRAINT WAgeCK check(Wage>=18 AND Wage<=60),--职工年龄
Wjob char(20) ,--职工职务
Wpay int NOT NULL check(Wpay>=800),--职工工资
partNo char(10) ,--职工部门号
FOREIGN KEY(partNo) references Part(PartNo),
);
INSERT Part VALUES('A01','人事部','张三','珠海大楼6楼601室','020-12345678')
INSERT Part VALUES('A02','信息管理部','李四','珠海大楼5楼501室','020-12345123')
INSERT Part VALUES('A03','市场营销部','王一','珠海大楼5楼502室','020-12345888')
INSERT Part VALUES('A04','财务部','财富','珠海大楼6楼602室','020-12345777')
INSERT Part VALUES('A05','法务部','法官','珠海大楼5楼503室','020-12345666')
INSERT Part VALUES('A06','后勤部','大扎','珠海大楼5楼504室','020-12345555')
INSERT Part VALUES('A07','广告部','广发','珠海大楼5楼505室','020-12348888')
--往职工表中插入信息
INSERT Worker VALUES('A01001','张三','35','总经理','25000','A01')
INSERT Worker VALUES('A01002','张小四','32','副经理','19800','A01')
INSERT Worker VALUES('A01003','张小五','25','职员','12000','A01')
INSERT Worker VALUES('A02001','李四','29','总经理','23500','A02')
INSERT Worker VALUES('A02002','李小五','28','副经理','19500','A02')
INSERT Worker VALUES('A02003','李小六','23','职员','12500','A02')
INSERT Worker VALUES('A03001','王一','36','总经理','32000','A03')
INSERT Worker VALUES('A03002','王小二','33','副经理','29100','A03')
INSERT Worker VALUES('A03003','王小三','29','职员','25600','A03')
INSERT Worker VALUES('A03004','王明','28','职员','25600','A03')
--验证
--(a)定义每个模式的主码;
INSERT Part VALUES('A01','人事部II','张三一','珠海大楼6楼601室','020-12345678')
--部门表中部门号为主码
INSERT Worker VALUES('A01001','张三二','35','总经理','25000','A01')
--职工表中职工号为主码
--(b)定义参照完整性;
INSERT Worker VALUES('A03005','王明','28','职员','25600','A08')
--职工表中的部门号是参照部门表中的部门号
--(c)部门名称不能为空;且不能重复,定义约束名为UK_dName;
INSERT Part VALUES('A08',NULL,'广发','珠海大楼5楼505室','020-12348888')
--验证部门名称不能为空
INSERT Part VALUES('A08','广告部','广发','珠海大楼5楼505室','020-12348888')
--验证部门名称不能重复
--(d)职工的姓名不能为空;
INSERT Worker VALUES('A01003',NULL,'25','职员','12000','A01')
--验证职工名称不能为空
--(e)职工的工资不能为空,且不能小于800;
INSERT Worker VALUES('A01004','张小六','25','职员',NULL,'A01')
--验证职工工资不能为空
INSERT Worker VALUES('A01004','张小六','25','职员','700','A01')
--验证职工工资不能小于800
--(f)定义职工的年龄不能小于18岁,并且不能超过60岁;
INSERT Worker VALUES('A01004','张小六','16','职员','18000','A01')
--验证职工年龄不能小于18岁
INSERT Worker VALUES('A01004','张小六','61','职员','18000','A01')
--验证职工年龄不能大于61岁
--4.将职工的年龄改为不能小于16岁,并且不能大于65岁
ALTER TABLE Worker
DROP CONSTRAINT WAgeCK
--首先删除已经存在的约束
ALTER TABLE Worker
ADD CONSTRAINT WAgeCK CHECK(Wage>=16 AND Wage<=65)
INSERT Worker VALUES('A01004','张小六','61','职员','18000','A01')
INSERT Worker VALUES('A01005','张小七','67','职员','18000','A01')
--验证职工年龄不能大于65
INSERT Worker VALUES('A01005','张小八','16','职员','18000','A01')
INSERT Worker VALUES('A01006','张小狗','15','职员','18000','A01')
--验证职工年龄不能小于16岁
/*
(4)定义一个表tbl_Emp_Log(eNO, eSalary, Username, ModifyDate);在职工表上定义修改和插入数据的触发器。
A. 将插入的职工号和工资数据填入到Emp_log表中,并记录操作的用户(Username)和插入时间(ModifyDate);(SQL语句)
B. 如果修改了职工的工资,也把职工号和修改后的工资数据填入到Emp_log表中,并记录操作的用户(Username)和插入时间(ModifyDate)。(SQL语句)
使用SQL语句向职工表中插入数据和修改工资,验证触发器的效果。(SQL语句及结果截图)
*/
CREATE TABLE tbl_Emp_Log(
eNO char(8) NOT NULL,--职工号
eSalary int NOT NULL ,--职工工资
Username char(10) NOT NULL,--操作的用户
ModifyDate datetime NOT NULL,--插入时间
primary key(eNO,ModifyDate),
);
CREATE TRIGGER insert_Emp
ON Worker
FOR INSERT
AS
BEGIN
insert into tbl_Emp_Log
select WorkerName,Wpay, User_name(), getDate()
from Inserted;
end
--插入数据
INSERT Worker VALUES('A01006','张小狗','25','职员','18000','A01')
--验证
select *
FROM tbl_Emp_Log
--删除触发器
drop trigger insert_Emp
CREATE TRIGGER update_Emp
ON Worker
FOR update
AS
IF update(Wpay)
begin
declare @eSeleryOld money,@eSeletyNew money
select @eSeleryOld=Wpay
from Deleted
select @eSeletyNew=Wpay
from Inserted
if(@eSeleryOld<>@eSeletyNew)
insert into tbl_Emp_Log
select WorkerName,Wpay, User_name(), getDate()
from Inserted;
end
--更新工资
UPDATE Worker
SET Wpay=19000
WHERE WorkerNo='A01006'
--验证
select *
FROM tbl_Emp_Log
--删除触发器
drop trigger update_Emp
select *
FROM Part
select *
FROM Worker