8 changed files with 648 additions and 22 deletions
@ -0,0 +1,432 @@ |
|||||
|
|
||||
|
USE [${DataBase}]; |
||||
|
-- ---------------------------- |
||||
|
-- Table structure for __EFMigrationsHistory |
||||
|
-- ---------------------------- |
||||
|
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL |
||||
|
BEGIN |
||||
|
CREATE TABLE [__EFMigrationsHistory] ( |
||||
|
[MigrationId] nvarchar(150) NOT NULL, |
||||
|
[ProductVersion] nvarchar(32) NOT NULL, |
||||
|
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId]) |
||||
|
); |
||||
|
END; |
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Table structure for bookmarks |
||||
|
-- ---------------------------- |
||||
|
|
||||
|
CREATE TABLE [dbo].[Bookmarks] ( |
||||
|
[Id] nvarchar(255) NOT NULL, |
||||
|
[TenantId] nvarchar(255) NULL, |
||||
|
[Hash] nvarchar(255) NOT NULL, |
||||
|
[Model] nvarchar(max) NOT NULL, |
||||
|
[ModelType] nvarchar(max) NOT NULL, |
||||
|
[ActivityType] nvarchar(255) NOT NULL, |
||||
|
[ActivityId] nvarchar(255) NOT NULL, |
||||
|
[WorkflowInstanceId] nvarchar(255) NOT NULL, |
||||
|
[CorrelationId] nvarchar(255) NOT NULL |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Table structure for triggers |
||||
|
-- ---------------------------- |
||||
|
|
||||
|
CREATE TABLE [dbo].[Triggers] ( |
||||
|
[Id] nvarchar(255) NOT NULL, |
||||
|
[TenantId] nvarchar(255) NULL, |
||||
|
[Hash] nvarchar(255) NOT NULL, |
||||
|
[Model] nvarchar(max) NOT NULL, |
||||
|
[ModelType] nvarchar(max) NOT NULL, |
||||
|
[ActivityType] nvarchar(255) NOT NULL, |
||||
|
[ActivityId] nvarchar(255) NOT NULL, |
||||
|
[WorkflowDefinitionId] nvarchar(255) NOT NULL |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Table structure for workflowdefinitions |
||||
|
-- ---------------------------- |
||||
|
|
||||
|
CREATE TABLE [dbo].[WorkflowDefinitions] ( |
||||
|
[Id] nvarchar(255) NOT NULL, |
||||
|
[DefinitionId] nvarchar(255) NOT NULL, |
||||
|
[TenantId] nvarchar(255) NULL, |
||||
|
[Name] nvarchar(255) NULL, |
||||
|
[DisplayName] nvarchar(max) NULL, |
||||
|
[Description] nvarchar(max) NULL, |
||||
|
[Version] int NOT NULL, |
||||
|
[IsSingleton] tinyint NOT NULL, |
||||
|
[PersistenceBehavior] int NOT NULL, |
||||
|
[DeleteCompletedInstances] tinyint NOT NULL, |
||||
|
[IsPublished] tinyint NOT NULL, |
||||
|
[IsLatest] tinyint NOT NULL, |
||||
|
[Tag] nvarchar(255) NULL, |
||||
|
[Data] nvarchar(max) NULL, |
||||
|
[CreatedAt] datetime2 NOT NULL |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Table structure for workflowexecutionlogrecords |
||||
|
-- ---------------------------- |
||||
|
|
||||
|
CREATE TABLE [dbo].[WorkflowExecutionLogRecords] ( |
||||
|
[Id] nvarchar(255) NOT NULL, |
||||
|
[TenantId] nvarchar(255) NULL, |
||||
|
[WorkflowInstanceId] nvarchar(255) NOT NULL, |
||||
|
[ActivityId] nvarchar(255) NOT NULL, |
||||
|
[ActivityType] nvarchar(255) NOT NULL, |
||||
|
[Timestamp] datetime2 NOT NULL, |
||||
|
[EventName] nvarchar(max) NULL, |
||||
|
[Message] nvarchar(max) NULL, |
||||
|
[Source] nvarchar(max) NULL, |
||||
|
[Data] nvarchar(max) NULL |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Table structure for workflowinstances |
||||
|
-- ---------------------------- |
||||
|
|
||||
|
CREATE TABLE [dbo].[WorkflowInstances] ( |
||||
|
[Id] nvarchar(255) NOT NULL, |
||||
|
[DefinitionId] nvarchar(255) NOT NULL, |
||||
|
[TenantId] nvarchar(255) NULL, |
||||
|
[Version] int NOT NULL, |
||||
|
[WorkflowStatus] int NOT NULL, |
||||
|
[CorrelationId] nvarchar(255) NOT NULL, |
||||
|
[ContextType] nvarchar(255) NULL, |
||||
|
[ContextId] nvarchar(255) NULL, |
||||
|
[Name] nvarchar(255) NULL, |
||||
|
[CreatedAt] datetime2 NOT NULL, |
||||
|
[LastExecutedAt] datetime2 NULL, |
||||
|
[FinishedAt] datetime2 NULL, |
||||
|
[CancelledAt] datetime2 NULL, |
||||
|
[FaultedAt] datetime2 NULL, |
||||
|
[Data] nvarchar(max) NULL, |
||||
|
[LastExecutedActivityId] nvarchar(max) NULL, |
||||
|
[DefinitionVersionId] nvarchar(255) NOT NULL |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Table structure for workflowsettings |
||||
|
-- ---------------------------- |
||||
|
|
||||
|
CREATE TABLE [dbo].[WorkflowSettings] ( |
||||
|
[Id] nvarchar(255) NOT NULL, |
||||
|
[WorkflowBlueprintId] nvarchar(255) NULL, |
||||
|
[Key] nvarchar(255) NULL, |
||||
|
[Value] nvarchar(255) NULL |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Indexes structure for table bookmarks |
||||
|
-- ---------------------------- |
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_ActivityId] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[ActivityId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_ActivityType] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[ActivityType] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_ActivityType_TenantId_Hash] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[ActivityType] ASC, |
||||
|
[TenantId] ASC, |
||||
|
[Hash] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_CorrelationId] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[CorrelationId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_Hash] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[Hash] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_Hash_CorrelationId_TenantId] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[Hash] ASC, |
||||
|
[CorrelationId] ASC, |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_TenantId] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Bookmark_WorkflowInstanceId] |
||||
|
ON [dbo].[Bookmarks] ( |
||||
|
[WorkflowInstanceId] ASC |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Primary Key structure for table bookmarks |
||||
|
-- ---------------------------- |
||||
|
ALTER TABLE [dbo].[Bookmarks] ADD PRIMARY KEY CLUSTERED ([Id]) |
||||
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Indexes structure for table triggers |
||||
|
-- ---------------------------- |
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_ActivityId] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[ActivityId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_ActivityType] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[ActivityType] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_ActivityType_TenantId_Hash] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[ActivityType] ASC, |
||||
|
[TenantId] ASC, |
||||
|
[Hash] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_Hash] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[Hash] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_Hash_TenantId] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[Hash] ASC, |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_TenantId] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_Trigger_WorkflowDefinitionId] |
||||
|
ON [dbo].[Triggers] ( |
||||
|
[WorkflowDefinitionId] ASC |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Primary Key structure for table triggers |
||||
|
-- ---------------------------- |
||||
|
ALTER TABLE [dbo].[Triggers] ADD PRIMARY KEY CLUSTERED ([Id]) |
||||
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Indexes structure for table workflowdefinitions |
||||
|
-- ---------------------------- |
||||
|
CREATE UNIQUE NONCLUSTERED INDEX [IX_WorkflowDefinition_DefinitionId_VersionId] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[DefinitionId] ASC, |
||||
|
[Version] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowDefinition_IsLatest] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[IsLatest] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowDefinition_IsPublished] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[IsPublished] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowDefinition_Name] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[Name] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowDefinition_Tag] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[Tag] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowDefinition_TenantId] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowDefinition_Version] |
||||
|
ON [dbo].[WorkflowDefinitions] ( |
||||
|
[Version] ASC |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Primary Key structure for table workflowdefinitions |
||||
|
-- ---------------------------- |
||||
|
ALTER TABLE [dbo].[WorkflowDefinitions] ADD PRIMARY KEY CLUSTERED ([Id]) |
||||
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Indexes structure for table workflowexecutionlogrecords |
||||
|
-- ---------------------------- |
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowExecutionLogRecord_ActivityId] |
||||
|
ON [dbo].[WorkflowExecutionLogRecords] ( |
||||
|
[ActivityId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowExecutionLogRecord_ActivityType] |
||||
|
ON [dbo].[WorkflowExecutionLogRecords] ( |
||||
|
[ActivityType] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowExecutionLogRecord_TenantId] |
||||
|
ON [dbo].[WorkflowExecutionLogRecords] ( |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowExecutionLogRecord_Timestamp] |
||||
|
ON [dbo].[WorkflowExecutionLogRecords] ( |
||||
|
[Timestamp] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowExecutionLogRecord_WorkflowInstanceId] |
||||
|
ON [dbo].[WorkflowExecutionLogRecords] ( |
||||
|
[WorkflowInstanceId] ASC |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Primary Key structure for table workflowexecutionlogrecords |
||||
|
-- ---------------------------- |
||||
|
ALTER TABLE [dbo].[WorkflowExecutionLogRecords] ADD PRIMARY KEY CLUSTERED ([Id]) |
||||
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Indexes structure for table workflowinstances |
||||
|
-- ---------------------------- |
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_ContextId] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[ContextId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_ContextType] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[ContextType] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_CorrelationId] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[CorrelationId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_CreatedAt] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[CreatedAt] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_DefinitionId] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[DefinitionId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_FaultedAt] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[FaultedAt] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_FinishedAt] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[FinishedAt] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_LastExecutedAt] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[LastExecutedAt] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_Name] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[Name] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_TenantId] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[TenantId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_WorkflowStatus] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[WorkflowStatus] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_WorkflowStatus_DefinitionId] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[WorkflowStatus] ASC, |
||||
|
[DefinitionId] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_WorkflowStatus_DefinitionId_Version] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[WorkflowStatus] ASC, |
||||
|
[DefinitionId] ASC, |
||||
|
[Version] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowInstance_DefinitionVersionId] |
||||
|
ON [dbo].[WorkflowInstances] ( |
||||
|
[DefinitionVersionId] ASC |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Primary Key structure for table workflowinstances |
||||
|
-- ---------------------------- |
||||
|
ALTER TABLE [dbo].[WorkflowInstances] ADD PRIMARY KEY CLUSTERED ([Id]) |
||||
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Indexes structure for table workflowsettings |
||||
|
-- ---------------------------- |
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowSetting_Key] |
||||
|
ON [dbo].[WorkflowSettings] ( |
||||
|
[Key] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowSetting_Value] |
||||
|
ON [dbo].[WorkflowSettings] ( |
||||
|
[Value] ASC |
||||
|
) |
||||
|
|
||||
|
CREATE NONCLUSTERED INDEX [IX_WorkflowSetting_WorkflowBlueprintId] |
||||
|
ON [dbo].[WorkflowSettings] ( |
||||
|
[WorkflowBlueprintId] ASC |
||||
|
) |
||||
|
|
||||
|
|
||||
|
-- ---------------------------- |
||||
|
-- Primary Key structure for table workflowsettings |
||||
|
-- ---------------------------- |
||||
|
ALTER TABLE [dbo].[WorkflowSettings] ADD PRIMARY KEY CLUSTERED ([Id]) |
||||
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) |
||||
|
|
||||
|
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion]) |
||||
|
VALUES |
||||
|
(N'20210523093427_Initial', '5.0.10'), |
||||
|
(N'20210611200027_Update21', '5.0.10'), |
||||
|
(N'20210923112211_Update23', '5.0.10'), |
||||
|
(N'20211215100204_Update24', '5.0.10'), |
||||
|
(N'20220120170050_Update241', '5.0.10'), |
||||
|
(N'20220120204150_Update25', '5.0.10'), |
||||
|
(N'20220512203646_Update28', '5.0.10'), |
||||
|
(N'20210604065041_Initial', '5.0.10'), |
||||
|
(N'20210730112043_Initial', '5.0.10'); |
||||
@ -0,0 +1,140 @@ |
|||||
|
using LINGYUN.Abp.Elsa.EntityFrameworkCore.Migrations; |
||||
|
using Microsoft.Data.SqlClient; |
||||
|
using Microsoft.Extensions.FileProviders; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Data; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.VirtualFileSystem; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer.Migrations; |
||||
|
|
||||
|
public class SqlServerElsaDataBaseInstaller : IElsaDataBaseInstaller, ITransientDependency |
||||
|
{ |
||||
|
public ILogger<SqlServerElsaDataBaseInstaller> Logger { protected get; set; } |
||||
|
|
||||
|
private readonly IVirtualFileProvider _virtualFileProvider; |
||||
|
private readonly IConnectionStringResolver _connectionStringResolver; |
||||
|
|
||||
|
private readonly AbpElsaDataBaseInstallerOptions _installerOptions; |
||||
|
|
||||
|
public SqlServerElsaDataBaseInstaller( |
||||
|
IVirtualFileProvider virtualFileProvider, |
||||
|
IConnectionStringResolver connectionStringResolver, |
||||
|
IOptions<AbpElsaDataBaseInstallerOptions> installerOptions) |
||||
|
{ |
||||
|
_installerOptions = installerOptions.Value; |
||||
|
_virtualFileProvider = virtualFileProvider; |
||||
|
_connectionStringResolver = connectionStringResolver; |
||||
|
|
||||
|
Logger = NullLogger<SqlServerElsaDataBaseInstaller>.Instance; |
||||
|
} |
||||
|
|
||||
|
public async virtual Task InstallAsync() |
||||
|
{ |
||||
|
var connectionString = await _connectionStringResolver.ResolveAsync("Workflow"); |
||||
|
if (connectionString.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
Logger.LogWarning("Please configure the `Workflow` database connection string Workflow!"); |
||||
|
throw new ArgumentNullException(nameof(connectionString)); |
||||
|
} |
||||
|
|
||||
|
var builder = new SqlConnectionStringBuilder(connectionString); |
||||
|
|
||||
|
var dataBaseName = await CreateDataBaseIfNotExists(builder.InitialCatalog, builder); |
||||
|
|
||||
|
builder.InitialCatalog = dataBaseName; |
||||
|
|
||||
|
using var sqlConnection = new SqlConnection(builder.ConnectionString); |
||||
|
|
||||
|
if (sqlConnection.State == ConnectionState.Closed) |
||||
|
{ |
||||
|
await sqlConnection.OpenAsync(); |
||||
|
} |
||||
|
|
||||
|
var tableParams = _installerOptions.InstallTables.Select((_, index) => $"@Table_{index}").JoinAsString(","); |
||||
|
using (var sqlCommand = new SqlCommand($"SELECT COUNT(1) FROM [sys].[objects] WHERE type=N'U' AND name IN ({tableParams});", sqlConnection)) |
||||
|
{ |
||||
|
sqlCommand.Parameters.Add("@DataBaseName", SqlDbType.NVarChar).Value = dataBaseName; |
||||
|
for (var index = 0; index < _installerOptions.InstallTables.Count; index++) |
||||
|
{ |
||||
|
sqlCommand.Parameters.Add($"@Table_{index}", SqlDbType.NVarChar).Value = _installerOptions.InstallTables[index]; |
||||
|
} |
||||
|
|
||||
|
var rowsAffects = await sqlCommand.ExecuteScalarAsync() as int?; |
||||
|
if (rowsAffects > 0) |
||||
|
{ |
||||
|
Logger.LogInformation($"The `{dataBaseName}` tables has already exists."); |
||||
|
return; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var sqlScript = await GetInitSqlScript(); |
||||
|
|
||||
|
// USE `${DataBase}` -> USE `Workflow`;;
|
||||
|
sqlScript = sqlScript.ReplaceFirst("${DataBase}", dataBaseName); |
||||
|
|
||||
|
using (var sqlCommand = new SqlCommand(sqlScript, sqlConnection)) |
||||
|
{ |
||||
|
Logger.LogInformation("The database initialization script `Initial.sql` starts..."); |
||||
|
await sqlCommand.ExecuteNonQueryAsync(); |
||||
|
} |
||||
|
|
||||
|
Logger.LogInformation("Database initialization script `Initial.sql` complete!"); |
||||
|
} |
||||
|
|
||||
|
public async virtual Task<string> CreateDataBaseIfNotExists(string dataBase, SqlConnectionStringBuilder connectionStringBuilder) |
||||
|
{ |
||||
|
// 切换主数据库查询数据库是否存在
|
||||
|
connectionStringBuilder.InitialCatalog = "master"; |
||||
|
using var sqlConnection = new SqlConnection(connectionStringBuilder.ConnectionString); |
||||
|
if (sqlConnection.State == ConnectionState.Closed) |
||||
|
{ |
||||
|
await sqlConnection.OpenAsync(); |
||||
|
} |
||||
|
|
||||
|
var checkDataBaseName = ""; |
||||
|
using (var sqlCommand = new SqlCommand("SELECT [name] FROM [master].[dbo].[sysdatabases] WHERE [name] = @DataBaseName;", sqlConnection)) |
||||
|
{ |
||||
|
var dataBaseParamter = sqlCommand.Parameters.Add("DataBaseName", SqlDbType.NVarChar); |
||||
|
dataBaseParamter.Value = dataBase; |
||||
|
|
||||
|
checkDataBaseName = await sqlCommand.ExecuteScalarAsync() as string; |
||||
|
} |
||||
|
|
||||
|
if (checkDataBaseName.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
using (var sqlCommand = new SqlCommand($"CREATE DATABASE {dataBase};", sqlConnection)) |
||||
|
{ |
||||
|
await sqlCommand.ExecuteNonQueryAsync(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return dataBase; |
||||
|
} |
||||
|
|
||||
|
public async virtual Task<string> GetInitSqlScript() |
||||
|
{ |
||||
|
var sqlScriptFileInfo = _virtualFileProvider.GetFileInfo("/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/Migrations/Initial.sql"); |
||||
|
if (!sqlScriptFileInfo.Exists || sqlScriptFileInfo.IsDirectory) |
||||
|
{ |
||||
|
Logger.LogWarning("Please Check that the `Initial.sql` file exists!"); |
||||
|
throw new InvalidOperationException("The `Initial.sql` database initialization script file does not exist or is not valid!"); |
||||
|
} |
||||
|
|
||||
|
var sqlScript = await sqlScriptFileInfo.ReadAsStringAsync(); |
||||
|
if (sqlScript.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
Logger.LogWarning("The contents of the `Initial.sql` file are empty or invalid!"); |
||||
|
throw new InvalidOperationException("The contents of the `Initial.sql` file are empty or invalid!"); |
||||
|
} |
||||
|
|
||||
|
return sqlScript; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||
|
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
||||
|
<xs:element name="Weavers"> |
||||
|
<xs:complexType> |
||||
|
<xs:all> |
||||
|
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
||||
|
<xs:complexType> |
||||
|
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:all> |
||||
|
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
||||
|
<xs:annotation> |
||||
|
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
||||
|
</xs:annotation> |
||||
|
</xs:attribute> |
||||
|
</xs:complexType> |
||||
|
</xs:element> |
||||
|
</xs:schema> |
||||
Loading…
Reference in new issue