Hello,
I have this error (in 04.05.01.log) upgrading from dnn 440 to 451 :
System.Data.SqlClient.SqlException: CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 8. Most significant primary key is '<NULL>'.
Could not create constraint. See previous errors.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at DotNetNuke.Data.SqlDataProvider.ExecuteADOScript(String SQL)
at DotNetNuke.Data.SqlDataProvider.ExecuteScript(String Script, Boolean UseTransactions)
/************************************************************/
/***** SqlDataProvider *****/
/***** *****/
/***** *****/
/***** Note: To manually execute this script you must *****/
/***** perform a search and replace operation *****/
/***** for dbo. and *****/
/***** *****/
/************************************************************/
/* add unique constraint to Folders table */
IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N'dbo.[IX_FolderPath]') and OBJECTPROPERTY(id, N'IsConstraint') = 1)
BEGIN
declare @PortalID int
declare @FolderPath varchar(300)
declare @FolderID int
declare @MinFolderID int
select @PortalID = min(PortalID)
from Portals
while @PortalID is not null
begin
/* check for duplicate FolderPaths */
select @FolderPath = null
select @FolderPath = FolderPath
from Folders
where PortalID = @PortalID
group by FolderPath
having COUNT(*) > 1
/* if duplicates exist */
if @FolderPath is not null
begin
/* iterate through the duplicates */
select @FolderID = min(FolderID)
from Folders
where PortalID = @PortalID
and FolderPath = @FolderPath
/* save min FolderID */
select @MinFolderID = @FolderID
while @FolderID is not null
begin
if @FolderID <> @MinFolderID
begin
/* reassign FolderId to min FolderID for duplicate folders */
update Files
set FolderID = @MinFolderID
where FolderID = @FolderID
/* remove duplicate folder */
delete
from Folders
where FolderID = @FolderID
end
select @FolderID = min(FolderID)
from Folders
where PortalID = @PortalID
and FolderPath = @FolderPath
and FolderID > @FolderID
end
end
select @PortalID = min(PortalID)
from Portals
where PortalID > @PortalID
end
/* add unique constraint */
ALTER TABLE dbo.Folders ADD CONSTRAINT
IX_FolderPath UNIQUE NONCLUSTERED
(
PortalID,
FolderPath
) ON [PRIMARY]
END
In Files table I have a lot of duplicated file-folders like these:
|
FolderID |
Folder |
FileName |
0 |
310 |
Immagini_GuidaArtmedia/ |
Artmedia_screen.jpg |
0 |
156 |
Immagini_GuidaArtmedia/ |
Artmedia_screen.jpg |
0 |
310 |
Immagini_GuidaArtmedia/ |
Azienda XP_screen.jpg |
0 |
156 |
Immagini_GuidaArtmedia/ |
Azienda XP_screen.jpg |
I think the error is in the sql script when it try to /*reassign FolderId to min FolderID for duplicate folders*/
update Files
set FolderID = @MinFolderID
where FolderID = @FolderID
because in Files table there is a "unique" property for FolderID-FileName fields
What should I do now?
Thanks
Luca