2009-09-19 72 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/