use master
go
create database yggl
on
(
name='yggl_data',
filename='C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\yggl.mdf',
size=10MB,
maxsize=50MB,
filegrowth=5%
)
log on
(
name='yggl_log',
filename='C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\yggl_log.ldf',
size=2MB,
maxsize=5MB,
filegrowth=1MB
)
go
use master
go
drop database yggl
create table ss
(
id char(3) not null,
name char(10)
)
create database mydatabase
go
use mydatabase
go
create table employees
(
employeeID char(6) not null primary key,
name char(10) not null,
education char(4) not null,
birthday date not null,
sex bit not null default 1,
workYear tinyint ,
address varchar(40),
phoneNumber char(12),
departmentID char(3) not null
)
create table department
(
departmentID char(3) not null primary key,
departmentName char(20) not null,
note varchar(100)
)
create table salary
(
employeeID char(6) not null primary key,
inCome float not null,
outCome float not null
)
/*将表department的departmentID设为自增列,插入数据时,第一列不用数据。这样在插入数据时第一列能够按顺序排在后面*/
create table department
(
departmentID int identity(1,1) not null primary key,
departmentName char(20) not null,
note varchar(100)
)
/*department表*/
insert into department values('财务部','NULL')
insert into department values('人力资源部','NULL')
insert into department values('经理办公室','NULL')
insert into department values('研发部','NULL')
insert into department values('市场部','NULL')
/*2015/03/12练习*/
/*创建test1数据库的数据文件和日志文件*/
create database test1
on
(
name='test1_data',
filename='E:\mydatabase\test1_data.mdf',
size=5MB,
maxsize=50MB,
filegrowth=10%
)
log on
(
name='test_log',
filename='E:\mydatabase\test1_log.ldf',
size=2MB,
maxsize=5MB,
filegrowth=1MB
);
/*创建test2的数据文件,数据辅助文件和日志文件*/
create database test2
on
(
name='test2_data1',
filename='E:\mydatabase\test2_data1.mdf',
size=20MB,
maxsize=unlimited,
filegrowth=10%
),
(
name='test2_data2',
filename='E:\mydatabase\test2_data2.mdf',
size=20MB,
maxsize=unlimited,
filegrowth=10%
)
log on
(
name='test2_log1',
filename='E:\mydatabase\test2_log1.ldf',
size=50MB,
maxsize=100MB,
filegrowth=10MB
);
/*创建test3的主数据文件和文件组*/
create database test3
on
primary
(
name='test3_data1',
filename='E:\mydatabase\test3_data1.mdf',
size=20MB,
maxsize=60MB,
filegrowth=5MB
),
filegroup test3Group1
(
name='test3_data2',
filename='E:\mydatabase\test3_data2.ndf',
size=10MB,
maxsize=30MB,
filegrowth=10%
)
/*修改test1的数据文件的属性、添加辅助文件和删除辅助数据文件*/
alter database test1
modify file
(
name=test1_data,
maxsize=100MB,
filegrowth=5MB
)
go
alter database test1
add file
(
name='tast1bak',
filename='E:\mydatabase\test1bak.ndf',
size=10MB,
maxsize=50MB,
filegrowth=5%
)
go
alter database test1
remove file test1bak
go
/*2015-03-28练习*/
/*employees表*/
insert into employees values('000001','王林','大专','1966-01-23',1,8,'中山路32-1-508','83355668','2')
insert into employees values('010008','伍容华','本科','1976-03-28',1,3,'北京东路100-2','83321321','1')
insert into employees values('020010','王向容','硕士','1982-12-09',1,2,'四牌楼10-0-108','83792361','1')
insert into employees values('020018','李丽','大专','1960-07-30',0,6,'中山东路102-2','83413301','1')
insert into employees values('102201','刘明','本科','1972-10-18',1,3,'虎踞路100-2','83606608','5')
insert into employees values('102208','朱俊','硕士','1965-09-28',1,2,'牌楼巷5-3-106','84708817','5')
insert into employees values('108991','钟敏','硕士','1979-08-10',0,4,'中山路10-3-105','83346722','3')
insert into employees values('111006','张石兵','本科','1974-10-01',1,1,'解放路34-1-203','84563418','5')
insert into employees values('210678','林涛','大专','1977-04-02',1,2,'中山北路24-35','83467336','3')
insert into employees values('302566','李玉珉','本科','1968-09-20',1,3,'热河路209-3','58765991','4')
insert into employees values('308759','叶凡','本科','1978-11-18',1,2,'北京西路3-7-52','83308901','4')
insert into employees values('504209','陈林琳','大专','1969-09-03',0,5,'汉中路120-4-12','84468158','4')
/*department表*/
insert into department values('1','财务部','NULL')
insert into department values('2','人力资源部','NULL')
insert into department values('3','经理办公室','NULL')
insert into department values('4','研发部','NULL')
insert into department values('5','市场部','NULL')
/*slary表*/
insert into salary values('000001',2100.8,123.09)
insert into salary values('010008',1582.62,88.03)
insert into salary values('020010',2860.0,198.00)
insert into salary values('020018',2347.68,180.00)
insert into salary values('102201',2569.88,185.65)
insert into salary values('102208',1980.0,100.00)
insert into salary values('108991',3259.98,281.52)
insert into salary values('111006',1987.01,79.58)
insert into salary values('210678',2240.0,121.00)
insert into salary values('302566',2980.70,210.20)
insert into salary values('308759',2531.98,199.08)
insert into salary values('504209',2066.15,108.00)
select * from employees
select * from department
select * from salary
/*对表进行修改*/
insert into employees(employeeID,name,education,birthday,departmentID) values('000001','王林' ,'大专','1966-1-23','2')
update salary set inCome=2500 where employeeID='000001';
update salary set inCome=inCome+100;
select * from salary
delete from employees where employeeID='000001'
delete from employees where sex='男'
truncate table salary
select * from salary
select * from employees
/*创建employees3表,使用merge语句将employees表中的数据同步到employees3表中*/
create table employees3
( employeeID char(6) not null primary key,
name char(10) not null,
education char(4) not null,
birthday date not null,
sex bit not null default 1,
workYear tinyint ,
address varchar(40),
phoneNumber char(12),
departmentID char(3) not null
)
merge into employees3
using employees on employees3.employeeID=employees.employeeID
when matched
then update set employees3.name=employees.name,
employees3.education=employees.education,
employees3.birthday=employees.birthday,
employees3.sex=employees.sex,
employees3.workYear=employees.workYear,
employees3.address=employees.address,
employees3.phoneNumber=employees.phoneNumber,
employees3.departmentID=employees.departmentID
when not matched
then insert values(employees.employeeID,employees.name,employees.education,employees.birthday,employees.sex,employees.workYear,employees.address,employees.phoneNumber,employees.departmentID)
when not matched by source
then delete;
select * from employees3
/*2015-4-2练习*/
select * from employees
select address,phoneNumber from employees
select departmentID,sex from employees
select distinct departmentID,sex from employees
select address,phoneNumber from employees
where employeeID='000001'
select employeeID from salary
where inCome>2000
select name,address,birthday from employees
where birthday>'1970'
/*查询财务部员工的编号,姓名*/
select employeeID,name from employees
where departmentID=(select departmentID from department where departmentName='财务部')
select address as 地址,phoneNumber as 电话 from employees
where sex=1
select 姓名=name,出生日期=birthday from employees
where sex=0
/*查询姓名和性别,1显示男,0显示女*/
select name,
case
when sex=1 then '男'
when sex=0 then '女'
end
as 性别
from employees
/*查询employees员工姓名,住址和收入水平,2000元一下显示低收入,2000~3000元显示中等收入,3000元以上显示高收入。*/
select name,address,(select
case
when inCome<2000 then '低收入'
when inCome between 2000 and 3000 then '中等收入'
else '高收入'
end )
As 收入水平
from employees,salary
where employees.employeeID =salary .employeeID
/*简单计算年龄*/
select name,年龄=YEAR (GETDATE ())-YEAR (birthday) from employees
/*查询员工的平均收入*/
select AVG (inCome) from salary
/*查询员工的最大编号*/
select MAX (employeeID) from employees
/*计算员工的总支出*/
select SUM (outCome) from salary
/*查询财务部员工最高和最低的实际收入 */
select MAX (inCome-outCome),MIN (inCome-outCome) from salary where departmentID in (select departmentID from department where departmentName = '财务部')
/*找出所有姓王的员工的部门号*/
select name,departmentID from employees
where name like '王%'
/*找出所有地址中含有"中山"的员工的号码和部门号*/
select employeeID,departmentID from employees
where address like '%中山%'
/*查找员工号码中倒数第二个数字为0的员工的姓名、地址和学历*/
select name,address,education from employees
where employeeID like '%0_'
select name,address,education from employees
where employeeID like '%0[^ ]'
select name,address,education from employees
where employeeID like '%0[0-9]'
/*找出所有收入在2000~3000之间的员工号码*/
select employeeID from salary
where inCome between 2000 and 3000
/*找出所有在部门1或2工作的员工号码*/
select employeeID from employees
where departmentID in ('1','2')
/*使用into语句,由表salary创建“收入在1500元上的员工”表,包括编号和收入*/
select employeeID as 编号,inCome as 收入
into 收入在1500元以上的员工 from salary
where inCome > 1500
select * from 收入在1500元以上的员工
/*使用into 句子,由表employees创建“男员工”表,包括编号和姓名*/
select employeeID as 编号,name as 姓名
into 男员工 from employees
where sex = 1
select * from 男员工
/*查询在财务部工作的员工的情况*/
select * from employees,department
where department .departmentID =employees .departmentID and departmentName ='财务部'
/*查询所有收入在2500元以下的雇员情况*/
select * from employees ,salary
where inCome <2500 and employees.employeeID =salary .employeeID
select * from employees
where employeeID in (select employeeID from salary where inCome < 2500)
/*查询财务部年龄不低于研发部员工年龄的姓名*/
select name from employees
where departmentID in (select departmentID from department where departmentName ='财务部') and
birthday !> all(select birthday from employees where departmentID in
(select departmentID from department where departmentName ='研发部'))
/*查找研发部比所有财务部的雇员收入都高的雇员姓名*/
select name from employees
where employeeID in
(select employeeID from employees where departmentID =
(select departmentID from department where departmentName ='研发部'))
and employeeID in(select employeeID from salary where inCome >all
(select inCome from salary where employeeID in
(select employeeID from employees where departmentID =
(select departmentID from department where departmentName ='财务部'))))
/*查找比所有财务部的雇员收入都高的雇员姓名*/
select name from employees
where employeeID in(select employeeID from salary where inCome >all
(select inCome from salary where employeeID in
(select employeeID from employees where departmentID=
(select departmentID from department where departmentName ='财务部'))))
/*用子查询查找所有年龄比研发部雇员年龄都大的雇员姓名*/
select name,birthday from employees where departmentID in
(select departmentID from department where departmentName ='研发部')
and birthday !>all (select birthday from employees where employeeID in
(select employeeID from employees where departmentID in
(select departmentID from department where departmentName <> '研发部')))
/*查询每个雇员的情况和薪水情况*/
select employees .*,salary .* from employees ,salary
where employees.employeeID =salary .employeeID
/*查询每个雇员的情况及工作部门的情况*/
select employees .*,department .* from employees ,department
where employees .departmentID =department .departmentID
/*使用内连接的方法查询名字为“王林”的员工所在的部门*/
select departmentName from department join employees on
department .departmentID =employees .departmentID where employees .name ='王林'
/*使用内连接方法查找出不在财务部工作的所有员工信息*/
select employees .* from employees join department on
department .departmentID =employees .departmentID
where departmentName !='财务部'
/*使用外连接方法查找出所有员工的月收入*/
select inCome from salary left outer join employees on
employees.employeeID=salary.employeeID
/*查找财务部收入在2000元以上的员工姓名及其薪水详情*/
select name ,inCome ,outCome from employees,salary,department
where employees.employeeID =salary.employeeID
and employees.departmentID =department.departmentID
and departmentName='财务部'
and inCome > 2000
/*查询研发部在1976年以前出生的雇员的姓名及其薪水详情*/
select name,inCome ,outCome,birthday from employees,salary
where year(birthday) <1976 and departmentID =
(select departmentID from department where departmentName = '研发部')
and employees.employeeID=salary.employeeID
/*求财务部雇员的平均收入*/
select avg(inCome) as 平均收入 from salary where employeeID in
(select employeeID from employees where departmentID =
(select departmentID from department where departmentName='财务部'))
/*财务部雇员的最高和最低收入*/
select max(inCome) as 财务部最高收入,min(outCome) as 财务部最低收入 from salary where employeeID in
(select employeeID from employees where departmentID =
(select departmentID from department where departmentName='财务部'))
/*求财务部雇员的平均实际收入*/
select avg(inCome-outCome) as '财务部平均实际收入' from salary
where employeeID in (select employeeID from employees where departmentID =
(select departmentID from department where departmentName='财务部'))
/*财务部雇员的最高和最低实际收入*/
select max(inCome-outCome) as '财务部平均最高实际收入',min(inCome-outCome) as '财务部平均最低实际收入' from salary
where employeeID in (select employeeID from employees where departmentID =
(select departmentID from department where departmentName='财务部'))
/*财务部雇员的总人数*/
select count(employeeID) as '财务部总人数' from employees where departmentID =
(select departmentID from department where departmentName ='财务部')
/*统计财务部收入在2500元以上的雇员人数*/
select count(employeeID) from employees where departmentID =
(select departmentID from department where departmentName ='财务部')
and employeeID in (select employeeID from salary where inCome>2500)
/*查找employees表中男性和女性的人数*/
select sex,count(sex) from employees
group by sex
/*按部门列出在该部门工作的员工人数*/
select departmentName,count(employeeID) from department,employees
where employees.departmentID=department.departmentID
group by departmentName
/*按员工的学历分组,排列出本科,大专和硕士的人数*/
select education,count(employeeID) from employees group by education
/*查找员工数超过2的部门名称和员工数量*/
select employees.departmentID,count(*) as 人数 from employees,department
where employees.departmentID=department.departmentID
group by employees.departmentID
having count(*) > 2
/*按员工的工作年份分组,统计各个工作年份的人数,例如,工作一年多少人,工作两年多少人*/
select workYear,count(*) as 人数 from employees
group by workYear
/*将各雇员的情况按收入由低到高排列*/
select employees.*,salary.* from employees,salary
where employees.employeeID=salary.employeeID
order by inCome
/*将员工信息按出生时间从小到大排列*/
select employees.* from employees order by birthday
/*在order by字句中使用子查询,查询员工姓名,性别和工龄信息,要求按实际收入从大到小排列*/
select name,sex,workYear,inCome,outCome,(inCome-outCome) as '实际收入' from employees,salary
where (inCome-outCome) in (select (inCome-outCome) from salary )
and employees.employeeID=salary.employeeID
order by (inCome-outCome) desc
/*视图设计*/
create view Employees_view(员工号码,姓名,实际收入)
as
select employees.employeeID,name,(inCome-outCome) from employees,salary
where employees.employeeID=salary.employeeID
create view information_view(员工号码,姓名,所在部门,实际收入)
as
select employees.employeeID,name,departmentName,(inCome-outCome) from employees,salary,department
where employees.employeeID=salary.employeeID
and employees.departmentID=department.departmentID
select departmentName from ds_view
where departmentID='3'
select 实际收入 from Employees_view
where 姓名='王林'
insert into ds_view values('6','广告部','广告业务')
update ds_view set departmentName='生产车间'
where departmentID='5'
update Employees_view set 姓名 ='王浩'
where 员工号码='000001'
delete from ds_view
where departmentID='1'
drop view ds_view
create view Emes_view(员工号码,姓名,收入)
as
select employees.employeeID,name,inCome from employees,salary
where employees.employeeID=salary.employeeID
insert into Emes_view values('121321','dw')
/*索引的练习*/
create index depart_ind
on employees(departmentID)
create index ad_ind
on employees(name,address)
create unique index dep_ind
on department(departmentName)
/*将默认索引删除后主键一并删除,在建索引,主键并没有加上*/
create unique clustered index PK_depatrment
on department(departmentID)
/*重建索引*/
alter index all
on employees rebuild
create index de_ind
on employees(departmentID)
/*删除索引*/
drop index depart_ind
on employees
drop index de_ind, ad_ind,name_ind
on employees
create table employees5
(
employeeID char(6) not null constraint UK_id unique,
name char(10) not null primary key,
education char(4) not null,
sex bit not null default 1,
)
/*删除唯一约束*/
alter table employees5
drop constraint UK_id
/*使用复合键做主键*/
alter table cjb
add constraint PK_cjb primary key(xh,kch)
/*添加列并加上unique约束*/
alter table employees5
add address varchar(40)
constraint UK_address unique nonclustered(address)
create table student(
号码 char(6) not null,
性别 char(2) not null check(性别 in ('男','女'))
)
insert into student values('12121','ww')
create table salary2
(
employeeID char(6) not null ,
inCome float not null,
outCome float not null,
check(inCome>=outCome)
)
insert into salary2 values('000001',2100.8,2200.00)
create table employees6
(
employeeID char(6) not null,
birthday date not null,
check(birthday>'1980-01-01')
)
insert into employees6 values('000001','1966-01-23')
alter table employees
add constraint depart check(departmentID between 1 and 5)
/* add constraint depart check(departmentID>=1 and departmentID<=5)*/
insert into employees values('010000','123','本科','1976-03-28',1,3,'北京东路100-2','83321321','6')
/*创建规则对象*/
create rule list_rule
as @list in('财务部','研发部','人力资源部','销售部')
go
exec sp_bindrule 'list_rule','department.departmentName'
create rule workyear_rule
as @workywer between 1 and 20
go
exec sp_bindrule 'workyear_rule','employees.workYear'
/*解除规则绑定,并删除规则对象*/
exec sp_unbindrule 'department.departmentName'
exec sp_unbindrule 'employees.workYear'
go
drop rule workyear_rule,list_rule
create table salary3
(
employeeID char(6) not null primary key,
inCome float not null,
outCome float(8) not null,
foreign key(employeeID) references salary(employeeID)
on update cascade
on delete cascade
)
/*向salary3表中插入与salary 表相同的数据*/
merge into salary3
using salary on salary3.employeeID=salary.employeeID
when matched
then update set salary3.inCome=salary.inCome,
salary3.outCome=salary.outCome
when not matched
then insert values(salary.employeeID,salary.inCome,salary.outCome)
when not matched by source
then delete;
/*
insert into salary3 values('000001',2100.8,123.09)
insert into salary3 values('010008',1582.62,88.03)
insert into salary3 values('020010',2860.0,198.00)
insert into salary3 values('020018',2347.68,180.00)
insert into salary3 values('102201',2569.88,185.65)
insert into salary3 values('102208',1980.0,100.00)
insert into salary3 values('108991',3259.98,281.52)
insert into salary3 values('111006',1987.01,79.58)
insert into salary3 values('210678',2240.0,121.00)
insert into salary3 values('302566',2980.70,210.20)
insert into salary3 values('308759',2531.98,199.08)
insert into salary3 values('504209',2066.15,108.00)
*/
select * from salary3
insert into salary values('000001',2100.8,123.09)
alter table salary
add constraint FK_salary_employees foreign key(employeeID)
references employees(employeeID)
alter table department
add constraint FK_department_employees foreign key(departmentID)
references employees(departmentID)
/*存储过程的练习*/
/*创建存储过程,使用employees表中的员工人数来初始化一个局部变量,并调用存储过程*/
create procedure test @number1 int output
as
begin
declare @number2 int
set @number2=(select COUNT(*) from employees)
set @number1=@number2
end
declare @num int
exec test @num output
select @num
/*创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1*/
create procedure compa @ID1 char(6),@ID2 char(6),@BJ int output
as
begin
declare @sr1 float,@sr2 float
select @sr1=inCome-outCome from salary where employeeID=@ID1
select @sr2=inCome-outCome from salary where employeeID=@ID2
if @ID1>@ID2
set @BJ=0
else
set @BJ=1
end
declare @BJ int
exec compa '000001','108991',@BJ output
select @BJ
/*创建添加职员记录的存储过程employeeAdd*/
create procedure employeeAdd
(
@employeeid char(6),@name char(10),@education char(4),@birthday datetime,@workyear tinyint,@sex bit,@address char(40),@phonenumber char(12),@departmentID char(3)
)
as
begin
insert into employees values(@employeeid,@name,@education,@birthday,@workyear,@sex,@address,@phonenumber,@departmentID)
end
return
exec employeeAdd '990230','刘朝','本科','840909',2,1,'武汉小洪山5号','85465213','3'
select * from employees
/*创建一个带有output游标参数的存储过程,在employees表中声明并打开一个游标*/
create procedure em_ursor @em_cursor cursor varying output
as
begin
set @em_cursor=cursor forward_only static for
select * from employees
open @em_cursor
end
declare @MyCursor cursor
exec em_ursor @em_cursor=@MyCursor output
fetch next from @MyCursor
while (@@FETCH_STATUS=0)
begin
fetch next from @MyCursor
end
close @MyCursor
deallocate @MyCursor
/*创建存储过程,使用游标确定一个员工的实际收入是否排在前三名。结果为1表示是,结果为0表示否*/
create procedure top_three @em_id char(6),@ok bit output
as
begin
declare @x_em_id char(6)
declare @act_in int ,@seq int
declare salary_dis cursor for
select employeeID,inCome-outCome from salary order by inCome-outCome desc
set @seq=0
set @ok=1
open salary_dis fetch salary_dis into @x_em_id,@act_in while @seq<3 and @ok=0
begin
set @seq=@seq+1
if @x_em_id=@em_id
set @ok=1
fetch salary_dis into @x_em_id,@act_in
end
close salary_dis
deallocate salary_dis
end
declare @ok bit
exec top_three '108991',@ok output
select @ok
/*创建存储过程,要求当一个员工的工作年份大于6年时将其转到经理办公室工作。*/
/*没结果*/
create procedure updateDepByYear @empID char(6)
as
begin
declare @year int
select @year=workYear from employees where employeeID=@empID
if(@year>6)
update employees set departmentID=(select departmentID from department
where departmentName='经理办公室') where employeeID=@empID
end
exec updateDepByYear '020018'
select * from employees where employeeID='000001'
/*创建存储过程,根据每个员工的学历将收入提高500元。*/
create procedure up_inCome @employeeid char(6)
as
begin
update salary set inCome=inCome+500 from salary
left join employees on salary.employeeID=employees.employeeID
where salary.employeeID=@employeeid
end
exec up_inCome '020010'
select * from salary where employeeID='020010'
/*创建存储过程,使用游标计算本科及以上学历的员工在总员工数中所占的比例。*/
/*没有的到结果*/
create procedure education_benke
as
begin
declare @i float
declare @j float
declare @education char(4)
declare employees_cursor cursor
for select education from employees
set @i=0
set @j=0
open employees_cursor
fetch employees_cursor into @education
while(@@FETCH_STATUS=0)
begin
if(@education!='大专')
set @i=@i+1
set @j=@j+1
fetch employees_cursor into @education
end
close employees_cursor
select @i as '本科及以上所占员工数'
select @j as '员工总数'
select @i/@j as '本科及以上员工所占比例'
close employees_cursor
end
exec education_benke
/*使用命令方式修改存储过程的定义。*/
/*触发器*/
/*向employees表插入或修改一个记录时,通过触发器检查记录的departmentID值在departments表中是否存在,若不存在,则取消插入修改操作*/
create trigger employeesIns on dbo.employees
for insert,update
as
begin
if((select departmentID from inserted ) not in
(select departmentID from department)) rollback
end
/*验证插入和修改,修改不成功!*/
insert into employees values('000002','王林','大专','1966-01-23',1,8,'中山路32-1-508','83355668','2')
update employees set name='张三' where employeeID='000002'
delete from employees where employeeID='000002'
update employees set employeeID='000002' where employeeID='000001'
update employees set employeeID='000001' where employeeID='000002'
select * from employees
select * from salary
/*修改departments表“departmentID”字段值时,该字段在employees表中的对应值也要做修改。*/
/*修改不成功!*/
create trigger deprtmentsUpdate on dbo.department
for update
as
begin
update employees set departmentID=(select departmentID from inserted)
where departmentID=(select departmentID from deleted)
end
go
update department set departmentID='10' where departmentID='1'
update department set departmentID='1' where departmentID='10'
/*删除department表中记录的同时删除该记录"departmentID"字段在employees表中对应的记录*/
create trigger departmentDelete on dbo.department
for delete
as
begin
delete from employees where departmentID =(select departmentID from deleted)
end
/*创建instead of 触发器,当向salary 表插入记录时,先检查employeeID列上的值在employees中是否存在,如果存在则执行插入操作,如果不存在,则提示‘员工号不存在’*/
create trigger EM_Exists on salary
instead of insert
as
begin
declare @employeeID char(6)
select @employeeID=employeeID from inserted
if(@employeeID in(select employeeID from employees))
insert into salary select * from inserted
else
print '员工号不存在'
end
insert into salary values('111111',2500,123.2)
delete from salary where employeeID='111111'
/*创建DDL触发器,当删除mydatabase数据库的一个表时,提示‘不能删除表’,并回滚删除操作*/
create trigger table_delete on database
after drop_table
as
print '不能删除表!'
rollback transaction
drop table department
/*对于mydatabase数据库,表employees 的employeeID列与表salary的employeeID列应满足参照完整性规则,请用触发器实现两个表间的参照完整性。*/
create trigger salary_insert on salary
for insert,update
as
begin
if((select employeeID from inserted) not in(select departmentID from employees))
rollback
end
create trigger employeesupdate on employees
for update
as
begin
update salary set employeeID=(select employeeID from inserted)
where employeeID=(select employeeID from deleted)
end
create trigger employeesdelete on employees
for delete
as
begin
delete from salary where employeeID =(select employeeID from deleted)
end
insert into salary values('000005',2000,1000)
update employees set employeeID='000000' where employeeID='990230'
delete from employees where employeeID='000000'
/*当修改表Employees时,若将Employees表中员工的工作时间增加1年,则将收入增加500,若增加2年则增加1000,依次增加。若工作时间减少则无变化*/ create trigger em_workyear on employees
after update
as
begin
declare @i int,@j int set @i = (select workYear from inserted)
set @j = (select workYear from deleted)
if(@i>@j)
update salary set InCome =InCome +(@i-@j)*500
where employeeID in (select employeeID from inserted)
end
update employees set workYEar =7 where employeeID='020010'
select * from employees where employeeID='020010'
select * from employees
select * from salary
/*创建update触发器,当Salary表中Income值增加500时,Outcome值则增加50*/
create trigger sa_inCome on salary
for update
as
begin
if((select inCome from inserted)-(select inCome from deleted)=500)
update salary set outCome =outCome+50 where employeeID=(select employeeID from inserted)
end
select inCome,outCome from salary where employeeID='020010'
update salary set inCome = inCome + 500 where employeeID='020010' select inCome,outCome from salary where employeeID='020010'
/*创建instead of触发器,实现向不可更新视图插入数据*/ /*修改不成功!*/ create view A_view
as
select employees.employeeID ,name ,workYear,inCome ,outCome from employees,salary
where employees.employeeID=salary.employeeID
go
create trigger gxst on A_view
instead of insert
as
begin
declare @ei char(6),@name char(10),@wy tinyint ,@ic float ,@oc float select @ei=employeeID,@name=name,@wy=workYear,@ic=inCome,@oc=outCome from inserted
insert into employees(employeeID,name,workYear) values(@ei,@name,@wy) insert into salary values(@ei,@ic,@oc)
end
insert into A_view values('000011','小明',3,2000,1500)
select * from A_view where employeeID='000011'
select * from employees where employeeID='000011'
select * from salary where employeeID='000011'
/*创建DDL触发器,当删除数据库时,提示“无法删除”并回滚删除操作*/
create trigger t_delete on all server after
drop_database
as
print '不能删除该表'
rollback
transaction drop database mydatabase
as
begin
if((select employeeID from inserted) not in(select departmentID from employees))
end