Files
sql-server-samples/samples/features/security/ledger/azure-sql-database/setup/CreateDatabaseSchema.sql
T
Pieter 898e3a6d14 Update readme
-	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.
2022-02-17 11:34:54 +01:00

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