触发器出错

时间:2010-10-02 13:12:51

标签: sql-server triggers

我正在使用SqlSiteMapProvider开发一个项目。我有两个表文章和SiteMap

文章表:

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
)...

和SiteMap表:

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页面以这种格式将文章信息插入Sitmap表:

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取消更改。

你可以帮我解决这个问题吗?我已经搜索了大约几天..无法为我的案例找到解决方案......

提前致谢

1 个答案:

答案 0 :(得分: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