请教!视图的触发 ,谢谢

real_name 2005-01-03 06:39:49
联系人表: 家庭表:
人名 家庭号----(关联)------ 家庭号(主键) 家庭名
a 1 1 叔叔
b 1 2 朋友
c 2 (本列自增)
d
现在我键了个视图
SELECT 联系人表.人名, 家庭表.家庭名
FROM 家庭表 RIGHT OUTER JOIN
联系人表 ON 联系人表.家庭号=家庭表.家庭号
我想插(e,同学张) 入view1 让联系人表、家庭表自动插入(e,X),(X,同学张)
X为任意一个数
create TRIGGER JR
ON view1
INSERT of
AS
怎么写啊?
用别的办法也可以!谢谢



...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
real_name 2005-01-04
  • 打赏
  • 举报
回复
谢谢
long0104 2005-01-04
  • 打赏
  • 举报
回复
create table a (a int,aa varchar(100))
create table b (b int,bb varchar(100))
go
create view c
as
select a.*,b.* from a,b where a.a=b.b
go

--测试:
insert c values(1,'aa',1,'bb')
--失败

go
CREATE TRIGGER 名 on c
INSTEAD OF INSERT
AS
BEGIN
INSERT a select a,aa from inserted
INSERT b select b,bb from inserted
END
go

--测试:
insert c values(1,'aa',1,'bb')
NinGoo 2005-01-03
  • 打赏
  • 举报
回复
--测试结果

name family
---------- -----------
a 1
b 1
c 2
e 3

(所影响的行数为 4 行)

family fname
----------- ----------
1 叔叔
2 朋友
3 同学张

(所影响的行数为 3 行)
NinGoo 2005-01-03
  • 打赏
  • 举报
回复
create table t1(name varchar(10),family int) --联系人表

create table t2(family int identity(1,1),fname varchar(10)) --家庭表


insert into t1 --插入测试数据
select 'a',1
union all select 'b',1
union all select 'c',2

insert into t2(fname)
select '叔叔'
union all select '朋友'

create view v1 --建立测试view
as
SELECT t1.name, t2.fname
FROM t2 RIGHT OUTER JOIN
t1 ON t1.family=t2.family

create trigger tr_vtest --建立测试trigger
on v1
instead of insert
as
declare @fname varchar(10)
declare @name varchar(10)
declare @tmp int
select @fname=fname from inserted
insert into t2(fname) values (@fname)
select @tmp=family from t2 where fname=@fname
select @name=name from inserted
insert into t1 values(@name,@tmp)

insert into v1 values('e','同学张') --测试插入

select * from t1 --查看测试结果

select * from t2
real_name 2005-01-03
  • 打赏
  • 举报
回复
非常感谢你的回答,可是你还没明确回答我的要求啊,
我比较笨,你能不能说的明确点啊, 谢谢!
-------------插(e,同学张) 入view1
让联系人表、家庭表自动插入(e,X),(X,同学张)
X为任意一个数
631799 2005-01-03
  • 打赏
  • 举报
回复
指定触发器何时激发
可指定以下两个选项之一来控制触发器何时激发:

AFTER 触发器在触发操作(INSERT、UPDATE 或 DELETE)后和处理完任何约束后激发。可通过指定 AFTER 或 FOR 关键字来请求 AFTER 触发器。因为 FOR 关键字与 AFTER 的效果相同,所以具有 FOR 关键字的触发器也归类为 AFTER 触发器。


INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。
对于每个触发操作(UPDATE、DELETE 和 INSERT),每个表或视图只能有一个 INSTEAD OF 触发器。而一个表对于每个触发操作可以有多个 AFTER 触发器。
631799 2005-01-03
  • 打赏
  • 举报
回复
继续举例:

create table a (a int,aa varchar(100))
create table b (b int,bb varchar(100))
go
create view c
as
select a.*,b.* from a,b where a.a=b.b
go

--测试:
insert c values(1,'aa',1,'bb')
--失败

go
CREATE TRIGGER 名 on c
INSTEAD OF INSERT
AS
BEGIN
INSERT a select a,aa from inserted
INSERT b select b,bb from inserted
END
go

--测试:
insert c values(1,'aa',1,'bb')
631799 2005-01-03
  • 打赏
  • 举报
回复

视图中只能用替代触发器(instead of)!
for example:

CREATE VIEW dbo.VIEW1
AS
SELECT b, a
FROM dbo.表1
并在视图上建立了这样一个触发器
CREATE TRIGGER [TR_view1] ON [dbo].[VIEW1]
instead of INSERT
AS
insert 表2 values(33,33)
go

insert view1 values(1,2)
select * from table1-----------无数据
select * from table2-----------有数据

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