100分 触发器的问题,为什么错误提示说:在触发器不中允许使用ALRER DATABSE呢

fooldan 2005-01-16 07:05:34
触发器的问题,为什么错误提示说:在触发器不中允许使用ALRER DATABSE呢?
太怪了

下面是脚本
USE HAIDI
GO
ALTER TRIGGER EventInsert
ON Articles
AFTER INSERT
AS
BEGIN
/* 只链接@LINK_RANGE天内的文章 */
DECLARE @LINK_RANGE INT;
SELECT @LINK_RANGE=5;

/* 为刚刚添加的文章添加链接,同时为@LINK_RANGE天数之内的文章添加链接 */
DECLARE @nID INT,@oID INT,@nKeywords NVARCHAR(50),@oKeywords NVARCHAR(50);
SELECT @nID=[ArticleID],@nKeywords=[Keywords] FROM INSERTED;

DECLARE c CURSOR FOR
SELECT [ArticleID],[Keywords] FROM [Articles]
WHERE [AddTime]>DATEADD(DAY,0-@LINK_RANGE,GETDATE()) AND [Keywords] IS NOT NULL AND [ArticleID]<>@nID

OPEN c
FETCH NEXT FROM c
INTO @oID,@oKeywords

WHILE @@FETCH_STATUS = 0
BEGIN
--替换刚刚添加的文章
EXEC AddAnchors @oKeywords,@nID,@oID;
--替换原有文章
EXEC AddAnchors @nKeywords,@oID,@nID;
FETCH NEXT FROM c
INTO @oID,@oKeywords
END

CLOSE c
DEALLOCATE c
END

////////////////////////////////////////////////
请注意,函数AddAnchors单独测试没有错误,,,在AddAnchors里面,会对表Articles表有更新的操作。。我知道问题出在这里,但是,单独调试没有错误啊。
但是,在触发器里面运行就出错了。

另外,我上面写的触发器是应该是在插入以后才会触发的,但是,问题是,显示“在触发器中不允许使用ALTER DATABASE后”,,,文章并没有被插入进去。

所以,SELECT @nID=[ArticleID],@nKeywords=[Keywords] FROM INSERTED;时
所取得的@nID,并不是实际在Articles表中的值,因此,在AddAnchors中,对Artilces表进行更新的时候就会出错。。
我的猜测是对吗,应该怎么修改
...全文
152 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fooldan 2005-01-17
  • 打赏
  • 举报
回复
太好了,这个问题困扰了我好长时间了,太感觉邹老师了

EXEC sp_dboption 'HAIDI', 'select into/bulkcopy', 'false';
我本来不太熟,查了帮助文件就直接拿过来用了,没有想到是这个问题。

非常感谢
zjcxc 2005-01-17
  • 打赏
  • 举报
回复
EXEC sp_dboption 'HAIDI', 'select into/bulkcopy', 'true';
EXEC sp_dboption 'HAIDI', 'select into/bulkcopy', 'false';

这个就是alter database 嘛(虽然用的是sp_dboption,但内部处理语句还是alter database完成的)

触发器调用存储过程,那存储过程的执行过程也在触发器中,所以单独调用存储过程可以,但在触发器中会出错
fooldan 2005-01-17
  • 打赏
  • 举报
回复
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


ALTER PROC AddAnchor
@keyword NVARCHAR(50),
@sID INT,
@dID INT
AS
BEGIN
DECLARE @START_TAG VARCHAR(50),@END_TAG VARCHAR(50); --标志的结束符号和结尾符号
DECLARE @SEARCH_RANGE INT; --搜索超链接的范围,超过此范围则不再搜索
SELECT @START_TAG='<!--STARTANCHOR #ARTICLEID='+CONVERT(VARCHAR(10),@dID)+'-->';
SELECT @END_TAG='<!--ENDANCHOR #ARTICLEID='+CONVERT(VARCHAR(10),@dID)+'-->';
SELECT @SEARCH_RANGE=4000; --搜索范围设置

DECLARE @pK INT,@pENDTAG INT;
SELECT @pK=PATINDEX('%'+@keyword+'%',[Content]) FROM [Articles] WHERE [ArticleID]=@sID;
SELECT @pENDTAG=PATINDEX('%'+@keyword+@END_TAG+'%',[Content]) FROM [Articles] WHERE [ArticleID]=@sID;

