2009-09-19 50 views
0

我已经创建了以下用于在已删除的用户表中插入的触发器,必须从userlogin表中删除相应的记录。插入触发器无法正常工作

触发包括以下语句:

但是,当我在deleteduser表中插入一条记录相应的记录从用户登陆表中删除,但它没有插入到deleteduser表。

上述触发器不会产生任何错误,但是当我尝试在已删除的用户表中插入一条记录时,我注意到该记录已从UserLogin表中删除,但未在DeletedUser表中插入该记录。

供您参考我包括了deleteduser和用户登陆两个表的结构如下:

Deleted User 

CREATE TABLE DELETEDUSER 
(
DeletedUserID int identity(1,1), 
UserName nvarchar(max), 
UserType nvarchar(30), 
Reason nvarchar(max) 
) 

--ALTERING DELETEDUSER TABLE TO SPECIFY THE SIZE OF USERNAME COLUMN FOR IMPOSING FOREIGN KEY CONSTRAINT 

ALTER TABLE DELETEDUSER ALTER COLUMN UserName nvarchar(50) 

--ALTERING DELETEDUSER TABLE TO ADD FOREIGN KEY CONSTRAINT 

ALTER TABLE DELETEDUSER ADD CONSTRAINT fk_UserName Foreign key (UserName) references UserLogin(UserName) on delete cascade 


USERLOGIN TABLE: 

CREATE TABLE USERLOGIN 
(
UserID int identity(1,1) not null, 
UserName nvarchar(50) not null, 
Password nvarchar(50) not null 
) 

--ALTER TABLE USERREGISTRATION TO ADD PRIMARYKEY 

ALTER TABLE USERLOGIN ADD CONSTRAINT pk_UserName primary key(UserName) 

请帮我修改我应该插入的行中的deleteduser表并删除(删除)它来自userlogin表。

在此先感谢!

+0

你为什么要使用一个INSERT INTO的特殊表引起删除的用户?如果您需要跟踪删除,则在UserLogin上放置删除触发器以记录更改更有意义。 – 2009-09-19 06:25:20

回答

2

你的触发器是一个“AFTER”触发器(默认),而不是“INSTEAD OF”。使用AFTER触发器,“已完成事务” - 即插入到已删除的用户已经发生,所以您不需要需要INSERT语句。

DeletedUser和UserLogin之间的外键关系完全错误。这些表格与您所描述的相互排斥:在DeletedUser中拥有一个用户意味着它们不应再位于UserLogin中,并且让UserLogin中的用户意味着它们不会成为DeletedUser。

所以,去掉外键关系,并尝试这个办法:

CREATE TRIGGER trgInsert_ToDeleteFromUserLogin on DELETEDUSER FOR INSERT AS 
BEGIN 
    DELETE FROM UserLogin WHERE EXISTS (SELECT NULL FROM INSERTED WHERE 
    INSERTED.USERNAME = UserLogin.USERNAME) 
END 

编辑:香下文提到的,该代码会妥善处理的,其中多条记录被插入在同一时间的情况下,对比原始代码的单行假设。用例(禁用用户)一次只建议一个插入,但是对于构建的触发器来说,对插入/删除的元表中的整个记录​​集进行操作会更好(也更容易)。

另外,通过使用视图可以简化数据库设计。示例:

ALTER TABLE UserLogin ADD DeletedReason varchar(255) NULL 

CREATE VIEW ActiveUser AS SELECT * FROM UserLogin WHERE DeletedReason IS NULL 
+1

Sheetal,还请注意,RicharTallent具有处理多行数据的触发器。 SQL Server触发器是每个语句,而不是每行。 – 2009-09-19 06:35:14

0

为什么在INSERT触发器中将DeletedUser插入到DeletedUser中?这已经在发生,因为这首先触发了触发器。删除那部分,它应该没问题。

0

您的触发器的写入假定在插入的表中只有一行。SQL没有行触发器(如Oracle一样),它触发了一份声明火一次,插入/删除的表将受该语句影响

SELECT @UserName = USERNAME,@UserType =的所有行UserType,@Reason =插入的原因

如果在单个语句中插入4行,会发生什么情况?

除了之前回复发现的问题之外,您需要对触发器进行编码,以便它可以处理插入表中的任意数量的行。

很好的介绍,以触发SQL,请仔细阅读本:http://www.sqlservercentral.com/articles/Triggers/64214/