数据库实践第二次作业

/*    
标题:数据库实践第二次作业  
作者:030902207 黄福强  
时间:2012-04-12  
说明:    
问题及描述:    
--1.学生表    
Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别    
--2.课程表     
Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号    
--3.教师表     
Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名    
--4.成绩表     
SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数    
*/  
--(1) 数据库保护,备份还原,完整性,安全性
--备份所创建的数据库,还原数据库
exec sp_dropdevice 'sales_backup'
--添加一个名为sales_backup 的磁盘备份设备,其物理名称为f:\hfq\sales_backup.bak
exec sp_addumpdevice  'disk','sales_backup','f:\hfq\sales_backup.bak'
--BACKUP DATABASE 命令进行完整数据库备份
backup database hfq to sales_backup with noinit 
--从sales_backup备份设备中还原完全数据库
USE master
GO
RESTORE  DATABASE  hfq
    FROM  disk = 'f:\hfq\sales_backup.bak'

--添加账号或 用户
create login hfq with password='hfq123456'
alter login hfq with name  = hfq_new
alter login hfq_new with password = '123'
--drop login hfq_new 
--对用户授予权限,收回权限
use hfq
go 
create user user1 from login hfq_new 
--给用户user1创建表的权限
use hfq
go
grant create table to user1
--收回用户user1创建表的权限
use hfq 
go 
revoke create table from user1
USE hfq
GO 
GRANT SELECT,UPDATE,INSERT 
ON SC TO user1
Go

--创建自定义约束(非空、唯一、唯一值、check)
--修改学生表,自定义   学生姓名不能为空   约束
alter table Student
add constraint ck_sname check(sname is not null)
--修改课程表,自定义   课程名不能重复,唯一   约束
alter table  Course
add constraint unique_cname  unique(cname)
--修改学生选课表,自定义   学生课程成绩在0-100分   约束
alter table SC
add constraint ck_sc_score check(score between 0 and 100)

--(2)触发器,存储过程的使用
create trigger tr_teacher
on teacher 
after insert--(FOR ALTER_TABLE)当修改表结构时
--FOR | AFTER | INSTEAD OF  [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ]  
as
begin 
print('刚刚插入一条数据在teacher表')
end 
--test
insert into teacher(t#,tname) 
values(09,'快快快')

--查看触发器
sp_helptrigger teacher--返回对当前数据库的指定表上定义的DML 触发器的类型
sp_help teacher

--创建insert插入类型触发器
if (object_id('insert_or_update_age', 'tr') is not null)   
drop trigger insert_or_update_age
create trigger insert_or_update_age  on student 
for insert
as
begin
select s#,sname,sage,ssex from inserted;
end

insert into student(s#,sname,sage,ssex)
values(09,'hfq','1991-12-1 0:00:00','男')

if (object_id('insert_or_update_ssex', 'tr') is not null)   
drop trigger insert_or_update_ssex
--如果插入的学生性别不是男跟女,赋值为男
create trigger insert_or_update_ssex  on student 
for insert
as
if((select ssex from inserted) not in('男','女'))
begin
update student set ssex = '男' where s#
in (select S# from inserted);
end

insert into student(s#,sname,sage,ssex)
values(19,'hfq2','1991-12-1 0:00:00','1')

---存储过程
exec sp_databases; --查看数据库
exec sp_tables;        --查看表

--创建一个无参的存储过程,用左连接实现,用于查询学生及其选修的课程
if exists(select name from sysobjects where name='pro_student' and type='p')
Drop procedure pro_student
use hfq
go
create procedure pro_student
as
select temp.sname,c.cname from (
select sname,c#
from student s left join sc sc on 
s.s# = sc.s#) temp left join
course c on
c.c# = temp.c#
--执行
exec pro_student

--创建一个带参数学号的存储过程,用于查询该学号对应
--的学生的姓名,选修的课程以及课程的成绩及其对应的老师
if exists(select name from sysobjects where name='pro_student_para' and type='p')
Drop procedure pro_student_para
create procedure pro_student_para
@no varchar(10)
as
select sname,cname,score,tname
from student s,sc sc,course c,teacher t
where s.s#=@no and s.s#=sc.s# and sc.C#=c.c# and c.t#=t.t#;
--执行
exec pro_student_para @no='01';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章