有一个表:TABLE:ID,NAME两个字段,
其中的NAME字段有三个值:AA,BB,CC,如果用户试图修改这三个值时,我想写一个触发器不允许用户修改这三个值,应该怎么写这个触发器?
其中的NAME字段有三个值:AA,BB,CC,如果用户试图修改这三个值时,我想写一个触发器不允许用户修改这三个值,应该怎么写这个触发器?
解决方案 »
- Delphi调用VC++的动态库问题
- 如何把网页上的图片另存为BMP格式的图片(也就是如何调用网页中的图片另存为功能)
- 水晶报表问题,高手请进!!!!!!!!!!!!!!!!!!!!!!
- 真诚的请教大家,希望得到帮助!
- 在线求助:如何在确定的数值范围内随机取值?
- 在delphi中如何直接打开一个html文件?
- 这段程序错在哪?
- 怎样让MDIChild的窗体打开时,出现闪动,即刚开始出现时较小,紧跟着最大化。
- delphi 与mscomm32.ocx
- 菜鸟求救:如何分页打印数据
- dll可不可以封装多个窗体?并能独立或交叉调用!各个窗体之间能否传参数?有无示例?在线急等
- 高级写文件流问题!!!!!
begin
if (select count(*) from deleted) > 0
begin
raiseerror('不能修改',16,1)
rollback trasaction
end
end
create table t (
Col01 int , Col02 int , Col03 int , Col04 int ,
Col05 int , Col06 int , Col07 int , Col08 int ,
Col09 int , Col10 int , Col11 int , Col12 int ,
Col13 int , Col14 int , Col15 int , Col16 int ,
Col17 int
);
go
insert into t values (
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17
);
go
create trigger tri_test on t for
update
as
begin
declare @i int
select @i=count(*) from syscolumns where id=object_id('t')
while @i>0
begin
if (@i=2) and (substring( columns_updated() , (@i-1)/8+1 , 1 ) & power( 2, (@i-1)%8 )) > 0 --以第二列为例
begin
rollback tran --回滚
RAISERROR ('不能修改指定字段', 16, 1)
end
set @i=@i-1
end
end
go
update t set col17=1,col15=1,col16=1,col14=1,col09=1,col11=1,col01=1,col02=1,col03=1
go
在楼上朋友的trigger中增加一条语,也以第二列为例,比如当第二列值为2进,不能修改当前记录的第二列值create table t (
Col01 int , Col02 int , Col03 int , Col04 int ,
Col05 int , Col06 int , Col07 int , Col08 int ,
Col09 int , Col10 int , Col11 int , Col12 int ,
Col13 int , Col14 int , Col15 int , Col16 int ,
Col17 int
);
go
insert into t values (
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17
);
go
create trigger tri_test on t for
update
as
begin
declare @i int
select @i=count(*) from syscolumns where id=object_id('t')while @i>0
begin
if (@i=2) and (substring( columns_updated() , (@i-1)/8+1 , 1 ) & power( 2, (@i-1)%8 )) > 0
--以第二列为例
if (select count(*) from deleted where col02=2)>0 --增加语句
begin
rollback tran --回滚
RAISERROR ('不能修改指定字段', 16, 1)
end
set @i=@i-1
end
end
go
update t set col17=1,col15=1,col16=1,col14=1,col09=1,col11=1,col01=1,col02=1,col03=1
go
...update部分
except
showmessage('第二个字段不能更新');
end;就知道了
create trigger tri_name on songtype for update as
begin
if (select name in ('AA','BB','CC') from deleted) > 0
begin
raiserror('不能修改',16,1)
rollback transaction
end
end我想问一下:用IN为什么不可以吗?应该怎么写呢
if (select count(*) from deleted) > 0
begin
RAISERROR ('不能修改',16,1)
rollback tran
end
end这个当然能用了,之不果他不光你指定的字段其他所有的都不能update,另外没有你那种用法
begin
if exists (select * from deleted where songtype in ('DISCO精选','舞曲欣赏','新歌推荐'))
begin
raiserror('不能修改',16,1)
rollback transaction
end
end
这样子这个问题是解决了,但是用户还是可以删除,我想再加用户不可以删除应该怎么办?谢谢