Simplify DB to six tables and load credentials via Always Encrypted SonicCredential.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
DATABASE: [master]
|
||||
OBJECTNAME: DropExisting
|
||||
ACTION: DROP
|
||||
IDX: 001
|
||||
DATE: 2026-07-29
|
||||
USER: CUR
|
||||
COMMENT: Loescht die befuellte Alt-DB (Tippfehler-Name) und die Ziel-DB
|
||||
vollstaendig inkl. aller Tabellen und Always-Encrypted-Keys
|
||||
(CMK/CEK). Danach: 01_CreateDatabase -> 02_CreateSchema -> 03_Seed.
|
||||
Voraussetzung Client: Always-Encrypted-Zertifikat mit Thumbprint
|
||||
aus appsettings (CurrentUser\My) muss vorhanden bleiben.
|
||||
ACHTUNG: destruktiv, keine Datenmigration.
|
||||
*/
|
||||
USE [master];
|
||||
GO
|
||||
|
||||
/* Alte DB mit Tippfehler im Namen */
|
||||
IF DB_ID(N'EsbZertifkatManager') IS NOT NULL
|
||||
BEGIN
|
||||
ALTER DATABASE [EsbZertifkatManager]
|
||||
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
|
||||
|
||||
DROP DATABASE [EsbZertifkatManager];
|
||||
END;
|
||||
GO
|
||||
|
||||
/* Ziel-DB (falls bereits angelegt / befuellt) */
|
||||
IF DB_ID(N'EsbZertifikatManager') IS NOT NULL
|
||||
BEGIN
|
||||
ALTER DATABASE [EsbZertifikatManager]
|
||||
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
|
||||
|
||||
DROP DATABASE [EsbZertifikatManager];
|
||||
END;
|
||||
GO
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
DATABASE: [EsbZertifikatManager]
|
||||
OBJECTNAME: Database
|
||||
ACTION: CREATE
|
||||
IDX: 002
|
||||
DATE: 2026-07-29
|
||||
USER: CUR
|
||||
COMMENT: Legt die leere Ziel-DB an. Vorher 00_DropExisting.sql ausfuehren
|
||||
(loescht Alt- und Ziel-DB inkl. Always Encrypted).
|
||||
Reihenfolge: 00_DropExisting -> 01_CreateDatabase ->
|
||||
02_CreateSchema -> 03_Seed.
|
||||
*/
|
||||
USE [master];
|
||||
GO
|
||||
|
||||
IF DB_ID(N'EsbZertifikatManager') IS NOT NULL
|
||||
BEGIN
|
||||
THROW 50001,
|
||||
N'Datenbank [EsbZertifikatManager] existiert noch. Zuerst 00_DropExisting.sql ausfuehren.',
|
||||
1;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE DATABASE [EsbZertifikatManager];
|
||||
GO
|
||||
|
||||
ALTER DATABASE [EsbZertifikatManager] SET RECOVERY SIMPLE;
|
||||
GO
|
||||
|
||||
ALTER DATABASE [EsbZertifikatManager] SET READ_WRITE;
|
||||
GO
|
||||
@@ -0,0 +1,606 @@
|
||||
/*
|
||||
DATABASE: [EsbZertifikatManager]
|
||||
OBJECTNAME: Schema
|
||||
ACTION: CREATE
|
||||
IDX: 002
|
||||
DATE: 2026-07-29
|
||||
USER: CUR
|
||||
COMMENT: 6 Kern-Tabellen + Always Encrypted (CMK/CEK).
|
||||
Vorher 00_DropExisting + 01_CreateDatabase ausfuehren.
|
||||
CMK-KEY_PATH = CurrentUser/My/<Thumbprint aus appsettings>.
|
||||
CEK-ENCRYPTED_VALUE ist an dieses Zertifikat gebunden.
|
||||
Bei neuem Cert: CEK in SSMS neu erzeugen und ENCRYPTED_VALUE ersetzen.
|
||||
Connection String muss Column Encryption Setting=Enabled enthalten.
|
||||
*/
|
||||
USE [EsbZertifikatManager];
|
||||
GO
|
||||
|
||||
SET ANSI_NULLS ON;
|
||||
GO
|
||||
|
||||
SET QUOTED_IDENTIFIER ON;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Reste bereinigen: Kind-Tabellen -> AE-Tabellen -> CEK -> CMK */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[CertificateBackup]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[CertificateBackup];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[DeploymentRunStep]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[DeploymentRunStep];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[DeploymentRunContainer]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[DeploymentRunContainer];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[DeploymentRun]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[DeploymentRun];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[DeploymentAction]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[DeploymentAction];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[TlsEndpoint]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[TlsEndpoint];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[CertificateTarget]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[CertificateTarget];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[CertificateArtifact]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[CertificateArtifact];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[AppUser]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[AppUser];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[SonicCredential]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[SonicCredential];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[SonicContainer]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[SonicContainer];
|
||||
END;
|
||||
GO
|
||||
|
||||
/* SonicConnection kann AE-Spalten haben — vor CEK-Drop entfernen */
|
||||
IF OBJECT_ID(N'[dbo].[SonicConnection]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[SonicConnection];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[EsbService]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[EsbService];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[Country]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[Country];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[Environment]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[Environment];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[Company]', N'U') IS NOT NULL
|
||||
BEGIN
|
||||
DROP TABLE [dbo].[Company];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [sys].[column_encryption_keys] AS cek
|
||||
WHERE cek.[name] = N'CEK_ESB_ZertifikatManager'
|
||||
)
|
||||
BEGIN
|
||||
DROP COLUMN ENCRYPTION KEY [CEK_ESB_ZertifikatManager];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [sys].[column_master_keys] AS cmk
|
||||
WHERE cmk.[name] = N'CMK_ESB_ZertifikatManager'
|
||||
)
|
||||
BEGIN
|
||||
DROP COLUMN MASTER KEY [CMK_ESB_ZertifikatManager];
|
||||
END;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Always Encrypted – neu anlegen */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
CREATE COLUMN MASTER KEY [CMK_ESB_ZertifikatManager]
|
||||
WITH
|
||||
(
|
||||
KEY_STORE_PROVIDER_NAME = N'MSSQL_CERTIFICATE_STORE',
|
||||
KEY_PATH = N'CurrentUser/My/238AC7A32074D5B293C7EFB60E256907CB82C9C6'
|
||||
);
|
||||
GO
|
||||
|
||||
CREATE COLUMN ENCRYPTION KEY [CEK_ESB_ZertifikatManager]
|
||||
WITH VALUES
|
||||
(
|
||||
COLUMN_MASTER_KEY = [CMK_ESB_ZertifikatManager],
|
||||
ALGORITHM = 'RSA_OAEP',
|
||||
ENCRYPTED_VALUE = 0x016E000001630075007200720065006E00740075007300650072002F006D0079002F003200330038006100630037006100330032003000370034006400350062003200390033006300370065006600620036003000650032003500360039003000370063006200380032006300390063003600B8FEA92C9873A6A27B4EB33481926ABF719FB0C2EE7DF959AE38D48185CC7286E7779016745253EDB10C769773D03B614995E2373AE9F02428370727C5DF69B902A01EC0B93E8B8D114460455BAC0C1868DAE1A49AAF04480E8A3D05867395CA455CA9FADEF046437B8C25BA7DE945FCB45A50590DA555B1EB860F23B556B72A142992C085E3D4A97E92D2882D6849C6DABCF37653926A8FBC532A115CB9748179BF34DADDE268FD0DC8FF1CFBCB7192D3220238794D6D2FC7C4BDE501BABE5F6BB989853C6B5C510396069F41338CF64236A6D7A4C26F0DF7BBD2A1A5BD3BA2F7D75FECF7BE0AB0C69DDEEAAD72E2849D0A4F9C9A0C25E021A432EE399AA075AB3F0FB9929392D825E1EC991D017022982C17E72CFA9EEDB17DED9FCECF2B8651B72CA87EEAED5473B3806BD4C0A56539703B4EFF38D2889D255B95C9A6F1AD7D22A1FF2F71621B286FCAD8B708810E7BF50D027BF6A0A829422EE599D00CF2D8E6ADB7DE802971A5805073EC2E6F9793E9AEDE30E7B8EC865D50183EB64B9B8286E4A9BFFB98ACDAA9C9D8D149834DE1CA7FEF9C6A54AF4B30BDDF4AC41C36FB0EFD4EE783CEE1546D25A7CA75C549A2FB978907AFBD209197A9D60239F14F4CFAC202F435AA80DBF6A6494AB3E934F86C640DBFBB77879F2FFA8B1C9DD1BF3B14299C12943F57F1948CC5833986918EB7ACABBC1C4D642E1944BB07AB8446
|
||||
);
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Company */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[Company]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[Company]
|
||||
(
|
||||
[CompanyId] [int] IDENTITY(1, 1) NOT NULL,
|
||||
[CompanyCode] [nvarchar](30) NOT NULL,
|
||||
[CompanyName] [nvarchar](200) NOT NULL,
|
||||
[IsActive] [bit] NOT NULL,
|
||||
[CreationDateTime] [datetime2](3) NOT NULL,
|
||||
[CreatedBy] [nvarchar](128) NOT NULL,
|
||||
[ModifiedDateTime] [datetime2](3) NULL,
|
||||
[ModifiedBy] [nvarchar](128) NULL,
|
||||
CONSTRAINT [pk_Company] PRIMARY KEY CLUSTERED ([CompanyId] ASC),
|
||||
CONSTRAINT [uc_Company_CompanyCode] UNIQUE NONCLUSTERED ([CompanyCode] ASC)
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_Company_IsActive]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Company]
|
||||
ADD CONSTRAINT [dc_Company_IsActive]
|
||||
DEFAULT ((1)) FOR [IsActive];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_Company_CreationDateTime]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Company]
|
||||
ADD CONSTRAINT [dc_Company_CreationDateTime]
|
||||
DEFAULT (SYSUTCDATETIME()) FOR [CreationDateTime];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_Company_CreatedBy]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Company]
|
||||
ADD CONSTRAINT [dc_Company_CreatedBy]
|
||||
DEFAULT (SUSER_SNAME()) FOR [CreatedBy];
|
||||
END;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Environment */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[Environment]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[Environment]
|
||||
(
|
||||
[EnvironmentId] [int] IDENTITY(1, 1) NOT NULL,
|
||||
[EnvironmentCode] [nvarchar](30) NOT NULL,
|
||||
[EnvironmentName] [nvarchar](100) NOT NULL,
|
||||
[SortOrder] [int] NOT NULL,
|
||||
[IsActive] [bit] NOT NULL,
|
||||
[CreationDateTime] [datetime2](3) NOT NULL,
|
||||
[CreatedBy] [nvarchar](128) NOT NULL,
|
||||
[ModifiedDateTime] [datetime2](3) NULL,
|
||||
[ModifiedBy] [nvarchar](128) NULL,
|
||||
CONSTRAINT [pk_Environment] PRIMARY KEY CLUSTERED ([EnvironmentId] ASC),
|
||||
CONSTRAINT [uc_Environment_EnvironmentCode] UNIQUE NONCLUSTERED ([EnvironmentCode] ASC),
|
||||
CONSTRAINT [uc_Environment_SortOrder] UNIQUE NONCLUSTERED ([SortOrder] ASC)
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_Environment_IsActive]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Environment]
|
||||
ADD CONSTRAINT [dc_Environment_IsActive]
|
||||
DEFAULT ((1)) FOR [IsActive];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_Environment_CreationDateTime]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Environment]
|
||||
ADD CONSTRAINT [dc_Environment_CreationDateTime]
|
||||
DEFAULT (SYSUTCDATETIME()) FOR [CreationDateTime];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_Environment_CreatedBy]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Environment]
|
||||
ADD CONSTRAINT [dc_Environment_CreatedBy]
|
||||
DEFAULT (SUSER_SNAME()) FOR [CreatedBy];
|
||||
END;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* SonicConnection */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[SonicConnection]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[SonicConnection]
|
||||
(
|
||||
[SonicConnectionId] [int] IDENTITY(1, 1) NOT NULL,
|
||||
[EnvironmentId] [int] NOT NULL,
|
||||
[ConnectionName] [nvarchar](150) NOT NULL,
|
||||
[ManagementHost] [nvarchar](255) NOT NULL,
|
||||
[ManagementPort] [int] NOT NULL,
|
||||
[DomainName] [nvarchar](150) NOT NULL,
|
||||
[ConnectionProtocol] [nvarchar](20) NOT NULL,
|
||||
[IsActive] [bit] NOT NULL,
|
||||
[CreationDateTime] [datetime2](3) NOT NULL,
|
||||
[CreatedBy] [nvarchar](128) NOT NULL,
|
||||
[ModifiedDateTime] [datetime2](3) NULL,
|
||||
[ModifiedBy] [nvarchar](128) NULL,
|
||||
CONSTRAINT [pk_SonicConnection] PRIMARY KEY CLUSTERED ([SonicConnectionId] ASC),
|
||||
CONSTRAINT [uc_SonicConnection_ConnectionName] UNIQUE NONCLUSTERED ([ConnectionName] ASC),
|
||||
CONSTRAINT [fk_SonicConnection_EnvironmentId]
|
||||
FOREIGN KEY ([EnvironmentId])
|
||||
REFERENCES [dbo].[Environment] ([EnvironmentId]),
|
||||
CONSTRAINT [cc_SonicConnection_ManagementPort]
|
||||
CHECK ([ManagementPort] >= (1) AND [ManagementPort] <= (65535))
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicConnection_ConnectionProtocol]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicConnection]
|
||||
ADD CONSTRAINT [dc_SonicConnection_ConnectionProtocol]
|
||||
DEFAULT (N'tcp') FOR [ConnectionProtocol];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicConnection_IsActive]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicConnection]
|
||||
ADD CONSTRAINT [dc_SonicConnection_IsActive]
|
||||
DEFAULT ((1)) FOR [IsActive];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicConnection_CreationDateTime]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicConnection]
|
||||
ADD CONSTRAINT [dc_SonicConnection_CreationDateTime]
|
||||
DEFAULT (SYSUTCDATETIME()) FOR [CreationDateTime];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicConnection_CreatedBy]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicConnection]
|
||||
ADD CONSTRAINT [dc_SonicConnection_CreatedBy]
|
||||
DEFAULT (SUSER_SNAME()) FOR [CreatedBy];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [sys].[indexes] AS i
|
||||
WHERE i.[object_id] = OBJECT_ID(N'[dbo].[SonicConnection]')
|
||||
AND i.[name] = N'idx_SonicConnection_EnvironmentActive'
|
||||
)
|
||||
BEGIN
|
||||
CREATE NONCLUSTERED INDEX [idx_SonicConnection_EnvironmentActive]
|
||||
ON [dbo].[SonicConnection]
|
||||
(
|
||||
[EnvironmentId] ASC,
|
||||
[IsActive] ASC
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* SonicCredential (Always Encrypted) */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[SonicCredential]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[SonicCredential]
|
||||
(
|
||||
[SonicCredentialId] [int] IDENTITY(1, 1) NOT NULL,
|
||||
[SonicConnectionId] [int] NOT NULL,
|
||||
[CredentialName] [nvarchar](150) NOT NULL,
|
||||
[CredentialUserName] [nvarchar](256)
|
||||
COLLATE Latin1_General_BIN2
|
||||
ENCRYPTED WITH
|
||||
(
|
||||
COLUMN_ENCRYPTION_KEY = [CEK_ESB_ZertifikatManager],
|
||||
ENCRYPTION_TYPE = Randomized,
|
||||
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
|
||||
) NULL,
|
||||
[CredentialSecret] [nvarchar](512)
|
||||
COLLATE Latin1_General_BIN2
|
||||
ENCRYPTED WITH
|
||||
(
|
||||
COLUMN_ENCRYPTION_KEY = [CEK_ESB_ZertifikatManager],
|
||||
ENCRYPTION_TYPE = Randomized,
|
||||
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
|
||||
) NULL,
|
||||
[IsDefault] [bit] NOT NULL,
|
||||
[IsActive] [bit] NOT NULL,
|
||||
[CreationDateTime] [datetime2](3) NOT NULL,
|
||||
[CreatedBy] [nvarchar](128) NOT NULL,
|
||||
[ModifiedDateTime] [datetime2](3) NULL,
|
||||
[ModifiedBy] [nvarchar](128) NULL,
|
||||
CONSTRAINT [pk_SonicCredential] PRIMARY KEY CLUSTERED ([SonicCredentialId] ASC),
|
||||
CONSTRAINT [uc_SonicCredential_CredentialName]
|
||||
UNIQUE NONCLUSTERED ([SonicConnectionId] ASC, [CredentialName] ASC),
|
||||
CONSTRAINT [fk_SonicCredential_SonicConnectionId]
|
||||
FOREIGN KEY ([SonicConnectionId])
|
||||
REFERENCES [dbo].[SonicConnection] ([SonicConnectionId])
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicCredential_IsDefault]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicCredential]
|
||||
ADD CONSTRAINT [dc_SonicCredential_IsDefault]
|
||||
DEFAULT ((0)) FOR [IsDefault];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicCredential_IsActive]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicCredential]
|
||||
ADD CONSTRAINT [dc_SonicCredential_IsActive]
|
||||
DEFAULT ((1)) FOR [IsActive];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicCredential_CreationDateTime]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicCredential]
|
||||
ADD CONSTRAINT [dc_SonicCredential_CreationDateTime]
|
||||
DEFAULT (SYSUTCDATETIME()) FOR [CreationDateTime];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicCredential_CreatedBy]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicCredential]
|
||||
ADD CONSTRAINT [dc_SonicCredential_CreatedBy]
|
||||
DEFAULT (SUSER_SNAME()) FOR [CreatedBy];
|
||||
END;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* SonicContainer */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[SonicContainer]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[SonicContainer]
|
||||
(
|
||||
[SonicContainerId] [int] IDENTITY(1, 1) NOT NULL,
|
||||
[CompanyId] [int] NOT NULL,
|
||||
[SonicConnectionId] [int] NOT NULL,
|
||||
[ContainerName] [nvarchar](250) NOT NULL,
|
||||
[ContainerDisplayName] [nvarchar](250) NULL,
|
||||
[RestartTimeoutSeconds] [int] NOT NULL,
|
||||
[IsActive] [bit] NOT NULL,
|
||||
[CreationDateTime] [datetime2](3) NOT NULL,
|
||||
[CreatedBy] [nvarchar](128) NOT NULL,
|
||||
[ModifiedDateTime] [datetime2](3) NULL,
|
||||
[ModifiedBy] [nvarchar](128) NULL,
|
||||
CONSTRAINT [pk_SonicContainer] PRIMARY KEY CLUSTERED ([SonicContainerId] ASC),
|
||||
CONSTRAINT [uc_SonicContainer_CompanyContainer]
|
||||
UNIQUE NONCLUSTERED ([CompanyId] ASC, [ContainerName] ASC),
|
||||
CONSTRAINT [fk_SonicContainer_CompanyId]
|
||||
FOREIGN KEY ([CompanyId])
|
||||
REFERENCES [dbo].[Company] ([CompanyId]),
|
||||
CONSTRAINT [fk_SonicContainer_SonicConnectionId]
|
||||
FOREIGN KEY ([SonicConnectionId])
|
||||
REFERENCES [dbo].[SonicConnection] ([SonicConnectionId]),
|
||||
CONSTRAINT [cc_SonicContainer_RestartTimeoutSeconds]
|
||||
CHECK ([RestartTimeoutSeconds] >= (10) AND [RestartTimeoutSeconds] <= (3600))
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicContainer_RestartTimeoutSeconds]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicContainer]
|
||||
ADD CONSTRAINT [dc_SonicContainer_RestartTimeoutSeconds]
|
||||
DEFAULT ((180)) FOR [RestartTimeoutSeconds];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicContainer_IsActive]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicContainer]
|
||||
ADD CONSTRAINT [dc_SonicContainer_IsActive]
|
||||
DEFAULT ((1)) FOR [IsActive];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicContainer_CreationDateTime]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicContainer]
|
||||
ADD CONSTRAINT [dc_SonicContainer_CreationDateTime]
|
||||
DEFAULT (SYSUTCDATETIME()) FOR [CreationDateTime];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_SonicContainer_CreatedBy]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[SonicContainer]
|
||||
ADD CONSTRAINT [dc_SonicContainer_CreatedBy]
|
||||
DEFAULT (SUSER_SNAME()) FOR [CreatedBy];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [sys].[indexes] AS i
|
||||
WHERE i.[object_id] = OBJECT_ID(N'[dbo].[SonicContainer]')
|
||||
AND i.[name] = N'idx_SonicContainer_ConnectionActive'
|
||||
)
|
||||
BEGIN
|
||||
CREATE NONCLUSTERED INDEX [idx_SonicContainer_ConnectionActive]
|
||||
ON [dbo].[SonicContainer]
|
||||
(
|
||||
[SonicConnectionId] ASC,
|
||||
[IsActive] ASC
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [sys].[indexes] AS i
|
||||
WHERE i.[object_id] = OBJECT_ID(N'[dbo].[SonicContainer]')
|
||||
AND i.[name] = N'idx_SonicContainer_CompanyActive'
|
||||
)
|
||||
BEGIN
|
||||
CREATE NONCLUSTERED INDEX [idx_SonicContainer_CompanyActive]
|
||||
ON [dbo].[SonicContainer]
|
||||
(
|
||||
[CompanyId] ASC,
|
||||
[IsActive] ASC
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* CertificateTarget */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[CertificateTarget]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[CertificateTarget]
|
||||
(
|
||||
[CertificateTargetId] [int] IDENTITY(1, 1) NOT NULL,
|
||||
[SonicContainerId] [int] NOT NULL,
|
||||
[TargetDirectory] [nvarchar](500) NOT NULL,
|
||||
[TargetFileName] [nvarchar](260) NOT NULL,
|
||||
[BackupEnabled] [bit] NOT NULL,
|
||||
[BackupDirectoryName] [nvarchar](100) NOT NULL,
|
||||
[IsActive] [bit] NOT NULL,
|
||||
[CreationDateTime] [datetime2](3) NOT NULL,
|
||||
[CreatedBy] [nvarchar](128) NOT NULL,
|
||||
[ModifiedDateTime] [datetime2](3) NULL,
|
||||
[ModifiedBy] [nvarchar](128) NULL,
|
||||
CONSTRAINT [pk_CertificateTarget] PRIMARY KEY CLUSTERED ([CertificateTargetId] ASC),
|
||||
CONSTRAINT [uc_CertificateTarget_Destination]
|
||||
UNIQUE NONCLUSTERED
|
||||
(
|
||||
[SonicContainerId] ASC,
|
||||
[TargetDirectory] ASC,
|
||||
[TargetFileName] ASC
|
||||
),
|
||||
CONSTRAINT [fk_CertificateTarget_SonicContainerId]
|
||||
FOREIGN KEY ([SonicContainerId])
|
||||
REFERENCES [dbo].[SonicContainer] ([SonicContainerId])
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_CertificateTarget_BackupEnabled]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[CertificateTarget]
|
||||
ADD CONSTRAINT [dc_CertificateTarget_BackupEnabled]
|
||||
DEFAULT ((1)) FOR [BackupEnabled];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_CertificateTarget_BackupDirectoryName]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[CertificateTarget]
|
||||
ADD CONSTRAINT [dc_CertificateTarget_BackupDirectoryName]
|
||||
DEFAULT (N'Backup') FOR [BackupDirectoryName];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_CertificateTarget_IsActive]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[CertificateTarget]
|
||||
ADD CONSTRAINT [dc_CertificateTarget_IsActive]
|
||||
DEFAULT ((1)) FOR [IsActive];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_CertificateTarget_CreationDateTime]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[CertificateTarget]
|
||||
ADD CONSTRAINT [dc_CertificateTarget_CreationDateTime]
|
||||
DEFAULT (SYSUTCDATETIME()) FOR [CreationDateTime];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[dc_CertificateTarget_CreatedBy]', N'D') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[CertificateTarget]
|
||||
ADD CONSTRAINT [dc_CertificateTarget_CreatedBy]
|
||||
DEFAULT (SUSER_SNAME()) FOR [CreatedBy];
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [sys].[indexes] AS i
|
||||
WHERE i.[object_id] = OBJECT_ID(N'[dbo].[CertificateTarget]')
|
||||
AND i.[name] = N'idx_CertificateTarget_ContainerActive'
|
||||
)
|
||||
BEGIN
|
||||
CREATE NONCLUSTERED INDEX [idx_CertificateTarget_ContainerActive]
|
||||
ON [dbo].[CertificateTarget]
|
||||
(
|
||||
[SonicContainerId] ASC,
|
||||
[IsActive] ASC
|
||||
);
|
||||
END;
|
||||
GO
|
||||
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
DATABASE: [EsbZertifikatManager]
|
||||
OBJECTNAME: Seed
|
||||
ACTION: INSERT
|
||||
IDX: 001
|
||||
DATE: 2026-07-29
|
||||
USER: CUR
|
||||
COMMENT: Stammdaten Company (DE/PL/AT) und Environment (TEST2/TEST/PROD).
|
||||
Nach 00_DropExisting / 01_CreateDatabase / 02_CreateSchema.
|
||||
SonicConnection / SonicContainer / CertificateTarget / SonicCredential
|
||||
manuell pflegen — keine Secrets; Credentials nur via AE/Setup.
|
||||
*/
|
||||
USE [EsbZertifikatManager];
|
||||
GO
|
||||
|
||||
SET ANSI_NULLS ON;
|
||||
GO
|
||||
|
||||
SET QUOTED_IDENTIFIER ON;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[Company] AS company
|
||||
WHERE company.[CompanyCode] = N'DE'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO [dbo].[Company]
|
||||
(
|
||||
[CompanyCode],
|
||||
[CompanyName],
|
||||
[IsActive],
|
||||
[CreationDateTime],
|
||||
[CreatedBy]
|
||||
)
|
||||
VALUES
|
||||
(N'DE', N'ZIEHL-ABEGG Deutschland', 1, SYSUTCDATETIME(), SUSER_SNAME());
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[Company] AS company
|
||||
WHERE company.[CompanyCode] = N'PL'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO [dbo].[Company]
|
||||
(
|
||||
[CompanyCode],
|
||||
[CompanyName],
|
||||
[IsActive],
|
||||
[CreationDateTime],
|
||||
[CreatedBy]
|
||||
)
|
||||
VALUES
|
||||
(N'PL', N'ZIEHL-ABEGG Polen', 1, SYSUTCDATETIME(), SUSER_SNAME());
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[Company] AS company
|
||||
WHERE company.[CompanyCode] = N'AT'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO [dbo].[Company]
|
||||
(
|
||||
[CompanyCode],
|
||||
[CompanyName],
|
||||
[IsActive],
|
||||
[CreationDateTime],
|
||||
[CreatedBy]
|
||||
)
|
||||
VALUES
|
||||
(N'AT', N'ZIEHL-ABEGG Oesterreich', 1, SYSUTCDATETIME(), SUSER_SNAME());
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[Environment] AS environment
|
||||
WHERE environment.[EnvironmentCode] = N'TEST2'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO [dbo].[Environment]
|
||||
(
|
||||
[EnvironmentCode],
|
||||
[EnvironmentName],
|
||||
[SortOrder],
|
||||
[IsActive],
|
||||
[CreationDateTime],
|
||||
[CreatedBy]
|
||||
)
|
||||
VALUES
|
||||
(N'TEST2', N'Test 2', 1, 1, SYSUTCDATETIME(), SUSER_SNAME());
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[Environment] AS environment
|
||||
WHERE environment.[EnvironmentCode] = N'TEST'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO [dbo].[Environment]
|
||||
(
|
||||
[EnvironmentCode],
|
||||
[EnvironmentName],
|
||||
[SortOrder],
|
||||
[IsActive],
|
||||
[CreationDateTime],
|
||||
[CreatedBy]
|
||||
)
|
||||
VALUES
|
||||
(N'TEST', N'Test', 2, 1, SYSUTCDATETIME(), SUSER_SNAME());
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[Environment] AS environment
|
||||
WHERE environment.[EnvironmentCode] = N'PROD'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO [dbo].[Environment]
|
||||
(
|
||||
[EnvironmentCode],
|
||||
[EnvironmentName],
|
||||
[SortOrder],
|
||||
[IsActive],
|
||||
[CreationDateTime],
|
||||
[CreatedBy]
|
||||
)
|
||||
VALUES
|
||||
(N'PROD', N'Production', 3, 1, SYSUTCDATETIME(), SUSER_SNAME());
|
||||
END;
|
||||
GO
|
||||
@@ -0,0 +1,36 @@
|
||||
# Datenbank EsbZertifikatManager
|
||||
|
||||
Schlankes Schema (6 Tabellen) für den ESB Certificate Manager.
|
||||
|
||||
## Hierarchie
|
||||
|
||||
- **Company** — DE / PL / AT
|
||||
- **Environment** — TEST2 / TEST / PROD (an `SonicConnection`)
|
||||
- **SonicConnection** — Management-Host/Port/Domain
|
||||
- **SonicCredential** — Always-Encrypted-Zugangsdaten (einziger Credential-Speicher)
|
||||
- **SonicContainer** — Container je Company + Connection
|
||||
- **CertificateTarget** — Deploy-Pfad/Dateiname (+ lokales File-Backup)
|
||||
|
||||
## Deployment (bestehende befüllte DB ersetzen)
|
||||
|
||||
Alles wird gelöscht — keine Migration.
|
||||
|
||||
1. **Always-Encrypted-Zertifikat** prüfen (Thumbprint aus `appsettings.json` → `AlwaysEncrypted:CertificateThumbprint`) unter `CurrentUser\My` inkl. privatem Schlüssel.
|
||||
2. Skripte **in dieser Reihenfolge** in SSMS ausführen:
|
||||
1. `00_DropExisting.sql` — droppt `EsbZertifkatManager` (Alt) und `EsbZertifikatManager` inkl. CMK/CEK
|
||||
2. `01_CreateDatabase.sql` — leere Ziel-DB
|
||||
3. `02_CreateSchema.sql` — Always Encrypted (CMK/CEK) + 6 Tabellen
|
||||
4. `03_Seed.sql` — Company + Environment
|
||||
3. Connection String: `Database=EsbZertifikatManager` und `Column Encryption Setting=Enabled`.
|
||||
4. Connections / Container / Targets manuell anlegen; Credentials **nur** über Setup-Wizard (`SonicCredential`, Always Encrypted).
|
||||
5. App neu starten.
|
||||
|
||||
## Always Encrypted
|
||||
|
||||
| Objekt | Name |
|
||||
|---|---|
|
||||
| Column Master Key | `CMK_ESB_ZertifikatManager` |
|
||||
| Column Encryption Key | `CEK_ESB_ZertifikatManager` |
|
||||
| Verschlüsselte Spalten | `SonicCredential.CredentialUserName`, `SonicCredential.CredentialSecret` |
|
||||
|
||||
CMK zeigt auf `CurrentUser/My/<Thumbprint>`. Der `ENCRYPTED_VALUE` der CEK gilt nur für dieses Zertifikat — bei neuem Cert CEK in SSMS neu erzeugen und in `02_CreateSchema.sql` ersetzen.
|
||||
Reference in New Issue
Block a user