我正在使用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取消更改。
你可以帮我解决这个问题吗?我已经搜索了大约几天..无法为我的案例找到解决方案......
提前致谢
答案 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