mirror of
https://github.com/Microsoft/sql-server-samples.git
synced 2025-12-08 14:58:54 +00:00
- Add a link for the ledger subfolder in sql-server-samples/README.md at master · Pietervanhove/sql-server-samples (github.com) - Change the folder name from “sqlledger” to “ledger” (that’s the official feature name now). - sql-server-samples/README.md at master · Pietervanhove/sql-server-samples (github.com) o Fix grammar in “The demo in this folder showcases the ledger feature in Azure SQL Database. The demo uses the Contoso HR web application.” o Are Az PS 5.6, SqlServer 21.1.18245, Bicep 0.4.63, SSMS 18.9.1 the versions you’ve tested with? These are older versions (the same we used when developing the AE demo). Should we recommend using newer versions? o “The ContosoHR database using General Purpose compute tier, 2 vCores, and the Gen5 hardware generation.” I’m wondering if there is a better/more economical SLO/SKU we can pick, instead of the 2-core Gen 5 database. Of course, Basic/Standard would be very cheap, but we probably should promote the new v-core model. Would serverless be a better option, e.g. “GP_S_Gen5_1”? o If we change the folder name, change sqlledger to ledger in cd "C:\sql-server-samples\samples\features\security\sql-ledger\azure-sql-database\setup" o “Open a new InPrivate browser window.” Are these instructions generic enough to accommodate browsers other than Edge? - sql-server-samples/samples/features/security/contoso-hr-sql-db at master · Pietervanhove/sql-server-samples (github.com) o This is unrelated to ledger. Could you also remove this folder? It was checked in by mistake when we added the AE demo. It is redundant/not needed.
194 lines
5.6 KiB
Transact-SQL
194 lines
5.6 KiB
Transact-SQL
SET ANSI_NULLS ON
|
|
GO
|
|
|
|
SET QUOTED_IDENTIFIER ON
|
|
GO
|
|
|
|
CREATE TABLE [dbo].[Employees](
|
|
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
|
|
[SSN] [char](11) NOT NULL,
|
|
[FirstName] [nvarchar](50) NOT NULL,
|
|
[LastName] [nvarchar](50) NOT NULL,
|
|
[Salary] [money] NOT NULL
|
|
)
|
|
WITH
|
|
(
|
|
SYSTEM_VERSIONING = ON,
|
|
LEDGER = ON
|
|
);
|
|
GO
|
|
|
|
|
|
CREATE TABLE [dbo].[AuditEvents](
|
|
[Timestamp] [Datetime2] NOT NULL DEFAULT (GETDATE()),
|
|
[UserName] [nvarchar](255) NOT NULL,
|
|
[Query] [nvarchar](4000) NOT NULL
|
|
)
|
|
WITH (LEDGER = ON (APPEND_ONLY = ON));
|
|
GO
|
|
|
|
CREATE TABLE [dbo].[LedgerVerifications](
|
|
[Timestamp] [Datetime2] NOT NULL DEFAULT (GETDATE()),
|
|
[DigestLocations] [nvarchar](max) NOT NULL,
|
|
[Result] [nvarchar](255) NOT NULL,
|
|
)
|
|
WITH (LEDGER = ON (APPEND_ONLY = ON));
|
|
GO
|
|
|
|
CREATE PROCEDURE [dbo].[GetEmployeeLedgerEntries]
|
|
AS
|
|
SET NOCOUNT ON
|
|
BEGIN
|
|
SELECT
|
|
t.[commit_time] AS [CommitTime]
|
|
, t.[principal_name] AS [UserName]
|
|
, l.EmployeeId
|
|
, l.[SSN]
|
|
, l.[FirstName]
|
|
, l.[LastName]
|
|
, l.[Salary]
|
|
, l.[ledger_operation_type_desc] AS Operation
|
|
FROM [dbo].[Employees_Ledger] l
|
|
JOIN sys.database_ledger_transactions t
|
|
ON t.transaction_id = l.ledger_transaction_id
|
|
WHERE t.[commit_time] > DATEADD(MINUTE, -10, GETDATE())
|
|
ORDER BY t.commit_time DESC
|
|
END;
|
|
GO
|
|
|
|
CREATE PROCEDURE [dbo].[VerifyLedger]
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON
|
|
DECLARE @digest_locations NVARCHAR(MAX) = (SELECT * FROM sys.database_ledger_digest_locations FOR JSON AUTO, INCLUDE_NULL_VALUES);
|
|
BEGIN TRY
|
|
EXEC sys.sp_verify_database_ledger_from_digest_storage @digest_locations;
|
|
INSERT INTO [dbo].[LedgerVerifications] ([DigestLocations], [Result]) VALUES (@digest_locations, N'Success')
|
|
END TRY
|
|
BEGIN CATCH
|
|
INSERT INTO [dbo].[LedgerVerifications] ([DigestLocations], [Result]) VALUES (@digest_locations, N'Failure')
|
|
END CATCH
|
|
END;
|
|
GO
|
|
|
|
CREATE PROCEDURE [dbo].[GetLedgerVerifications]
|
|
AS
|
|
SET NOCOUNT ON
|
|
BEGIN
|
|
SELECT *
|
|
FROM [dbo].[LedgerVerifications]
|
|
WHERE [Timestamp] > DATEADD(MINUTE, -60, GETDATE())
|
|
ORDER BY [Timestamp] DESC
|
|
END;
|
|
GO
|
|
|
|
CREATE PROCEDURE [dbo].[GetAuditEvents]
|
|
AS
|
|
SET NOCOUNT ON
|
|
BEGIN
|
|
SELECT *
|
|
FROM [dbo].[AuditEvents]
|
|
WHERE [Timestamp] > DATEADD(MINUTE, -10, GETDATE())
|
|
ORDER BY [Timestamp] DESC
|
|
END;
|
|
GO
|
|
|
|
CREATE TABLE [AspNetRoles] (
|
|
[Id] nvarchar(450) NOT NULL,
|
|
[Name] nvarchar(256) NULL,
|
|
[NormalizedName] nvarchar(256) NULL,
|
|
[ConcurrencyStamp] nvarchar(max) NULL,
|
|
CONSTRAINT [PK_AspNetRoles] PRIMARY KEY ([Id])
|
|
);
|
|
GO
|
|
|
|
CREATE TABLE [AspNetUsers] (
|
|
[Id] nvarchar(450) NOT NULL,
|
|
[UserName] nvarchar(256) NULL,
|
|
[NormalizedUserName] nvarchar(256) NULL,
|
|
[Email] nvarchar(256) NULL,
|
|
[NormalizedEmail] nvarchar(256) NULL,
|
|
[EmailConfirmed] bit NOT NULL,
|
|
[PasswordHash] nvarchar(max) NULL,
|
|
[SecurityStamp] nvarchar(max) NULL,
|
|
[ConcurrencyStamp] nvarchar(max) NULL,
|
|
[PhoneNumber] nvarchar(max) NULL,
|
|
[PhoneNumberConfirmed] bit NOT NULL,
|
|
[TwoFactorEnabled] bit NOT NULL,
|
|
[LockoutEnd] datetimeoffset NULL,
|
|
[LockoutEnabled] bit NOT NULL,
|
|
[AccessFailedCount] int NOT NULL,
|
|
CONSTRAINT [PK_AspNetUsers] PRIMARY KEY ([Id])
|
|
);
|
|
GO
|
|
|
|
CREATE TABLE [AspNetRoleClaims] (
|
|
[Id] int NOT NULL IDENTITY,
|
|
[RoleId] nvarchar(450) NOT NULL,
|
|
[ClaimType] nvarchar(max) NULL,
|
|
[ClaimValue] nvarchar(max) NULL,
|
|
CONSTRAINT [PK_AspNetRoleClaims] PRIMARY KEY ([Id]),
|
|
CONSTRAINT [FK_AspNetRoleClaims_AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [AspNetRoles] ([Id]) ON DELETE CASCADE
|
|
);
|
|
GO
|
|
|
|
CREATE TABLE [AspNetUserClaims] (
|
|
[Id] int NOT NULL IDENTITY,
|
|
[UserId] nvarchar(450) NOT NULL,
|
|
[ClaimType] nvarchar(max) NULL,
|
|
[ClaimValue] nvarchar(max) NULL,
|
|
CONSTRAINT [PK_AspNetUserClaims] PRIMARY KEY ([Id]),
|
|
CONSTRAINT [FK_AspNetUserClaims_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE
|
|
);
|
|
GO
|
|
|
|
CREATE TABLE [AspNetUserLogins] (
|
|
[LoginProvider] nvarchar(128) NOT NULL,
|
|
[ProviderKey] nvarchar(128) NOT NULL,
|
|
[ProviderDisplayName] nvarchar(max) NULL,
|
|
[UserId] nvarchar(450) NOT NULL,
|
|
CONSTRAINT [PK_AspNetUserLogins] PRIMARY KEY ([LoginProvider], [ProviderKey]),
|
|
CONSTRAINT [FK_AspNetUserLogins_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE
|
|
);
|
|
GO
|
|
|
|
CREATE TABLE [AspNetUserRoles] (
|
|
[UserId] nvarchar(450) NOT NULL,
|
|
[RoleId] nvarchar(450) NOT NULL,
|
|
CONSTRAINT [PK_AspNetUserRoles] PRIMARY KEY ([UserId], [RoleId]),
|
|
CONSTRAINT [FK_AspNetUserRoles_AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [AspNetRoles] ([Id]) ON DELETE CASCADE,
|
|
CONSTRAINT [FK_AspNetUserRoles_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE
|
|
);
|
|
GO
|
|
|
|
CREATE TABLE [AspNetUserTokens] (
|
|
[UserId] nvarchar(450) NOT NULL,
|
|
[LoginProvider] nvarchar(128) NOT NULL,
|
|
[Name] nvarchar(128) NOT NULL,
|
|
[Value] nvarchar(max) NULL,
|
|
CONSTRAINT [PK_AspNetUserTokens] PRIMARY KEY ([UserId], [LoginProvider], [Name]),
|
|
CONSTRAINT [FK_AspNetUserTokens_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE
|
|
);
|
|
GO
|
|
|
|
|
|
CREATE INDEX [IX_AspNetRoleClaims_RoleId] ON [AspNetRoleClaims] ([RoleId]);
|
|
GO
|
|
|
|
CREATE UNIQUE INDEX [RoleNameIndex] ON [AspNetRoles] ([NormalizedName]) WHERE [NormalizedName] IS NOT NULL;
|
|
GO
|
|
|
|
CREATE INDEX [IX_AspNetUserClaims_UserId] ON [AspNetUserClaims] ([UserId]);
|
|
GO
|
|
|
|
CREATE INDEX [IX_AspNetUserLogins_UserId] ON [AspNetUserLogins] ([UserId]);
|
|
GO
|
|
|
|
CREATE INDEX [IX_AspNetUserRoles_RoleId] ON [AspNetUserRoles] ([RoleId]);
|
|
GO
|
|
|
|
CREATE INDEX [EmailIndex] ON [AspNetUsers] ([NormalizedEmail]);
|
|
GO
|
|
|
|
CREATE UNIQUE INDEX [UserNameIndex] ON [AspNetUsers] ([NormalizedUserName]) WHERE [NormalizedUserName] IS NOT NULL;
|
|
GO |