我的触发器错误
问题描述:
我正在使用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取消更改。
愿您帮助我如何才能正常工作?我已经寻找这大约几天..找不到我的情况的解决方案...提前
答
为了解决原来的问题
感谢,并具有多个行的触发缺失应对可以改写如下。
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
是否在触发器顶部添加'set nocount on'帮助? (即所以它成为'...开始设置NOCOUNT ON DECLARE @AID ...') – 2010-10-02 13:19:51
是的,它做了...非常感谢sooo ...我想单击'这是一个很棒的评论'按钮一千次..谢谢.. – wooer 2010-10-02 13:41:26
你真的很想小心,一次删除多行的机会。 'SELECT @ AID = ArticleId,@ttl = Title,@ CID = CategoryId FROM DELETED'可能行不通,因为您的'deleted'表将包含所有已删除的行。 – LittleBobbyTables 2010-10-02 13:49:19