Browse Source

feat: 修复SqlServer初始化脚本

pull/1166/head
colin 10 months ago
parent
commit
fb1665a74d
  1. 10
      aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer.csproj
  2. 9
      aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/AbpElsaEntityFrameworkCoreSqlServerModule.cs
  3. 432
      aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/Migrations/Initial.sql
  4. 140
      aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/Migrations/SqlServerElsaDataBaseInstaller.cs
  5. 27
      aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlInstaller/LINGYUN/Abp/Quartz/SqlInstaller/AbpQuartzSqlInstallerModule.cs
  6. 30
      aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlServerInstaller/FodyWeavers.xsd
  7. 20
      aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlServerInstaller/LINGYUN/Abp/Quartz/SqlServerInstaller/Scripts/Initial.sql
  8. 2
      aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlServerInstaller/LINGYUN/Abp/Quartz/SqlServerInstaller/SqlServerQuartzSqlInstaller.cs

10
aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" /> <Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" /> <Import Project="..\..\..\..\common.props" />
@ -13,6 +13,14 @@
<RootNamespace /> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<None Remove="LINGYUN\Abp\Elsa\EntityFrameworkCore\SqlServer\Migrations\Initial.sql" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="LINGYUN\Abp\Elsa\EntityFrameworkCore\SqlServer\Migrations\Initial.sql" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Elsa.Webhooks.Persistence.EntityFramework.SqlServer" /> <PackageReference Include="Elsa.Webhooks.Persistence.EntityFramework.SqlServer" />
<PackageReference Include="Elsa.WorkflowSettings.Persistence.EntityFramework.SqlServer" /> <PackageReference Include="Elsa.WorkflowSettings.Persistence.EntityFramework.SqlServer" />

9
aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/AbpElsaEntityFrameworkCoreSqlServerModule.cs

@ -3,6 +3,7 @@ using Elsa.Options;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.EntityFrameworkCore.SqlServer;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer; namespace LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer;
@ -26,4 +27,12 @@ public class AbpElsaEntityFrameworkCoreSqlServerModule : AbpModule
elsa.AddFeatures(startups, configuration); elsa.AddFeatures(startups, configuration);
}); });
} }
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpElsaEntityFrameworkCoreSqlServerModule>();
});
}
} }

432
aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/Migrations/Initial.sql

@ -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');

140
aspnet-core/modules/elsa/LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer/LINGYUN/Abp/Elsa/EntityFrameworkCore/SqlServer/Migrations/SqlServerElsaDataBaseInstaller.cs

@ -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;
}
}

27
aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlInstaller/LINGYUN/Abp/Quartz/SqlInstaller/AbpQuartzSqlInstallerModule.cs

