2010-10-02 111 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