如何从Orchard数据库中删除模块的数据?

14
我已安装一个模块,进行迁移并在Orchard.sdf中创建表后,我想清除所有表并回滚迁移所做的所有更改。
我删除了这些表,但我认为应该删除一些元数据。
如何完全清除模块数据? 谢谢。
3个回答

18

完全卸载涉及删除与您模块名称、其功能名称和名称空间相关联的数据库表和行。以下是我们使用的过程。

1:运行 orchard.exe > package uninstall Orchard.Module.MyModuleName

2:然后打开 SQL Server Management Studio 并删除与您的模块相关联的以下数据库表。

MyModuleName_MyFeatureNameRecord

3:在以下表列中执行通配符搜索。务必搜索MyModuleName、MyNamespaceName、MyFeatureName等内容。最终您将删除所有这些行,但现在还不要删除。

SELECT *  FROM Orchard_Framework_ContentTypeRecord  WHERE Name LIKE '%%'
SELECT *  FROM Settings_ContentTypeDefinitionRecord  WHERE Name LIKE '%%'
SELECT *  FROM Settings_ContentPartDefinitionRecord  WHERE Name LIKE '%%'
SELECT *  FROM Settings_ShellFeatureRecord  WHERE Name LIKE '%%'
SELECT *  FROM Settings_ShellFeatureStateRecord  WHERE Name LIKE '%%'
SELECT *  FROM Orchard_Framework_DataMigrationRecord  WHERE DataMigrationClass LIKE '%%'

4:从以上搜索结果中,记录这些表格中行的Id值。

Orchard_Framework_ContentTypeRecord.Id
Settings_ContentTypeDefinitionRecord.Id 

5:现在您已经记录了Id,请删除在步骤3中找到的行。

6:使用在步骤4中收集的Ids,从以下表中删除行。

SELECT * FROM Settings_ContentTypePartDefinitionRecord 
    WHERE ContentTypeDefinitionRecord_Id IN()

SELECT * FROM Orchard_Framework_ContentItemRecord 
    WHERE ContentType_id IN ()

这就是对我奏效的方法。


1
在我看来,你还应该从“Orchard_Framework_ContentItemVersionRecord”中删除值,其中“ContentItemRecord_id”=“Orchard_Framework_ContentItemRecord.id”,以便于已知的ContentTypes。 - teran

5
我不知道是否有一种适当的方法来做到这一点,但清理Orchard_Framework_DataMigrationRecord应该足够了:数据迁移检查此表以找到当前功能版本,如果已经有条目,则您可能无法重新启用该功能。此外,请检查Settings_ShellFeatureRecordSettings_ShellFeatureStateRecordSettings_ContentPartDefinitionRecordSettings_ContentTypeDefinitionRecord

最后,其他表中可能有许多引用,但我认为没有危险。


0

如果您在租户中使用表前缀,这里有一个 SQL 查询片段可以使此过程更加容易。

USE DatabaseName
DECLARE @moduleName varchar(255);
DECLARE @tableName varchar(255);
DECLARE @tablePrefix varchar(255);

SET @moduleName = '%Orchard.YourModule%';
SET @tablePrefix = 'YourTablePrefix';

SET @tableName = @tablePrefix + '_Orchard_Framework_ContentTypeRecord';
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT * ' +
              ' FROM dbo.' + quotename(@tableName) +
              ' WHERE Name LIKE @moduleName'
EXEC sp_executesql @sql, N'@moduleName varchar(255)', @moduleName;

SET @tableName = @tablePrefix + '_Settings_ContentTypeDefinitionRecord';
SELECT @sql = ' SELECT * ' +
              ' FROM dbo.' + quotename(@tableName) +
          ' WHERE Name LIKE @moduleName'
EXEC sp_executesql @sql, N'@moduleName varchar(255)', @moduleName;

SET @tableName = @tablePrefix + '_Settings_ContentPartDefinitionRecord';
SELECT @sql = ' SELECT * ' +
              ' FROM dbo.' + quotename(@tableName) +
          ' WHERE Name LIKE @moduleName'
EXEC sp_executesql @sql, N'@moduleName varchar(255)', @moduleName;

SET @tableName = @tablePrefix + '_Settings_ShellFeatureRecord';
SELECT @sql = ' SELECT * ' +
              ' FROM dbo.' + quotename(@tableName) +
              ' WHERE Name LIKE @moduleName'
EXEC sp_executesql @sql, N'@moduleName varchar(255)', @moduleName;

SET @tableName = @tablePrefix + '_Settings_ShellFeatureStateRecord';
SELECT @sql = ' SELECT * ' +
              ' FROM dbo.' + quotename(@tableName) +
              ' WHERE Name LIKE @moduleName'
EXEC sp_executesql @sql, N'@moduleName varchar(255)', @moduleName;

SET @tableName = @tablePrefix + '_Orchard_Framework_DataMigrationRecord';
SELECT @sql = ' SELECT * ' +
              ' FROM dbo.' + quotename(@tableName) +
              ' WHERE DataMigrationClass LIKE @moduleName'
EXEC sp_executesql @sql, N'@moduleName varchar(255)', @moduleName;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接