触发器条件总是为true

PublicGe 2011-01-06 01:09:58
下面的触发器:
用户ID:用户名
RKEY:自增主键
ALTER TRIGGER [Trigg_UserIDAdd] ON [dbo].[JB_用户帐号]
FOR INSERT
AS
BEGIN
IF EXISTS ( SELECT A.用户ID FROM JB_用户帐号 A inner join Inserted B ON A.用户ID=B.用户ID)
BEGIN
--ROLLBACK TRAN
DELETE JB_用户帐号 WHERE RKEY IN (SELECT RKEY FROM Inserted)
RAISERROR('此登陆名已存在,请使用别的登陆名再试!',18,18)
END


结果是一条也插不进去了。
...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
PublicGe 2011-01-07
  • 打赏
  • 举报
回复
谢谢大家,结贴了。
PublicGe 2011-01-06
  • 打赏
  • 举报
回复
多了一句delete?
PublicGe 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 js_szy 的回复:]
SQL code
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'JB_用户帐号')
AND type in (N'U'))
DROP TABLE JB_用户帐号
GO

---->建表
create table JB_用户帐号([RKEY] int identity(1,1) primary……
[/Quote]
见鬼了,这样又可以了。
高手你看看我的5L是哪里错了?
华夏小卒 2011-01-06
  • 打赏
  • 举报
回复
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'JB_用户帐号') 
AND type in (N'U'))
DROP TABLE JB_用户帐号
GO

---->建表
create table JB_用户帐号([RKEY] int identity(1,1) primary key,[用户ID] varchar(3))
insert JB_用户帐号
select 'ddd'
GO



create TRIGGER [Trigg_UserIDAdd] ON [dbo].[JB_用户帐号]
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS ( SELECT 1 FROM JB_用户帐号 A inner join Inserted B ON A.用户ID=B.用户ID)
BEGIN

--ROLLBACK TRAN
--使用前触发,下面这句不能用
--DELETE JB_用户帐号 WHERE 用户ID IN (SELECT 用户ID FROM Inserted)
RAISERROR('此登陆名已存在,请使用别的登陆名再试!',18,18)
END
else
begin

INSERT INTO [JB_用户帐号] SELECT 用户ID FROM inserted
end
END

go

insert JB_用户帐号
select 'jjj'
GO


--> 查询结果
SELECT * FROM JB_用户帐号

--> 删除表格
--DROP TABLE JB_用户帐号

RKEY 用户ID
----------- ----
1 ddd
2 jjj

(2 行受影响)


无耻的抄袭并修改了部分小菜的东西
PublicGe 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wxf163 的回复:]
SQL code

--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:JB_用户帐号
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'JB_用户帐号')
AND type in (N'U'))
DROP……
[/Quote]

这样等于插入重复的还是可以的,只是有消息提示而已。
王向飞 2011-01-06
  • 打赏
  • 举报
回复

--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:JB_用户帐号
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'JB_用户帐号')
AND type in (N'U'))
DROP TABLE JB_用户帐号
GO

---->建表
create table JB_用户帐号([RKEY] int identity(1,1) primary key,[用户ID] varchar(3))
insert JB_用户帐号
select 'ddd'
GO



ALTER TRIGGER [Trigg_UserIDAdd] ON [dbo].[JB_用户帐号]
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS ( SELECT 1 FROM JB_用户帐号 A inner join Inserted B ON A.用户ID=B.用户ID)
BEGIN
--ROLLBACK TRAN
DELETE JB_用户帐号 WHERE 用户ID IN (SELECT 用户ID FROM Inserted)
RAISERROR('此登陆名已存在,请使用别的登陆名再试!',18,18)
END
INSERT INTO [JB_用户帐号] SELECT 用户ID FROM inserted
END



insert JB_用户帐号
select 'iii'
GO







--> 查询结果
SELECT * FROM JB_用户帐号
--> 删除表格
--DROP TABLE JB_用户帐号

PublicGe 2011-01-06
  • 打赏
  • 举报
回复
看来触发器已经是插入后触发事件了,要怎么改成触发前的。
用BEFORE好象不行,2K的数据库提示错误。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER TRIGGER [Trigg_UserIDAdd] ON [dbo].[JB_用户帐号]
FOR INSERT
AS
BEGIN
IF EXISTS ( SELECT A.用户ID FROM JB_用户帐号 A inner join Inserted B ON A.用户ID=B.用户ID)
BEGIN
--ROLLBACK TRAN
SELECT A.用户ID FROM JB_用户帐号 A inner join Inserted B ON A.用户ID=B.用户ID
DELETE JB_用户帐号 WHERE RKEY IN (SELECT RKEY FROM Inserted)
RAISERROR('此登陆名已存在,请使用别的登陆名再试!',18,18)
END
ELSE
BEGIN
INSERT INTO JB_用户帐号([用户ID]
,[密码]
,[级别]
,[功能]
,[用户名称]
,[单位]
,[创建日期]
,[修改日期]
,[有效状态]
,[建档人rkey]
,[修改人rkey]
,[中断时间]
,[中断人rkey]
,[邮箱]
,[电话])
SELECT [用户ID]
,[密码]
,[级别]
,[功能]
,[用户名称]
,[单位]
,[创建日期]
,[修改日期]
,[有效状态]
,[建档人rkey]
,[修改人rkey]
,[中断时间]
,[中断人rkey]
,[邮箱]
,[电话]
FROM INSERTED
END
END

SELECT * INTO #T1 FROM JB_用户帐号 where 用户id='ASDF'
SELECT * FROM #T1

UPDATE #T1 SET 用户id='1231ASDFAAAAA'
INSERT INTO JB_用户帐号([用户ID]
,[密码]
,[级别]
,[功能]
,[用户名称]
,[单位]
,[创建日期]
,[修改日期]
,[有效状态]
,[建档人rkey]
,[修改人rkey]
,[中断时间]
,[中断人rkey]
,[邮箱]
,[电话])
SELECT [用户ID]
,[密码]
,[级别]
,[功能]
,[用户名称]
,[单位]
,[创建日期]
,[修改日期]
,[有效状态]
,[建档人rkey]
,[修改人rkey]
,[中断时间]
,[中断人rkey]
,[邮箱]
,[电话]
FROM #T1

结果:1231ASDFAAAAA

ycproc 2011-01-06
  • 打赏
  • 举报
回复
对 打印出来 看是什么
kevin_long 2011-01-06
  • 打赏
  • 举报
回复
在 条件 后面加
print 语句 调试一下
PublicGe 2011-01-06
  • 打赏
  • 举报
回复
改了,还是一样。。。
飘零一叶 2011-01-06
  • 打赏
  • 举报
回复
ALTER TRIGGER [Trigg_UserIDAdd] ON [dbo].[JB_用户帐号]
instead of INSERT
AS
BEGIN
IF EXISTS ( SELECT A.用户ID FROM JB_用户帐号 A inner join Inserted B ON A.用户ID=B.用户ID)
BEGIN
--ROLLBACK TRAN
DELETE JB_用户帐号 WHERE RKEY IN (SELECT RKEY FROM Inserted)
RAISERROR('此登陆名已存在,请使用别的登陆名再试!',18,18)
END
else
begin
insert into JB_用户帐号
select * from inserted
end

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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