--没有发现关键字则返回
IF(@pK<>0)
BEGIN
--看是否已经标记过,标记过则返回
IF(@pENDTAG=0)
BEGIN
DECLARE @c NVARCHAR(4000);
--读入并判断是否在链接中
SELECT @c=SUBSTRING([Content],@pK,@SEARCH_RANGE) FROM [Articles] WHERE [ArticleID]=@sID;
DECLARE @pRA INT,@pLA INT;
SELECT @pRA=CHARINDEX('</A>',@c,1),@pLA=CHARINDEX('<A',@c,1);
IF(@pRA<>0)
BEGIN
IF(@pLA=0)
RETURN;
ELSE IF(@pRA<@pLA)
RETURN;
END

--替换
DECLARE @len INT,@linkedKeyword VARCHAR(100);
SELECT @len=LEN(@keyword),@linkedKeyword=@START_TAG+@keyword+@END_TAG;
EXEC sp_dboption 'HAIDI', 'select into/bulkcopy', 'true';
DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(Content)FROM [Articles] WHERE [ArticleID]=@sID;
SELECT @pK=@pK-1;
UPDATETEXT [Articles].[Content] @ptrval @pK @len @linkedKeyword;
EXEC sp_dboption 'HAIDI', 'select into/bulkcopy', 'false';
--插入到Anchors表中
IF(NOT EXISTS(SELECT * FROM [Anchors] WHERE [SourceID]=@sID AND [DestinationID]=@dID))
INSERT INTO Anchors(SourceID,DestinationID)VALUES(@sID,@dID);
END
END
END



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

fooldan 2005-01-17
  • 打赏
  • 举报
回复
/*
给定以,分隔的关键字集合,调用link替换并插入
*/
ALTER PROC AddAnchors
@keywords VARCHAR(50),@sID INT,@dID INT
AS
BEGIN
DECLARE @pEnd INT,@keyword VARCHAR(50);
SET @pEnd=CHARINDEX(',',@keywords);
IF(@pEnd=0) ----------只有一个关键字的情况
BEGIN
--替换
EXEC AddAnchor @keywords,@sID,@dID;
END
ELSE ----------有多个关键字的情况
BEGIN
DECLARE @pStart INT;
SET @pStart=0;
WHILE(@pEnd<>0)
BEGIN
SET @keyword=SUBSTRING(@keywords,@pStart,@pEnd-@pStart);
--替换
EXEC AddAnchor @keyword,@sID,@dID
SET @pStart=@pEnd+1;
SET @pEnd=CHARINDEX(',',@keywords,@pStart);
END
SET @keyword=SUBSTRING(@keywords,@pStart,LEN(@keywords));
--替换
EXEC AddAnchor @keyword,@sID,@dID
END
END
fooldan 2005-01-17
  • 打赏
  • 举报
回复
我并没有Alter DataBase 我把源码都拿出来吧,有注释;
基本思想就是这样:有两个表Articles Anchors  
Articles上面已有说明,,,,Anchors有两例  SourceID,DestinationID,,,

我想做这样的功能
在最低层实现,自动给文章加链接的过程,,像新浪的新闻系统就是这样(不过,不知道他们怎么实现的)
例:有一个文章
ID=1
Content=“我们的队伍向太阳”
Keywords=“军歌:


然后有另外一个文章
ID=2
Content=”我们的军歌是中国人民-----”
Keywords=NULL

在添加ID=2的文章时,直接把Content中的军歌加上链接 变为”我们的<!--BEGIN_TAG #ARTICLEID=1-->军歌<!--ENDTAG-->是中国人民-----”

上面当然就是用我说的触发器做的
Softlee81307 2005-01-17
  • 打赏
  • 举报
回复
在触发器中不允许使用ALTER DATABASE
fooldan 2005-01-17
  • 打赏
  • 举报
回复
zjcxc(邹建 :
可是我并没有使用ALTER DATABASE操作啊
我只是对Artilces中的Content修改了一下而已



zjcxc 2005-01-17
  • 打赏
  • 举报
回复
错误提示已经说清楚了
fooldan 2005-01-16
  • 打赏
  • 举报
回复
表的结构是这样的
CREATE TABLE Articles
(
ArticleID INT IDENTITY(1,1) PRIMARY KEY,
Content NTEXT,
Keywords VARCHAR(50)
)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