Files
InstallerRobot/web-server/database/04_notifications.sql
2026-07-20 14:46:07 +07:00

74 lines
2.3 KiB
Transact-SQL

USE [RobotInstaller];
GO
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
GO
-- Additive/idempotent migration. Safe to run more than once.
IF OBJECT_ID(N'dbo.Notifications', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Notifications
(
Id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT PK_Notifications PRIMARY KEY CLUSTERED
CONSTRAINT DF_Notifications_Id DEFAULT NEWSEQUENTIALID(),
RecipientUserId UNIQUEIDENTIFIER NOT NULL,
ActorUserId UNIQUEIDENTIFIER NULL,
ActorName NVARCHAR(200) NULL,
BroadcastId UNIQUEIDENTIFIER NULL,
EventType NVARCHAR(100) NOT NULL,
Severity NVARCHAR(20) NOT NULL
CONSTRAINT DF_Notifications_Severity DEFAULT N'info',
Title NVARCHAR(200) NOT NULL,
Message NVARCHAR(1000) NOT NULL,
EntityType NVARCHAR(50) NULL,
EntityId NVARCHAR(100) NULL,
ActionUrl NVARCHAR(1000) NULL,
ReadAt DATETIME2(3) NULL,
CreatedAt DATETIME2(3) NOT NULL
CONSTRAINT DF_Notifications_CreatedAt DEFAULT SYSUTCDATETIME(),
ExpiresAt DATETIME2(3) NULL,
CONSTRAINT FK_Notifications_RecipientUser
FOREIGN KEY (RecipientUserId) REFERENCES dbo.Users(Id) ON DELETE CASCADE,
CONSTRAINT CK_Notifications_Severity
CHECK (Severity IN (N'info', N'success', N'warning', N'error')),
CONSTRAINT CK_Notifications_EventType_NotBlank
CHECK (LEN(LTRIM(RTRIM(EventType))) > 0),
CONSTRAINT CK_Notifications_Title_NotBlank
CHECK (LEN(LTRIM(RTRIM(Title))) > 0),
CONSTRAINT CK_Notifications_Message_NotBlank
CHECK (LEN(LTRIM(RTRIM(Message))) > 0)
);
END;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.Notifications')
AND name = N'IX_Notifications_Recipient_Read_Created'
)
BEGIN
CREATE INDEX IX_Notifications_Recipient_Read_Created
ON dbo.Notifications(RecipientUserId, ReadAt, CreatedAt DESC)
INCLUDE (Severity, Title, ActionUrl, ExpiresAt);
END;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.Notifications')
AND name = N'IX_Notifications_BroadcastId'
)
BEGIN
CREATE INDEX IX_Notifications_BroadcastId
ON dbo.Notifications(BroadcastId)
WHERE BroadcastId IS NOT NULL;
END;
GO
PRINT N'RobotInstaller notification schema is ready.';
GO