BulkEncryptionDatabase_5.publish.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. Deployment script for bulkencryption
  3. This code was generated by a tool.
  4. Changes to this file may cause incorrect behavior and will be lost if
  5. the code is regenerated.
  6. */
  7. GO
  8. SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
  9. SET NUMERIC_ROUNDABORT OFF;
  10. GO
  11. :setvar DatabaseName "bulkencryption"
  12. :setvar DefaultFilePrefix "bulkencryption"
  13. :setvar DefaultDataPath ""
  14. :setvar DefaultLogPath ""
  15. GO
  16. :on error exit
  17. GO
  18. /*
  19. Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
  20. To re-enable the script after enabling SQLCMD mode, execute the following:
  21. SET NOEXEC OFF;
  22. */
  23. :setvar __IsSqlCmdEnabled "True"
  24. GO
  25. IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
  26. BEGIN
  27. PRINT N'SQLCMD mode must be enabled to successfully execute this script.';
  28. SET NOEXEC ON;
  29. END
  30. GO
  31. PRINT N'Creating [dbo].[Labels]...';
  32. GO
  33. CREATE TABLE [dbo].[Labels] (
  34. [Id] INT IDENTITY (1, 1) NOT NULL,
  35. [LabelName] NVARCHAR (255) NOT NULL,
  36. [LabelGuid] NVARCHAR (255) NOT NULL,
  37. PRIMARY KEY CLUSTERED ([Id] ASC)
  38. );
  39. GO
  40. PRINT N'Creating [dbo].[Instances]...';
  41. GO
  42. CREATE TABLE [dbo].[Instances] (
  43. [Id] INT IDENTITY (1, 1) NOT NULL,
  44. [StartTime] DATETIME NOT NULL,
  45. [EndTime] DATETIME NULL,
  46. [NumberProcessed] INT NULL,
  47. [NumberErrors] INT NULL,
  48. [Exception] NVARCHAR (MAX) NULL,
  49. [ServerId] INT NOT NULL,
  50. PRIMARY KEY CLUSTERED ([Id] ASC)
  51. );
  52. GO
  53. PRINT N'Creating [dbo].[Servers]...';
  54. GO
  55. CREATE TABLE [dbo].[Servers] (
  56. [Id] INT IDENTITY (1, 1) NOT NULL,
  57. [StartTime] TIME (7) NOT NULL,
  58. [EndTime] TIME (7) NOT NULL,
  59. [ServerName] NVARCHAR (1023) NOT NULL,
  60. [NumberInstances] INT NOT NULL,
  61. [ServerComplete] BIT NULL,
  62. [IsActive] BIT NULL,
  63. PRIMARY KEY CLUSTERED ([Id] ASC)
  64. );
  65. GO
  66. PRINT N'Creating [dbo].[GlobalConfig]...';
  67. GO
  68. CREATE TABLE [dbo].[GlobalConfig] (
  69. [Id] INT IDENTITY (1, 1) NOT NULL,
  70. [Key] NVARCHAR (1023) NOT NULL,
  71. [Value] NVARCHAR (MAX) NOT NULL,
  72. PRIMARY KEY CLUSTERED ([Id] ASC)
  73. );
  74. GO
  75. PRINT N'Creating [dbo].[FileServers]...';
  76. GO
  77. CREATE TABLE [dbo].[FileServers] (
  78. [Id] INT IDENTITY (1, 1) NOT NULL,
  79. [FileServer] NVARCHAR (1023) NOT NULL,
  80. [BJPCStartDate] DATETIME NULL,
  81. [BJPCEndDate] DATETIME NULL,
  82. PRIMARY KEY CLUSTERED ([Id] ASC)
  83. );
  84. GO
  85. PRINT N'Creating [dbo].[ServersFileServers]...';
  86. GO
  87. CREATE TABLE [dbo].[ServersFileServers] (
  88. [Id] INT IDENTITY (1, 1) NOT NULL,
  89. [ServerId] INT NOT NULL,
  90. [FileServerId] INT NOT NULL,
  91. PRIMARY KEY CLUSTERED ([Id] ASC)
  92. );
  93. GO
  94. PRINT N'Creating [dbo].[Files]...';
  95. GO
  96. CREATE TABLE [dbo].[Files] (
  97. [Id] INT IDENTITY (1, 1) NOT NULL,
  98. [FilePath] NVARCHAR (1023) NOT NULL,
  99. [FileServerId] INT NULL,
  100. [Location] NVARCHAR (1023) NULL,
  101. [Status] INT NOT NULL,
  102. [StartedWhen] DATETIME NULL,
  103. [CompletedWhen] DATETIME NULL,
  104. [Exception] NVARCHAR (MAX) NULL,
  105. [RetryCount] INT NULL,
  106. [InstanceId] INT NULL,
  107. [LabelId] INT NOT NULL,
  108. [NewFileName] NVARCHAR (1023) NULL,
  109. [NewFileSize] BIGINT NULL,
  110. [OriginalFileSize] BIGINT NULL,
  111. [PotentialBJLabel] BIT NULL,
  112. PRIMARY KEY CLUSTERED ([Id] ASC)
  113. );
  114. GO
  115. PRINT N'Creating unnamed constraint on [dbo].[Servers]...';
  116. GO
  117. ALTER TABLE [dbo].[Servers]
  118. ADD DEFAULT 1 FOR [IsActive];
  119. GO
  120. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  121. GO
  122. ALTER TABLE [dbo].[Files]
  123. ADD DEFAULT 1 FOR [Status];
  124. GO
  125. PRINT N'Creating unnamed constraint on [dbo].[Instances]...';
  126. GO
  127. ALTER TABLE [dbo].[Instances]
  128. ADD FOREIGN KEY ([ServerId]) REFERENCES [dbo].[Servers] ([Id]);
  129. GO
  130. PRINT N'Creating unnamed constraint on [dbo].[ServersFileServers]...';
  131. GO
  132. ALTER TABLE [dbo].[ServersFileServers]
  133. ADD FOREIGN KEY ([ServerId]) REFERENCES [dbo].[Servers] ([Id]);
  134. GO
  135. PRINT N'Creating unnamed constraint on [dbo].[ServersFileServers]...';
  136. GO
  137. ALTER TABLE [dbo].[ServersFileServers]
  138. ADD FOREIGN KEY ([FileServerId]) REFERENCES [dbo].[FileServers] ([Id]);
  139. GO
  140. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  141. GO
  142. ALTER TABLE [dbo].[Files]
  143. ADD FOREIGN KEY ([InstanceId]) REFERENCES [dbo].[Instances] ([Id]);
  144. GO
  145. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  146. GO
  147. ALTER TABLE [dbo].[Files]
  148. ADD FOREIGN KEY ([LabelId]) REFERENCES [dbo].[Labels] ([Id]);
  149. GO
  150. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  151. GO
  152. ALTER TABLE [dbo].[Files]
  153. ADD FOREIGN KEY ([FileServerId]) REFERENCES [dbo].[FileServers] ([Id]);
  154. GO
  155. PRINT N'Creating [dbo].[GetServerConfig]...';
  156. GO
  157. CREATE PROCEDURE [dbo].[GetServerConfig]
  158. @serverName NVARCHAR(1023)
  159. AS
  160. SELECT * FROM [Servers] s
  161. WHERE s.[ServerName] = @serverName
  162. GO
  163. PRINT N'Creating [dbo].[LogServerComplete]...';
  164. GO
  165. CREATE PROCEDURE [dbo].[LogServerComplete]
  166. @serverName NVARCHAR(1023)
  167. AS
  168. -- Update the servers table that this server is done
  169. UPDATE [Servers] SET [ServerComplete] = 1 WHERE [ServerName] = @serverName
  170. GO
  171. PRINT N'Creating [dbo].[GetActiveInstances]...';
  172. GO
  173. CREATE PROCEDURE [dbo].[GetActiveInstances]
  174. @serverId INT
  175. AS
  176. -- Get all the running scripts for this server
  177. SELECT * FROM [Instances] i
  178. WHERE i.[ServerId] = @serverId AND i.[EndTime] IS NULL
  179. GO
  180. PRINT N'Creating [dbo].[GetActiveServers]...';
  181. GO
  182. CREATE PROCEDURE [dbo].[GetActiveServers]
  183. AS
  184. -- Get all the servers which should be running
  185. DECLARE @timeNow TIME(7) = CONVERT (time, GETUTCDATE())
  186. SELECT * FROM [Servers] s
  187. WHERE
  188. s.[StartTime] < @timeNow
  189. AND s.[EndTime] > @timeNow
  190. AND (s.[ServerComplete] IS NULL OR s.[ServerComplete] <> 1)
  191. AND s.IsActive = 1
  192. GO
  193. PRINT N'Creating [dbo].[LogScriptEnd]...';
  194. GO
  195. CREATE PROCEDURE [dbo].[LogScriptEnd]
  196. @instanceId INT,
  197. @numberProcessed INT = NULL,
  198. @numberErrors INT = NULL,
  199. @exception NVARCHAR(MAX) = NULL
  200. AS
  201. -- Update the instances table to mark this script as 'done'... at least for now
  202. UPDATE Instances
  203. SET
  204. [EndTime] = GETUTCDATE(),
  205. [NumberProcessed] = @numberProcessed,
  206. [NumberErrors] = @numberErrors,
  207. [Exception] = @exception
  208. WHERE [Id] = @instanceId
  209. GO
  210. PRINT N'Creating [dbo].[LogScriptStart]...';
  211. GO
  212. CREATE PROCEDURE [dbo].[LogScriptStart]
  213. @serverName NVARCHAR(1023)
  214. AS
  215. DECLARE @rowId INT = NULL
  216. BEGIN TRANSACTION
  217. -- Get the row from the Servers table
  218. DECLARE @serverId INT
  219. SELECT @serverId = [Id] FROM [Servers] s WHERE s.ServerName = @serverName
  220. -- Return null if there isn't a row in the server table for this
  221. IF @serverId = NULL RETURN NULL
  222. -- Add a row to the instances table to log this script as 'running'
  223. INSERT INTO Instances (StartTime, ServerId)
  224. VALUES (GETUTCDATE(), @serverId)
  225. -- Return the new Id for the script to use
  226. SELECT SCOPE_IDENTITY()
  227. COMMIT
  228. GO
  229. PRINT N'Creating [dbo].[SelectNextFileToProcess]...';
  230. GO
  231. CREATE PROCEDURE [dbo].[SelectNextFileToProcess]
  232. @serverId INT,
  233. @scriptInstanceId INT,
  234. @maxRetries INT,
  235. @mode NVARCHAR(50)
  236. AS
  237. BEGIN TRANSACTION
  238. -- Get the next row to process
  239. DECLARE @rowId INT = 0
  240. IF @mode = 'encrypt'
  241. BEGIN
  242. SELECT @rowId = Id
  243. FROM Files f
  244. WITH (TABLOCKX, HOLDLOCK)
  245. WHERE
  246. (f.[Status] = 1 OR f.[Status] = 4)
  247. AND f.[FileServerId] IN (SELECT [FileServerId] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
  248. AND (f.[RetryCount] IS NULL OR f.[RetryCount] < @maxRetries)
  249. ORDER BY f.[RetryCount] DESC, f.[Id] ASC
  250. END
  251. IF @mode = 'decrypt'
  252. BEGIN
  253. SELECT @rowId = Id
  254. FROM Files f
  255. WITH (TABLOCKX, HOLDLOCK)
  256. WHERE
  257. (f.[Status] = 3 OR f.[Status] = 5)
  258. AND f.[FileServerId] IN (SELECT [FileServerId] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
  259. AND (f.[RetryCount] IS NULL OR f.[RetryCount] < @maxRetries)
  260. ORDER BY f.[RetryCount] DESC, f.[Id] ASC
  261. END
  262. IF @rowId IS NOT NULL AND @rowId > 0
  263. BEGIN
  264. -- 'Lock' the row for processing by this script
  265. UPDATE Files
  266. SET [Status] = 2, [StartedWhen] = GETUTCDATE(), [InstanceId] = @scriptInstanceId
  267. WHERE [Id] = @rowId
  268. -- Get the row (with the label info + server status) to send back to the script
  269. SELECT f.*, l.[LabelGuid], l.[LabelName], s.IsActive, fs.FileServer, fs.BJPCStartDate, fs.BJPCEndDate
  270. FROM Files f
  271. LEFT JOIN Labels l on f.[LabelId] = l.Id
  272. LEFT JOIN Instances i on f.[InstanceId] = i.Id
  273. LEFT JOIN [Servers] s on i.ServerId = s.Id
  274. LEFT JOIN [FileServers] fs on fs.Id = f.FileServerId
  275. WHERE f.[Id] = @rowId
  276. END
  277. COMMIT
  278. GO
  279. PRINT N'Creating [dbo].[UpdateFileRow]...';
  280. GO
  281. CREATE PROCEDURE [dbo].[UpdateFileRow]
  282. @rowId INT,
  283. @exception NVARCHAR(MAX) = NULL,
  284. @retryCount INT = NULL,
  285. @status INT,
  286. @newfilename NVARCHAR(1024) = NULL,
  287. @newfilesize BIGINT = NULL,
  288. @originalfilesize BIGINT = NULL,
  289. @potentialBJLabel BIT = NULL
  290. AS
  291. -- Is this an error or are we good?
  292. -- DECLARE @status INT = 3
  293. -- IF @exception IS NOT NULL AND @exception != '' SET @status = 4
  294. -- Update the row
  295. UPDATE Files
  296. SET [Status] = @status, [CompletedWhen] = GETUTCDATE(), [Exception] = @exception, [RetryCount] = @retryCount, [NewFileName] = @newfilename, [NewFileSize] = @newfilesize, [OriginalFileSize] = @originalfilesize, [PotentialBJLabel] = @potentialBJLabel
  297. WHERE [Id] = @rowId
  298. -- Get the row to send back to the script
  299. SELECT * FROM Files f WHERE f.[Id] = @rowId
  300. GO
  301. /*
  302. Post-Deployment Script Template
  303. --------------------------------------------------------------------------------------
  304. This file contains SQL statements that will be appended to the build script.
  305. Use SQLCMD syntax to include a file in the post-deployment script.
  306. Example: :r .\myfile.sql
  307. Use SQLCMD syntax to reference a variable in the post-deployment script.
  308. Example: :setvar TableName MyTable
  309. SELECT * FROM [$(TableName)]
  310. --------------------------------------------------------------------------------------
  311. */
  312. /* STATUS VALUES
  313. 1 - Awaiting Processing
  314. 2 - In Process
  315. 3 - Complete
  316. 4 - Error
  317. 5 - Error rolling back (removing label)
  318. */
  319. -- GLOBAL CONFIG --
  320. SET IDENTITY_INSERT [GlobalConfig] ON
  321. INSERT INTO [GlobalConfig]
  322. (Id, [Key], [Value])
  323. VALUES
  324. (1, 'MaxRetries', '5'),
  325. (2, 'AADWebAppId', 'ABC-123'),
  326. (3, 'AADWebAppKey', '76492d1116743f0423413b16050a5345MgB8ADIAYgBlAHYAQwByAFUATwB1AFUAaQB1AFAAQwBEAHYAMAAyAFAARgBMAFEAPQA9AHwAZAA4ADUANAA1ADAAMABhAGQAYQA4ADMAZQBhADUAYwBkADcAMQBmAGEAYgBmAGEAYwBiADEAZAAzADEAMABiADYAMABhADEAZQBlAGMAYQA1ADYANQBlADEANwA1AGIAMQAwADgAMwBlADQAYgA2AGQAOABlADcANgA0AGQANgAwADcANgAzADEAZAA5ADQAZgA1AGYAZgBmAGYAOQA4ADYAMABmAGYAMQAyAGEAOQAyAGQANQA5AGQAYwBkADQAZQA4ADkAMwBjADkAMQAyADgAMgA2ADMAYgAxADgAZQAzADcAMAA3ADgANgBkAGQAYQBkADIAZgAyAGMAZQAzADAANQBjADQAOAAxAGIAYwBmADgANABlADUAMQA3ADcANQBjADQANwAwAGUAZgAxAGYAYgA4ADMAYQBkADIAMQAyAGYANgA1AGUAOABhAGEAMQA5AGMAYwAxAGEAMgA1AGMANABmADgANQBmAGEANgAyADkANAA0ADYAYQAyADkA'),
  327. (4, 'AADNativeAppId', '9af6a97d-07fd-4d50-9fd7-cf818046ae7b'),
  328. (5, 'AADToken', 'token')
  329. SET IDENTITY_INSERT [GlobalConfig] OFF
  330. -- LABELS --
  331. SET IDENTITY_INSERT [Labels] ON
  332. INSERT INTO [Labels]
  333. (Id, LabelName, LabelGuid)
  334. VALUES
  335. (1, 'Public', '1234'),
  336. (2, 'Restricted External', '1234'),
  337. (3, 'Restricted Internal', '1234'),
  338. (4, 'Confidential', '1234'),
  339. (5, 'Secret', 'd9f23ae3-a239-45ea-bf23-f515f824c57b')
  340. SET IDENTITY_INSERT [Labels] OFF
  341. -- SERVERS --
  342. SET IDENTITY_INSERT [Servers] ON
  343. INSERT INTO [Servers]
  344. (Id, ServerName, StartTime, EndTime, NumberInstances, ServerComplete)
  345. VALUES
  346. (1, 'DAVROS', '09:00:00', '17:00:00', 1, NULL),
  347. (2, 'MININT-RDS9B7O', '09:00:00', '17:00:00', 2, NULL)
  348. SET IDENTITY_INSERT [Servers] OFF
  349. -- FILE SERVERS --
  350. SET IDENTITY_INSERT [FileServers] ON
  351. INSERT INTO [FileServers]
  352. (Id, FileServer, BJPCStartDate, BJPCEndDate)
  353. VALUES
  354. (1, 'X', '2018-08-06', '2018-08-10'),
  355. (2, 'MININT-RDS9B7O', '2018-09-06', '2018-09-10')
  356. SET IDENTITY_INSERT [FileServers] OFF
  357. -- SERVERS - FILE SERVERS --
  358. INSERT INTO [ServersFileServers]
  359. (ServerId, FileServerId)
  360. VALUES
  361. (1, 1),
  362. (2, 2)
  363. -- STATUS CODES --
  364. INSERT INTO [StatusCodes] (Status) VALUES
  365. ('NotStarted'),('InProgress'),('SuccessfulEncrypt'),('EncryptError'),('FailedDecrypt'),('WillNotEncrypt'),('NotFound')
  366. GO
  367. GO
  368. PRINT N'Update complete.';
  369. GO