2010-10-02 100 views
1

我正在使用SqlSiteMapProvider的項目。我有兩個表的文章和網站地圖我的觸發器錯誤

文章表:

CREATE TABLE [dbuser].[Articles](
[ArticleId] [uniqueidentifier] NOT NULL, 
[Title] [nvarchar](500) NULL, 
[Description] [ntext] NULL, 
[CategoryId] [int] NULL, 
[pubDate] [datetime] NULL, 
[Author] [nvarchar](255) NULL, 
[Hit] [int] NULL, 
[Auth] [bit] NULL 
)... 

和網站地圖表:

CREATE TABLE [dbuser].[SiteMap](
[ID] [int] IDENTITY(0,1) NOT NULL, 
[Title] [nvarchar](50) NULL, 
[Description] [nvarchar](512) NULL, 
[Url] [nvarchar](512) NULL, 
[Roles] [nvarchar](512) NULL, 
[Parent] [int] NULL, 
CONSTRAINT [PK_SiteMap] PRIMARY KEY CLUSTERED 
(... 

當我插入一個文章我的asp.net頁面還插入該文章的URL和信息等到SiteMap表中。我試圖做的是當我從我的文章表(從asp.net頁面)從SiteMap表中刪除相關行的文章與觸發器。

我的asp.net頁面中插入該格式的文章信息到爬行頁表:

Dim SMUrl As String = "~/c.aspx?g=" & ddlCategoryId.SelectedValue & "&k=" & BaslikNo.ToString 

我的意思是,沒有一列在兩張桌子正好配套配件。

我的觸發如下:

USE [MyDB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET NOCOUNT ON 
GO 
SET ROWCOUNT 1 
GO 
ALTER TRIGGER [dbuser].[trig_SiteMaptenSil] ON [dbuser].[Articles] 
AFTER DELETE 
AS 
BEGIN 
DECLARE @AID UNIQUEIDENTIFIER, @ttl NVARCHAR,@CID INT 
SELECT @AID=ArticleId, @ttl = Title, @CID=CategoryId FROM DELETED 
IF EXISTS(SELECT * FROM dbuser.SiteMap WHERE Url = N'~/c.aspx?g=' + CONVERT(nvarchar(5), @CID) + N'&k=' + CONVERT(nvarchar(36), @AID)) 
BEGIN 
DELETE FROM dbuser.SiteMap WHERE Url = N'~/c.aspx?g=' + CONVERT(nvarchar(5), @CID) + N'&k=' + CONVERT(nvarchar(36), @AID) 
END 
END 
GO 
我使用SSMSE 2008

和我的遠程數據庫服務器的版本是8.0

我得到的錯誤是:

沒有行被刪除。 嘗試刪除第1行時發生問題。 錯誤源:Microsoft.VisualStudio.DataTools。 錯誤消息:更新或刪除的行值不會使行唯一,或者它們會更改多行(2行)。 更正錯誤並嘗試再次刪除該行或按ESC取消更改。

願您幫助我如何才能正常工作?我已經尋找這大約幾天..找不到我的情況的解決方案...提前

+3

是否在觸發器頂部添加'set nocount on'幫助? (即所以它成爲'...開始設置NOCOUNT ON DECLARE @AID ...') – 2010-10-02 13:19:51

+0

是的,它做了...非常感謝sooo ...我想單擊'這是一個很棒的評論'按鈕一千次..謝謝.. – wooer 2010-10-02 13:41:26

+1

你真的很想小心,一次刪除多行的機會。 'SELECT @ AID = ArticleId,@ttl = Title,@ CID = CategoryId FROM DELETED'可能行不通,因爲您的'deleted'表將包含所有已刪除的行。 – LittleBobbyTables 2010-10-02 13:49:19

回答

1

爲了解決原來的問題

感謝,並具有多個行的觸發缺失應對可以改寫如下。

ALTER TRIGGER [dbuser].[trig_SiteMaptenSil] ON [dbuser].[Articles] 
AFTER DELETE 
AS 
BEGIN 
SET NOCOUNT ON 

DELETE 
FROM s 
FROM dbuser.SiteMap  AS s 
     INNER JOIN Deleted AS d 
     ON  s.Url = N'~/c.aspx?g=' + CONVERT(nvarchar(5), d.CategoryId) + N'&k=' 
            + CONVERT(nvarchar(36), d.ArticleId) 

END 
+0

非常感謝您使用LittleBobbyTables和Martin,我粘貼了它並且工作正常。 – wooer 2010-10-03 06:08:58