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