觸發器及常見的SQL語句:
insert
delete
update
insert
delete
update
insert:
USE ITAT
SELECT * FROM NAN
alter trigger tri02
on nan for insert
as
begin
if exists (select * from inserted)
begin
declare @uname varchar(8),@sex char(2),@age int
set @uname=(select 姓名 from inserted)
set @sex=(select 性別 from inserted)
set @age=(select 年齡 from inserted)
print '姓名:'+@uname
print '性別:'+@sex
print '年齡:'+cast(@age as varchar(2))
end
end
on nan for insert
as
begin
if exists (select * from inserted)
begin
declare @uname varchar(8),@sex char(2),@age int
set @uname=(select 姓名 from inserted)
set @sex=(select 性別 from inserted)
set @age=(select 年齡 from inserted)
print '姓名:'+@uname
print '性別:'+@sex
print '年齡:'+cast(@age as varchar(2))
end
end
delete 觸發器: 監控針對某個表是否存放delete 操作,如果有就觸發此類觸發器.
語法:
create trigger 觸發器名
on 表名 for delete
as
begin
SQL 語句
end
臨時表: deleted 存放的是準備刪除的舊數據
實例: 編寫觸發器,實現禁止刪除nan表中的任何數據
select * from nan
delete from nan where 姓名='李四'
實例:不得刪除劉帥.
alter trigger tri03
on nan for delete
as
begin
if exists (select * from deleted where 姓名='劉帥')
begin
print '此人甚爲重要,不得輕易刪除!'
rollback
end
end
alter trigger tri03
on nan for delete
as
begin
if exists (select * from deleted where 姓名='劉帥')
begin
print '此人甚爲重要,不得輕易刪除!'
rollback
end
end
select * from nan
delete from nan where 姓名='劉帥'
delete from nan where 姓名='劉帥'
update 觸發器: 監控對某個表有無update操作,如果有,就觸發此類觸發器.
語法:
create trigger 觸發器名
on 表名 for update
as
begin
SQL 語句
end
臨時表: inserted 更新後的新數據
deleted 更新前的舊數據
deleted 更新前的舊數據
實例:禁止更新nan中的所有信息
update nan set 性別='女'
select * from nan
實例: 禁止更新姓名和性別
alter trigger tri04
on nan for update
as
begin
if update(姓名) or update(性別)
begin
print '禁止更新姓名和性別!!!'
rollback
end
end
alter trigger tri04
on nan for update
as
begin
if update(姓名) or update(性別)
begin
print '禁止更新姓名和性別!!!'
rollback
end
end
實例:
create table s
(
姓名 varchar(8),
性別 char(2),
年齡 int
)
create table c
(
性別 char(2),
人數 int default 0
)
insert into c (性別) values ('男')
insert into c (性別) values ('女')
(
姓名 varchar(8),
性別 char(2),
年齡 int
)
create table c
(
性別 char(2),
人數 int default 0
)
insert into c (性別) values ('男')
insert into c (性別) values ('女')
select * from s select * from c
alter trigger tri05
on s for insert
as
begin
if exists (select * from inserted)
begin
update c set 人數=人數+1 where 性別 in (select 性別 from inserted)
end
end
on s for insert
as
begin
if exists (select * from inserted)
begin
update c set 人數=人數+1 where 性別 in (select 性別 from inserted)
end
end
select * from s select * from c
insert into s values ('張八','男',20)
insert into s values ('李九','女',30)
insert into s values ('張八','男',20)
insert into s values ('李九','女',30)
delete from s
update c set 人數=0
update c set 人數=0
實例: 刪除s表的記錄時,C表的人數隨之減少
instead of 替代觸發器
select * from view_2
SELECT * FROM 公司表
SELECT * FROM 公司表
create trigger 觸發器名
on 視圖名 instead of 操作(insert delete update)
as
begin
SQL 語句
end
select * from view_2
create trigger tri06
on view_2 instead of insert
as
begin
declare @uname varchar(8),@sex char(2),@age int,@gs varchar(10),@address varchar(10),@url varchar(30)
set @uname=(select 姓名 from inserted )
set @sex=(select 性別 from inserted)
set @age=(select 年齡 from inserted)
set @gs=(select 公司名稱 from inserted)
set @address=(select 地址 from inserted)
set @url=(select URL from inserted)
insert into 員工表 values (@uname,@sex,@age)
insert into 公司表 values (@uname,@gs)
insert into 網址表 values (@gs,@address,@url)
end
insert into view_2 values ('李鵬','男',20,'國務院','大興','www.gwy.cn')
實例: 刪除由多個基表組成的視圖中的記錄
delete from view_2 where 姓名='李鵬'
delete from view_2 where 姓名='李鵬'
declare m cursor for select * from yuangong
declare @i int,@c int
set @i=1
set @c=(select count(*) from yuangong)
open m
fetch next from m
while @i<@c
begin
fetch next from m
set @i=@i+1
end
deallocate m
約束數據:
select * from yuangong
insert into yuangong (編號,姓名,性別,年齡,工資) values (15,'小瀋陽','中',28,4000)
insert into yuangong (編號,姓名,性別,年齡,工資) values (15,'小瀋陽','中',28,4000)
達到標準:
1. 域完整性 字段取值範圍
2. 實體完整性 記錄的唯一性
3. 引用完整性 數據一貫的一致性
1. 域完整性 字段取值範圍
2. 實體完整性 記錄的唯一性
3. 引用完整性 數據一貫的一致性
各種約束:
1. default
2. primary key
3. check
4. unique
5. foreign key
default 約束:默認值約束
實例:通過圖形界面創建表,將性別的默認值設置爲男
select * from t1
insert into t1 (id,uname,age) values (1,'張三',20)
實例:通過圖形界面創建表,將性別的默認值設置爲男
select * from t1
insert into t1 (id,uname,age) values (1,'張三',20)
實例:利用命令創建表,將年齡的默認值20
create table t2
(id int,uname varchar(8),
sex char(2),
age int default 20)
create table t2
(id int,uname varchar(8),
sex char(2),
age int default 20)
insert into t2 (id,uname,sex) values (1,'張三','gg')
select * from t2
實例:給現有表增加默認值.
alter table t2 add constraint df_sex default '女' for sex
alter table t2 add constraint df_sex default '女' for sex
insert into t2 (id,uname) values (5,'錢七')
select * from t2
select * from t2
實例:增加錄入日期字段,取當前日期
alter table t2 drop column 錄入日期
alter table t2 add 錄入日期 datetime default getdate()
alter table t2 drop column 錄入日期
alter table t2 add 錄入日期 datetime default getdate()
刪除約束:
語法: alter table 表名 drop constraint 約束名
語法: alter table 表名 drop constraint 約束名
查看當前表的約束
sp_helpconstraint t2
alter table t2 drop constraint df_sex
sp_helpconstraint t2
alter table t2 drop constraint df_sex
CHECK 約束
實例:規定t2表的性別只能是男或女
alter table t2 add constraint ck_sex check (sex='男' or sex='女')
update t2 set age=12 where id=1
select * from t2
實例:規定t2表的性別只能是男或女
alter table t2 add constraint ck_sex check (sex='男' or sex='女')
update t2 set age=12 where id=1
select * from t2
查看約束:
sp_helpconstraint t2
sp_helpconstraint t2
刪除約束:
alter table t2 drop constraint ck_sex
alter table t2 drop constraint ck_sex
實例: 將年齡的取值範圍:18-60(圖形界面)
主鍵約束:
將id設置爲主鍵
select * from t2
alter table t2 add constraint pk_id1 primary key(id)
alter table t2 alter column id int not null
sp_helpconstraint t2
將uname 設置爲主鍵
alter table t2 alter column uname varchar(8) not null
alter table t2 drop constraint pk_id1
alter table t2 add constraint pk_uname primary key(uname)
alter table t2 alter column uname varchar(8) not null
alter table t2 drop constraint pk_id1
alter table t2 add constraint pk_uname primary key(uname)