@ -1,5 +1,9 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Quartz;
using Quartz.Impl;
using Quartz.Simpl;
using Quartz.Util;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -10,10 +14,31 @@ namespace LINGYUN.Abp.Quartz.SqlInstaller;
[DependsOn(typeof(AbpQuartzModule))] [DependsOn(typeof(AbpQuartzModule))]
public class AbpQuartzSqlInstallerModule : AbpModule public class AbpQuartzSqlInstallerModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context)
{
var abpQuartzOptions = context.Services.ExecutePreConfiguredActions<AbpQuartzOptions>();
Configure<QuartzOptions>(options =>
{
foreach (var settingKey in abpQuartzOptions.Properties.AllKeys)
{
options[settingKey] = abpQuartzOptions.Properties[settingKey];
}
if (abpQuartzOptions.Properties[StdSchedulerFactory.PropertyJobStoreType] == null)
{
var defaultJobStoreType = typeof(RAMJobStore).AssemblyQualifiedNameWithoutVersion();
options[StdSchedulerFactory.PropertyJobStoreType] = defaultJobStoreType;
abpQuartzOptions.Properties[StdSchedulerFactory.PropertyJobStoreType] = defaultJobStoreType;
}
});
}
public async override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) public async override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context)
{ {
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>(); var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
if (configuration.GetValue("Quartz:UsePersistentStore", false)) if (configuration.GetValue("Quartz:UsePersistentStore", false) &&
!configuration[StdSchedulerFactory.PropertyJobStoreType].IsNullOrWhiteSpace())
{ {
// 初始化 Quartz 数据库 // 初始化 Quartz 数据库
await context.ServiceProvider await context.ServiceProvider

30
aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlServerInstaller/FodyWeavers.xsd

@ -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>

20
aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlServerInstaller/LINGYUN/Abp/Quartz/SqlServerInstaller/Scripts/Initial.sql

@ -5,7 +5,6 @@
-- Should you only require it to create the tables, set @DropDb to 0. -- Should you only require it to create the tables, set @DropDb to 0.
USE [${DataBase}]; USE [${DataBase}];
GO
DECLARE @DropDb BIT = 1; -- Set this to 0 to skip DROP statements, 1 to include them DECLARE @DropDb BIT = 1; -- Set this to 0 to skip DROP statements, 1 to include them
@ -204,7 +203,6 @@ CREATE TABLE [dbo].[${TablePrefix}TRIGGERS] (
[MISFIRE_INSTR] int NULL, [MISFIRE_INSTR] int NULL,
[JOB_DATA] varbinary(max) NULL [JOB_DATA] varbinary(max) NULL
); );
GO
ALTER TABLE [dbo].[${TablePrefix}CALENDARS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}CALENDARS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}CALENDARS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}CALENDARS] PRIMARY KEY CLUSTERED
@ -212,7 +210,6 @@ ALTER TABLE [dbo].[${TablePrefix}CALENDARS] WITH NOCHECK ADD
[SCHED_NAME], [SCHED_NAME],
[CALENDAR_NAME] [CALENDAR_NAME]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}CRON_TRIGGERS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}CRON_TRIGGERS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}CRON_TRIGGERS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}CRON_TRIGGERS] PRIMARY KEY CLUSTERED
@ -221,7 +218,6 @@ ALTER TABLE [dbo].[${TablePrefix}CRON_TRIGGERS] WITH NOCHECK ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}FIRED_TRIGGERS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}FIRED_TRIGGERS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}FIRED_TRIGGERS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}FIRED_TRIGGERS] PRIMARY KEY CLUSTERED
@ -229,7 +225,6 @@ ALTER TABLE [dbo].[${TablePrefix}FIRED_TRIGGERS] WITH NOCHECK ADD
[SCHED_NAME], [SCHED_NAME],
[ENTRY_ID] [ENTRY_ID]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}PAUSED_TRIGGER_GRPS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}PAUSED_TRIGGER_GRPS] PRIMARY KEY CLUSTERED
@ -237,7 +232,6 @@ ALTER TABLE [dbo].[${TablePrefix}PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD
[SCHED_NAME], [SCHED_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}SCHEDULER_STATE] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}SCHEDULER_STATE] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}SCHEDULER_STATE] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}SCHEDULER_STATE] PRIMARY KEY CLUSTERED
@ -245,7 +239,6 @@ ALTER TABLE [dbo].[${TablePrefix}SCHEDULER_STATE] WITH NOCHECK ADD
[SCHED_NAME], [SCHED_NAME],
[INSTANCE_NAME] [INSTANCE_NAME]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}LOCKS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}LOCKS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}LOCKS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}LOCKS] PRIMARY KEY CLUSTERED
@ -253,7 +246,6 @@ ALTER TABLE [dbo].[${TablePrefix}LOCKS] WITH NOCHECK ADD
[SCHED_NAME], [SCHED_NAME],
[LOCK_NAME] [LOCK_NAME]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}JOB_DETAILS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}JOB_DETAILS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}JOB_DETAILS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}JOB_DETAILS] PRIMARY KEY CLUSTERED
@ -262,7 +254,6 @@ ALTER TABLE [dbo].[${TablePrefix}JOB_DETAILS] WITH NOCHECK ADD
[JOB_NAME], [JOB_NAME],
[JOB_GROUP] [JOB_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}SIMPLE_TRIGGERS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}SIMPLE_TRIGGERS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}SIMPLE_TRIGGERS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}SIMPLE_TRIGGERS] PRIMARY KEY CLUSTERED
@ -271,7 +262,6 @@ ALTER TABLE [dbo].[${TablePrefix}SIMPLE_TRIGGERS] WITH NOCHECK ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}SIMPROP_TRIGGERS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}SIMPROP_TRIGGERS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}SIMPROP_TRIGGERS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}SIMPROP_TRIGGERS] PRIMARY KEY CLUSTERED
@ -280,7 +270,6 @@ ALTER TABLE [dbo].[${TablePrefix}SIMPROP_TRIGGERS] WITH NOCHECK ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}TRIGGERS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}TRIGGERS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}TRIGGERS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}TRIGGERS] PRIMARY KEY CLUSTERED
@ -289,7 +278,6 @@ ALTER TABLE [dbo].[${TablePrefix}TRIGGERS] WITH NOCHECK ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}BLOB_TRIGGERS] WITH NOCHECK ADD ALTER TABLE [dbo].[${TablePrefix}BLOB_TRIGGERS] WITH NOCHECK ADD
CONSTRAINT [PK_${TablePrefix}BLOB_TRIGGERS] PRIMARY KEY CLUSTERED CONSTRAINT [PK_${TablePrefix}BLOB_TRIGGERS] PRIMARY KEY CLUSTERED
@ -298,7 +286,6 @@ ALTER TABLE [dbo].[${TablePrefix}BLOB_TRIGGERS] WITH NOCHECK ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
); );
GO
ALTER TABLE [dbo].[${TablePrefix}CRON_TRIGGERS] ADD ALTER TABLE [dbo].[${TablePrefix}CRON_TRIGGERS] ADD
CONSTRAINT [FK_${TablePrefix}CRON_TRIGGERS_${TablePrefix}TRIGGERS] FOREIGN KEY CONSTRAINT [FK_${TablePrefix}CRON_TRIGGERS_${TablePrefix}TRIGGERS] FOREIGN KEY
@ -311,7 +298,6 @@ ALTER TABLE [dbo].[${TablePrefix}CRON_TRIGGERS] ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
) ON DELETE CASCADE; ) ON DELETE CASCADE;
GO
ALTER TABLE [dbo].[${TablePrefix}SIMPLE_TRIGGERS] ADD ALTER TABLE [dbo].[${TablePrefix}SIMPLE_TRIGGERS] ADD
CONSTRAINT [FK_${TablePrefix}SIMPLE_TRIGGERS_${TablePrefix}TRIGGERS] FOREIGN KEY CONSTRAINT [FK_${TablePrefix}SIMPLE_TRIGGERS_${TablePrefix}TRIGGERS] FOREIGN KEY
@ -324,7 +310,6 @@ ALTER TABLE [dbo].[${TablePrefix}SIMPLE_TRIGGERS] ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
) ON DELETE CASCADE; ) ON DELETE CASCADE;
GO
ALTER TABLE [dbo].[${TablePrefix}SIMPROP_TRIGGERS] ADD ALTER TABLE [dbo].[${TablePrefix}SIMPROP_TRIGGERS] ADD
CONSTRAINT [FK_${TablePrefix}SIMPROP_TRIGGERS_${TablePrefix}TRIGGERS] FOREIGN KEY CONSTRAINT [FK_${TablePrefix}SIMPROP_TRIGGERS_${TablePrefix}TRIGGERS] FOREIGN KEY
@ -337,7 +322,6 @@ ALTER TABLE [dbo].[${TablePrefix}SIMPROP_TRIGGERS] ADD
[TRIGGER_NAME], [TRIGGER_NAME],
[TRIGGER_GROUP] [TRIGGER_GROUP]
) ON DELETE CASCADE; ) ON DELETE CASCADE;
GO
ALTER TABLE [dbo].[${TablePrefix}TRIGGERS] ADD ALTER TABLE [dbo].[${TablePrefix}TRIGGERS] ADD
CONSTRAINT [FK_${TablePrefix}TRIGGERS_${TablePrefix}JOB_DETAILS] FOREIGN KEY CONSTRAINT [FK_${TablePrefix}TRIGGERS_${TablePrefix}JOB_DETAILS] FOREIGN KEY
@ -350,7 +334,6 @@ ALTER TABLE [dbo].[${TablePrefix}TRIGGERS] ADD
[JOB_NAME], [JOB_NAME],
[JOB_GROUP] [JOB_GROUP]
); );
GO
-- Create indexes -- Create indexes
CREATE INDEX [IDX_${TablePrefix}T_G_J] ON [dbo].[${TablePrefix}TRIGGERS](SCHED_NAME, JOB_GROUP, JOB_NAME); CREATE INDEX [IDX_${TablePrefix}T_G_J] ON [dbo].[${TablePrefix}TRIGGERS](SCHED_NAME, JOB_GROUP, JOB_NAME);
@ -366,5 +349,4 @@ CREATE INDEX [IDX_${TablePrefix}T_NFT_ST_MISFIRE_GRP] ON [dbo].[${TablePrefix}T
CREATE INDEX [IDX_${TablePrefix}FT_INST_JOB_REQ_RCVRY] ON [dbo].[${TablePrefix}FIRED_TRIGGERS](SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY); CREATE INDEX [IDX_${TablePrefix}FT_INST_JOB_REQ_RCVRY] ON [dbo].[${TablePrefix}FIRED_TRIGGERS](SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
CREATE INDEX [IDX_${TablePrefix}FT_G_J] ON [dbo].[${TablePrefix}FIRED_TRIGGERS](SCHED_NAME, JOB_GROUP, JOB_NAME); CREATE INDEX [IDX_${TablePrefix}FT_G_J] ON [dbo].[${TablePrefix}FIRED_TRIGGERS](SCHED_NAME, JOB_GROUP, JOB_NAME);
CREATE INDEX [IDX_${TablePrefix}FT_G_T] ON [dbo].[${TablePrefix}FIRED_TRIGGERS](SCHED_NAME, TRIGGER_GROUP, TRIGGER_NAME); CREATE INDEX [IDX_${TablePrefix}FT_G_T] ON [dbo].[${TablePrefix}FIRED_TRIGGERS](SCHED_NAME, TRIGGER_GROUP, TRIGGER_NAME);
GO

2
aspnet-core/modules/task-management/LINGYUN.Abp.Quartz.SqlServerInstaller/LINGYUN/Abp/Quartz/SqlServerInstaller/SqlServerQuartzSqlInstaller.cs

@ -73,7 +73,7 @@ public class SqlServerQuartzSqlInstaller : IQuartzSqlInstaller, ITransientDepend
sqlCommand.Parameters.Add($"@Table_{index}", SqlDbType.NVarChar).Value = $"{tablePrefix}{_installerOptions.InstallTables[index]}"; sqlCommand.Parameters.Add($"@Table_{index}", SqlDbType.NVarChar).Value = $"{tablePrefix}{_installerOptions.InstallTables[index]}";
} }
var rowsAffects = await sqlCommand.ExecuteScalarAsync() as long?; var rowsAffects = await sqlCommand.ExecuteScalarAsync() as int?;
if (rowsAffects > 0) if (rowsAffects > 0)
{ {
Logger.LogInformation($"The `{dataBaseName}` tables has already exists."); Logger.LogInformation($"The `{dataBaseName}` tables has already exists.");

Loading…
Cancel
Save