SharePoint 2010 Server Error: The URL "XXX" is invalid, it may refer to a nonexistent file or ...

最近在客户的SharePoint 2010的Web Application的Content数据库损坏,通过DBCC进行了修复,但是有一个Library List存在问题,问题如下:用户一上传附件就会报SharePoint Server Error:

"The URL XXX is invalid, it may refer to a nonexistent file or folder or refer to a valid file that is not in the current Web".

SharePoint 2010 Server Error: The URL

在网上查了很多方法都没有解决,只能自己来查日志来解决啦。
查看SharePoint的Log日志中得到了错误的关键信息“System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'AllUserData_PK'. Cannot insert duplicate key in object 'dbo.AllUserData'. The duplicate key value is (871ee5f1-191f-4408-ba80-6207309bb568, 0x, 1, 299626, 0, 1, 0).  The statement has been terminated. ”,意思说我在上传附件的时候,向SharePoint Content DB的AllUserData写数据的时候发生了主键的约束冲突,AllUserData的主键包含了tp_ID, tp_ListId, tp_RowOrdinal, tp_DeleteTransactionId, tp_Level, tp_IsCurrentVersion, tp_CalculatedVersion这7个字段。

再仔细查看Log发现了另一条错误信息SqlError: 'The statement has been terminated.'    Source: '.Net SqlClient Data Provider' Number: 3621 State: 0 Class: 0 Procedure: 'proc_AddListItem' LineNumber: 475 。有意思了,我们确定了是名称为"proc_AddListItem"执行时出现了错误,并且错误在存储过程的475行。打开存储过程发现475行的SQL Script是“INSERT INTO AllUserData...”。

现在就要查出来是哪个字段出错。通过执行SQL Scritp "select top 100 tp_ID, tp_ListId, tp_RowOrdinal, tp_DeleteTransactionId, tp_Level, tp_IsCurrentVersion, tp_CalculatedVersion from AllUserData where tp_ListId='08528312-E298-47C3-B756-04A7A0B65A78'"发现结果如下:

SharePoint 2010 Server Error: The URL

也就是说在tp_ListId是一个List的情况下,除了tp_ID变动之外,其他的字段都是不变的。那么冲突的字段肯定是“tp_ID”了。

离成功越来越近了,再次查看日志发现了执行proc_AddListItem的语句。 
EXEC @@iRet=proc_AddListItem @WebId=@wssp51,@SiteId=@wssp52,@ListID=@wssp53,@ItemId=@@DoclibRowId
,@UIVersion=@@DocUIVersion,@RowOrdinal=@wssp54,@DocIdAdded=@wssp55,@OnRestore=@wssp56
,@Size=@wssp57,@ItemName=@wssp58,@ItemDirName=@DN OUTPUT,@ItemLeafName=@LN OUTPUT
,@ItemDocType=@wssp59
,@UserId=@wssp60,@Level=@@Level,@TimeNow=@wssp61
, @tp_ContentTypeId = @wssp62,@nvarchar1=@wssp63,@nvarchar2=@wssp64,@nvarchar3=@wssp65
,@tp_ModerationStatus=@wssp66, @eventData=@wssp67
, @acl=@wssp68,@UIVersion=@@DocUIVersion
,@RowOrdinal=@wssp54,@DocIdAdded=@wssp55,@OnRestore=@wssp56,@Size=@wssp57
,@ItemName=@wssp58
,@ItemDirName=@DN OUTPUT,@ItemLeafName=@LN OUTPUT,@ItemDocType=@wssp59
,@UserId=@wssp60,@Level=@@Level,@TimeNow=@wssp61, @tp_ContentTypeId = @wssp62
,@nvarchar1=@wssp63,@nvarchar2=@wssp64
,@nvarchar3=@wssp65,@tp_ModerationStatus=@wssp66
, @eventData=@wssp67
, @acl=@wssp68; 

	发现了tp_id是从@@DoclibRowId这里得到的值。而@@DoclibRowId是通过执行另一个存储过程proc_GenerateNextId得到的,“EXEC @@DoclibRowId = proc_GenerateNextId @wssp8;” 执行proc_GenerateNextId发现老是返回一样的值299626,查看存储过程的内容发现@@DoclibRowId是通过Table Function "TVF_AllListsAux_UpdLock_ListId"得到的,在进一步查看这个Table Function,发现表AllListsAux是存放所以List的数量和编号信息的表。AllListsAux.[NextAvailableId]的值是299625,加1后得到的tp_id是299626,终于明白了,是Content DB出错后导致了该表中相应的ID没有做更新,所以之后的upload操作都产生主键冲突了问题。
 	解决方法很简单,到AllUserData表中找到指定Library List的最大的tp_id,将该值写入到AllListAux表的NextAvailableId的字段就解决了。之后上传没有任何问题了。
	结论,SharePoint的日志是找出错误的很好方法,要仔细的分析日志。



你可能感兴趣的:(SharePoint)