+ -
当前位置:首页 → 问答吧 → 限制插入数据

限制插入数据

时间:2011-11-14

来源:互联网

我想用触发器来实现,这样的触发器怎么写
 我现在有表PurchOutProduct 字段qty 如果向表qty 插入的数据是 比如:(—10)不允许插入, (10)这样的就允许插入 数字是变动的,只要带有‘-’就不允许 不让保存。这张单据是两个表组成的,不知道写触发器还要不要考虑另一个表PurchOutbase

作者: a544589668   发布时间: 2011-11-14

qty 字段上加check 约束来的更快更直接些。


SQL code
ALTER TABLE PurchOutProduct
ADD CONSTRAINT ck_qty_PurchOutProduct CHECK (qty >=0);
GO

ALTER TABLE PurchOutbase
ADD CONSTRAINT ck_qty_PurchOutbase CHECK (qty >=0);
GO

作者: OrchidCat   发布时间: 2011-11-14

SQL code
用检查就行了

Create table PurchOutProduct(
Qty int check (Qty>0)
)

作者: roy_88   发布时间: 2011-11-14

触发器这样实现



SQL code
Create table PurchOutProduct(
Qty int
)
go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted  where Qty<=0)
    rollback tran

作者: roy_88   发布时间: 2011-11-14

Mark,学习触发器的写法.

号外:
你的标题应该改一下,如何用触发器限制插入数据,这样会更好些.

作者: xiaolinyouni   发布时间: 2011-11-14

建立一个check约束即可,再插入数据时先检查check约束,通过后才会执行触发器。所以不知道写触发器不需要考虑另一个表PurchOutbase

作者: HEROWANG   发布时间: 2011-11-14

约束或触发器用一样就可以了

作者: jyh070207   发布时间: 2011-11-14

引用 2 楼 roy_88 的回复:
SQL code
用检查就行了

Create table PurchOutProduct(
Qty int check (Qty>0)
)

用检查,这检查语句放哪里呢?

作者: a544589668   发布时间: 2011-11-14

我在保存触发器的时候提示(错误2714:资料库已经有一个名为'purchoutproduct'物件.)如何查得到这个名字的

作者: a544589668   发布时间: 2011-11-14

引用 3 楼 roy_88 的回复:
触发器这样实现




SQL code
Create table PurchOutProduct(
Qty int
)
go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted where Qty<=0)
rol……

这触发器看得懂, 有一个地方我一直没弄明白,我看到多很人都在select 后面都用到一个‘1’ (是数字1是吧)这个是起什么作用的。

作者: a544589668   发布时间: 2011-11-14

exists语句只是判断子查询是否有记录集返回,如果在子查询中用select * 会返回所有字段影响效率
所以用select 1就可以了

作者: pengxuan   发布时间: 2011-11-14

刚测试了一下 这个表PurchOutProduct没有写数据进去,但这个表的资料写进去了PurchOutbase 因为这张单是分两个表写的, 一个是头部,一个是单身 现在存了那表单的资料还得上数据库才能删除!有什么解决办法!

作者: a544589668   发布时间: 2011-11-14

SQL code
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
insert into PurchOutProduct 
select * from  inserted where not exists (select 1 from inserted where qty<0)

作者: q465897859   发布时间: 2011-11-14

SQL code
--检查约束:
ALTER TABLE PurchOutProduct
ADD CONSTRAINT ck_qty_PurchOutProduct CHECK (qty >=0);
GO

作者: fredrickhu   发布时间: 2011-11-14

引用 7 楼 a544589668 的回复:

引用 2 楼 roy_88 的回复:
SQL code
用检查就行了

Create table PurchOutProduct(
Qty int check (Qty>0)
)

用检查,这检查语句放哪里呢?


建表時加

如果表已存在
可用 alter table PurchOutProduct add constraint 約束名(自定義) check (Qtt>00)

作者: roy_88   发布时间: 2011-11-14

引用 3 楼 roy_88 的回复:
触发器这样实现



Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted where Qty<=0)
rollback tran

这样写是可以触发, 但有一个问题正数的不能保存哦,反而要限制的小于零的能保存了.

