数据控制—完整性约束

/*
    数据库实验七
    2017/05/18

具体操作内容:
创建以下两个关系模式,并分别插入相应的数据。
    职工(职工号,姓名,年龄,职务,工资,部门号)其中职工号为主码;
    部门(部门号,名称,经理名,地址,电话号码),其中部门号为主码;

(1)使用SQL语言定义这两个关系模式,并完成以下完整性约束条件的定义;(SQL语句脚本;及结果截图)
    (a)定义每个模式的主码;
    (b)定义参照完整性;
    (c)部门名称不能为空;且不能重复,定义约束名为UK_dName;
    (d)职工的姓名不能为空;
    (e)职工的工资不能为空,且不能小于800;
    (f)定义职工的年龄不能小于18岁,并且不能超过60岁;

(2)使用SQL语言分别向每个表中进行至少7条插入操作,验证上面的各种约束条件;(SQL语句既要截图,也要sql脚本文件)

(3)将职工的年龄改为不能小于16岁,并且不能大于65岁;

(4)定义一个表tbl_Emp_Log(eNO, eSalary, Username, ModifyDate);在职工表上定义修改和插入数据的触发器。

*/

/*1.数据库的创建*/

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) ,--电话号码
);

/*职工(职工号,姓名,年龄,职务,工资,部门号)*/
/*Worker 职工表的创建*/
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),
);

--3.往表中插入数据

--往部门表中插入信息
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)职工的工资不能为空,且不能小于800INSERT Worker VALUES('A01004','张小六','25','职员',NULL,'A01')
    --验证职工工资不能为空
INSERT Worker VALUES('A01004','张小六','25','职员','700','A01')
    --验证职工工资不能小于800

--(f)定义职工的年龄不能小于18岁,并且不能超过60岁;
INSERT Worker VALUES('A01004','张小六','16','职员','18000','A01')
    --验证职工年龄不能小于18INSERT Worker VALUES('A01004','张小六','61','职员','18000','A01')
    --验证职工年龄不能大于61岁

--4.将职工的年龄改为不能小于16岁,并且不能大于65ALTER 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

你可能感兴趣的:(数据库SQL)