作者: a544589668   发布时间: 2011-11-14

引用 13 楼 fredrickhu 的回复:
SQL code
--检查约束:
ALTER TABLE PurchOutProduct
ADD CONSTRAINT ck_qty_PurchOutProduct CHECK (qty >=0);
GO

伺服器: 訊息 245,層級 16,狀態 1,行 1
將 varchar 數值 '40.00' 轉換成資料型別為 int 的資料行語法錯誤。
报错

作者: a544589668   发布时间: 2011-11-14

引用 15 楼 a544589668 的回复:

引用 3 楼 roy_88 的回复:
触发器这样实现



Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted where Qty<=0)
rollback tran

这样写是可以触发, 但有一个问题正数的不能保存哦,反而要……


不會,你自己測測就知了
SQL code
USE tempdb
go
CREATE TABLE PurchOutProduct(Qty int)
go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted where Qty<=0)
rollback TRAN
GO
INSERT PurchOutProduct SELECT 10

SELECT * FROM PurchOutProduct
/*
10
*/
INSERT PurchOutProduct SELECT -10

/*
訊息 3609,層級 16,狀態 1,行 1
交易在觸發程序中結束。已中止批次。

*/

作者: roy_88   发布时间: 2011-11-14

SQL code

if object_id('tb','U') is not null
   drop table tb
go
create table tb
(
 id int identity(1,1),
 name varchar(10),
 age int check(age>10),
 address varchar (10)
)
go
insert into tb (name,age)
select '张三',3


建立CHECK约束就可以,像上面这个一样

作者: pengxuan   发布时间: 2011-11-14

引用 17 楼 roy_88 的回复:
引用 15 楼 a544589668 的回复:

引用 3 楼 roy_88 的回复:
触发器这样实现



Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted where Qty<=0)
rollback tran

这样写……


会的,如图:

作者: a544589668   发布时间: 2011-11-14

引用 17 楼 roy_88 的回复:
引用 15 楼 a544589668 的回复:

引用 3 楼 roy_88 的回复:
触发器这样实现



Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted where Qty<=0)
rollback tran

这样写……

上面那个图传错了 这张才对:

作者: a544589668   发布时间: 2011-11-14

1就是*的意思
引用 9 楼 a544589668 的回复:
引用 3 楼 roy_88 的回复:
触发器这样实现




SQL code
Create table PurchOutProduct(
Qty int
)
go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted whe……

作者: szstephenzhou   发布时间: 2011-11-14

关键字的类型后面加 check(条件)

作者: szstephenzhou   发布时间: 2011-11-14

引用 21 楼 szstephenzhou 的回复:
1就是*的意思

引用 9 楼 a544589668 的回复:
引用 3 楼 roy_88 的回复:
触发器这样实现




SQL code
Create table PurchOutProduct(
Qty int
)

go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
i……
 
问题我的表已经有了的呀, 不能在用 SQL code
Create table PurchOutProduct(
Qty int

作者: a544589668   发布时间: 2011-11-14

10.00在楼主的系统里是varchar型?那就转换成decimal(10,2)再进行操作。另外还是建立CHECK更好些。

作者: gogodiy   发布时间: 2011-11-14

引用 24 楼 gogodiy 的回复:
10.00在楼主的系统里是varchar型?那就转换成decimal(10,2)再进行操作。另外还是建立CHECK更好些。


能帮忙写一下吗? 对于转换我不会呢? 我还在学习中....

作者: a544589668   发布时间: 2011-11-14

创建表时Qty的类型为varchar就好啦
SQL code

Create table PurchOutProduct(
Qty varchar(50)
)
go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted  where Qty<=0)
    rollback tran

作者: sadikaqy   发布时间: 2011-11-14

引用 26 楼 sadikaqy 的回复:
创建表时Qty的类型为varchar就好啦

SQL code

Create table PurchOutProduct(
Qty varchar(50)
)
go
Create trigger tr_PurchOutProduct on PurchOutProduct
for insert
as
if exists(select 1 from inserted wher……


我已经有表的, 而这个表这个字段风类型还是qty varchar(13)

作者: a544589668   发布时间: 2011-11-14

热门下载

更多