BulkEncryptionDatabase_1.publish.sql 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  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. IF EXISTS (SELECT 1
  32. FROM [sys].[databases]
  33. WHERE [name] = N'$(DatabaseName)')
  34. BEGIN
  35. ALTER DATABASE [$(DatabaseName)]
  36. SET ANSI_NULLS ON,
  37. ANSI_PADDING ON,
  38. ANSI_WARNINGS ON,
  39. ARITHABORT ON,
  40. CONCAT_NULL_YIELDS_NULL ON,
  41. NUMERIC_ROUNDABORT OFF,
  42. QUOTED_IDENTIFIER ON,
  43. ANSI_NULL_DEFAULT ON,
  44. CURSOR_CLOSE_ON_COMMIT OFF,
  45. AUTO_CREATE_STATISTICS ON,
  46. AUTO_SHRINK OFF,
  47. AUTO_UPDATE_STATISTICS ON,
  48. RECURSIVE_TRIGGERS OFF
  49. WITH ROLLBACK IMMEDIATE;
  50. END
  51. GO
  52. IF EXISTS (SELECT 1
  53. FROM [sys].[databases]
  54. WHERE [name] = N'$(DatabaseName)')
  55. BEGIN
  56. ALTER DATABASE [$(DatabaseName)]
  57. SET ALLOW_SNAPSHOT_ISOLATION OFF;
  58. END
  59. GO
  60. IF EXISTS (SELECT 1
  61. FROM [sys].[databases]
  62. WHERE [name] = N'$(DatabaseName)')
  63. BEGIN
  64. ALTER DATABASE [$(DatabaseName)]
  65. SET AUTO_UPDATE_STATISTICS_ASYNC OFF,
  66. DATE_CORRELATION_OPTIMIZATION OFF
  67. WITH ROLLBACK IMMEDIATE;
  68. END
  69. GO
  70. IF EXISTS (SELECT 1
  71. FROM [sys].[databases]
  72. WHERE [name] = N'$(DatabaseName)')
  73. BEGIN
  74. ALTER DATABASE [$(DatabaseName)]
  75. SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF)
  76. WITH ROLLBACK IMMEDIATE;
  77. END
  78. GO
  79. IF EXISTS (SELECT 1
  80. FROM [sys].[databases]
  81. WHERE [name] = N'$(DatabaseName)')
  82. BEGIN
  83. ALTER DATABASE [$(DatabaseName)]
  84. SET QUERY_STORE (QUERY_CAPTURE_MODE = AUTO, OPERATION_MODE = READ_WRITE, DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_PLANS_PER_QUERY = 200, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), MAX_STORAGE_SIZE_MB = 100)
  85. WITH ROLLBACK IMMEDIATE;
  86. END
  87. GO
  88. IF EXISTS (SELECT 1
  89. FROM [sys].[databases]
  90. WHERE [name] = N'$(DatabaseName)')
  91. BEGIN
  92. ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
  93. ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
  94. ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
  95. ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
  96. ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
  97. ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
  98. ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
  99. ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
  100. END
  101. GO
  102. IF EXISTS (SELECT 1
  103. FROM [sys].[databases]
  104. WHERE [name] = N'$(DatabaseName)')
  105. BEGIN
  106. ALTER DATABASE [$(DatabaseName)]
  107. SET TEMPORAL_HISTORY_RETENTION ON
  108. WITH ROLLBACK IMMEDIATE;
  109. END
  110. GO
  111. PRINT N'Creating [dbo].[Labels]...';
  112. GO
  113. CREATE TABLE [dbo].[Labels] (
  114. [Id] INT IDENTITY (1, 1) NOT NULL,
  115. [LabelName] NVARCHAR (255) NOT NULL,
  116. [LabelGuid] NVARCHAR (255) NOT NULL,
  117. PRIMARY KEY CLUSTERED ([Id] ASC)
  118. );
  119. GO
  120. PRINT N'Creating [dbo].[Instances]...';
  121. GO
  122. CREATE TABLE [dbo].[Instances] (
  123. [Id] INT IDENTITY (1, 1) NOT NULL,
  124. [StartTime] DATETIME NOT NULL,
  125. [EndTime] DATETIME NULL,
  126. [NumberProcessed] INT NULL,
  127. [NumberErrors] INT NULL,
  128. [Exception] NVARCHAR (MAX) NULL,
  129. [ServerId] INT NOT NULL,
  130. PRIMARY KEY CLUSTERED ([Id] ASC)
  131. );
  132. GO
  133. PRINT N'Creating [dbo].[Servers]...';
  134. GO
  135. CREATE TABLE [dbo].[Servers] (
  136. [Id] INT IDENTITY (1, 1) NOT NULL,
  137. [StartTime] TIME (7) NOT NULL,
  138. [EndTime] TIME (7) NOT NULL,
  139. [ServerName] NVARCHAR (1023) NOT NULL,
  140. [NumberInstances] INT NOT NULL,
  141. [ServerComplete] BIT NULL,
  142. [IsActive] BIT NULL,
  143. PRIMARY KEY CLUSTERED ([Id] ASC)
  144. );
  145. GO
  146. PRINT N'Creating [dbo].[GlobalConfig]...';
  147. GO
  148. CREATE TABLE [dbo].[GlobalConfig] (
  149. [Id] INT IDENTITY (1, 1) NOT NULL,
  150. [Key] NVARCHAR (1023) NOT NULL,
  151. [Value] NVARCHAR (MAX) NOT NULL,
  152. PRIMARY KEY CLUSTERED ([Id] ASC)
  153. );
  154. GO
  155. PRINT N'Creating [dbo].[FileServers]...';
  156. GO
  157. CREATE TABLE [dbo].[FileServers] (
  158. [Id] INT IDENTITY (1, 1) NOT NULL,
  159. [FileServer] NVARCHAR (1023) NOT NULL,
  160. [BJPCStartDate] DATETIME NULL,
  161. [BJPCEndDate] DATETIME NULL,
  162. PRIMARY KEY CLUSTERED ([Id] ASC)
  163. );
  164. GO
  165. PRINT N'Creating [dbo].[ServersFileServers]...';
  166. GO
  167. CREATE TABLE [dbo].[ServersFileServers] (
  168. [Id] INT IDENTITY (1, 1) NOT NULL,
  169. [ServerId] INT NOT NULL,
  170. [FileServerId] INT NOT NULL,
  171. PRIMARY KEY CLUSTERED ([Id] ASC)
  172. );
  173. GO
  174. PRINT N'Creating [dbo].[Files]...';
  175. GO
  176. CREATE TABLE [dbo].[Files] (
  177. [Id] INT IDENTITY (1, 1) NOT NULL,
  178. [FilePath] NVARCHAR (1023) NOT NULL,
  179. [FileServerId] INT NULL,
  180. [Location] NVARCHAR (1023) NULL,
  181. [Status] INT NOT NULL,
  182. [StartedWhen] DATETIME NULL,
  183. [CompletedWhen] DATETIME NULL,
  184. [Exception] NVARCHAR (MAX) NULL,
  185. [RetryCount] INT NULL,
  186. [InstanceId] INT NULL,
  187. [LabelId] INT NOT NULL,
  188. [NewFileName] NVARCHAR (1023) NULL,
  189. [NewFileSize] BIGINT NULL,
  190. [OriginalFileSize] BIGINT NULL,
  191. [PotentialBJLabel] BIT NULL,
  192. PRIMARY KEY CLUSTERED ([Id] ASC)
  193. );
  194. GO
  195. PRINT N'Creating unnamed constraint on [dbo].[Servers]...';
  196. GO
  197. ALTER TABLE [dbo].[Servers]
  198. ADD DEFAULT 1 FOR [IsActive];
  199. GO
  200. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  201. GO
  202. ALTER TABLE [dbo].[Files]
  203. ADD DEFAULT 1 FOR [Status];
  204. GO
  205. PRINT N'Creating unnamed constraint on [dbo].[Instances]...';
  206. GO
  207. ALTER TABLE [dbo].[Instances]
  208. ADD FOREIGN KEY ([ServerId]) REFERENCES [dbo].[Servers] ([Id]);
  209. GO
  210. PRINT N'Creating unnamed constraint on [dbo].[ServersFileServers]...';
  211. GO
  212. ALTER TABLE [dbo].[ServersFileServers]
  213. ADD FOREIGN KEY ([ServerId]) REFERENCES [dbo].[Servers] ([Id]);
  214. GO
  215. PRINT N'Creating unnamed constraint on [dbo].[ServersFileServers]...';
  216. GO
  217. ALTER TABLE [dbo].[ServersFileServers]
  218. ADD FOREIGN KEY ([FileServerId]) REFERENCES [dbo].[FileServers] ([Id]);
  219. GO
  220. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  221. GO
  222. ALTER TABLE [dbo].[Files]
  223. ADD FOREIGN KEY ([InstanceId]) REFERENCES [dbo].[Instances] ([Id]);
  224. GO
  225. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  226. GO
  227. ALTER TABLE [dbo].[Files]
  228. ADD FOREIGN KEY ([LabelId]) REFERENCES [dbo].[Labels] ([Id]);
  229. GO
  230. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  231. GO
  232. ALTER TABLE [dbo].[Files]
  233. ADD FOREIGN KEY ([FileServerId]) REFERENCES [dbo].[FileServers] ([Id]);
  234. GO
  235. PRINT N'Creating [dbo].[GetServerConfig]...';
  236. GO
  237. CREATE PROCEDURE [dbo].[GetServerConfig]
  238. @serverName NVARCHAR(1023)
  239. AS
  240. SELECT * FROM [Servers] s
  241. WHERE s.[ServerName] = @serverName
  242. GO
  243. PRINT N'Creating [dbo].[LogServerComplete]...';
  244. GO
  245. CREATE PROCEDURE [dbo].[LogServerComplete]
  246. @serverName NVARCHAR(1023)
  247. AS
  248. -- Update the servers table that this server is done
  249. UPDATE [Servers] SET [ServerComplete] = 1 WHERE [ServerName] = @serverName
  250. GO
  251. PRINT N'Creating [dbo].[GetActiveInstances]...';
  252. GO
  253. CREATE PROCEDURE [dbo].[GetActiveInstances]
  254. @serverId INT
  255. AS
  256. -- Get all the running scripts for this server
  257. SELECT * FROM [Instances] i
  258. WHERE i.[ServerId] = @serverId AND i.[EndTime] IS NULL
  259. GO
  260. PRINT N'Creating [dbo].[GetActiveServers]...';
  261. GO
  262. CREATE PROCEDURE [dbo].[GetActiveServers]
  263. AS
  264. -- Get all the servers which should be running
  265. DECLARE @timeNow TIME(7) = CONVERT (time, GETUTCDATE())
  266. SELECT * FROM [Servers] s
  267. WHERE
  268. s.[StartTime] < @timeNow
  269. AND s.[EndTime] > @timeNow
  270. AND (s.[ServerComplete] IS NULL OR s.[ServerComplete] <> 1)
  271. AND s.IsActive = 1
  272. GO
  273. PRINT N'Creating [dbo].[LogScriptEnd]...';
  274. GO
  275. CREATE PROCEDURE [dbo].[LogScriptEnd]
  276. @instanceId INT,
  277. @numberProcessed INT = NULL,
  278. @numberErrors INT = NULL,
  279. @exception NVARCHAR(MAX) = NULL
  280. AS
  281. -- Update the instances table to mark this script as 'done'... at least for now
  282. UPDATE Instances
  283. SET
  284. [EndTime] = GETUTCDATE(),
  285. [NumberProcessed] = @numberProcessed,
  286. [NumberErrors] = @numberErrors,
  287. [Exception] = @exception
  288. WHERE [Id] = @instanceId
  289. GO
  290. PRINT N'Creating [dbo].[LogScriptStart]...';
  291. GO
  292. CREATE PROCEDURE [dbo].[LogScriptStart]
  293. @serverName NVARCHAR(1023)
  294. AS
  295. DECLARE @rowId INT = NULL
  296. BEGIN TRANSACTION
  297. -- Get the row from the Servers table
  298. DECLARE @serverId INT
  299. SELECT @serverId = [Id] FROM [Servers] s WHERE s.ServerName = @serverName
  300. -- Return null if there isn't a row in the server table for this
  301. IF @serverId = NULL RETURN NULL
  302. -- Add a row to the instances table to log this script as 'running'
  303. INSERT INTO Instances (StartTime, ServerId)
  304. VALUES (GETUTCDATE(), @serverId)
  305. -- Return the new Id for the script to use
  306. SELECT SCOPE_IDENTITY()
  307. COMMIT
  308. GO
  309. PRINT N'Creating [dbo].[SelectNextFileToProcess]...';
  310. GO
  311. CREATE PROCEDURE [dbo].[SelectNextFileToProcess]
  312. @serverId INT,
  313. @scriptInstanceId INT,
  314. @maxRetries INT,
  315. @mode NVARCHAR(50)
  316. AS
  317. BEGIN TRANSACTION
  318. -- Get the next row to process
  319. DECLARE @rowId INT = 0
  320. IF @mode = 'encrypt'
  321. BEGIN
  322. SELECT @rowId = Id
  323. FROM Files f
  324. WITH (TABLOCKX, HOLDLOCK)
  325. WHERE
  326. (f.[Status] = 1 OR f.[Status] = 4)
  327. AND f.[FileServerId] IN (SELECT [FileServerId] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
  328. AND (f.[RetryCount] IS NULL OR f.[RetryCount] < @maxRetries)
  329. ORDER BY f.[RetryCount] DESC, f.[Id] ASC
  330. END
  331. IF @mode = 'decrypt'
  332. BEGIN
  333. SELECT @rowId = Id
  334. FROM Files f
  335. WITH (TABLOCKX, HOLDLOCK)
  336. WHERE
  337. (f.[Status] = 3 OR f.[Status] = 5)
  338. AND f.[FileServerId] IN (SELECT [FileServerId] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
  339. AND (f.[RetryCount] IS NULL OR f.[RetryCount] < @maxRetries)
  340. ORDER BY f.[RetryCount] DESC, f.[Id] ASC
  341. END
  342. IF @rowId IS NOT NULL AND @rowId > 0
  343. BEGIN
  344. -- 'Lock' the row for processing by this script
  345. UPDATE Files
  346. SET [Status] = 2, [StartedWhen] = GETUTCDATE(), [InstanceId] = @scriptInstanceId
  347. WHERE [Id] = @rowId
  348. -- Get the row (with the label info + server status) to send back to the script
  349. SELECT f.*, l.[LabelGuid], l.[LabelName], s.IsActive, fs.FileServer, fs.BJPCStartDate, fs.BJPCEndDate
  350. FROM Files f
  351. LEFT JOIN Labels l on f.[LabelId] = l.Id
  352. LEFT JOIN Instances i on f.[InstanceId] = i.Id
  353. LEFT JOIN [Servers] s on i.ServerId = s.Id
  354. LEFT JOIN [FileServers] fs on fs.Id = f.FileServerId
  355. WHERE f.[Id] = @rowId
  356. END
  357. COMMIT
  358. GO
  359. PRINT N'Creating [dbo].[UpdateFileRow]...';
  360. GO
  361. CREATE PROCEDURE [dbo].[UpdateFileRow]
  362. @rowId INT,
  363. @exception NVARCHAR(MAX) = NULL,
  364. @retryCount INT = NULL,
  365. @status INT,
  366. @newfilename NVARCHAR(1024) = NULL,
  367. @newfilesize BIGINT = NULL,
  368. @originalfilesize BIGINT = NULL,
  369. @potentialBJLabel BIT = NULL
  370. AS
  371. -- Is this an error or are we good?
  372. -- DECLARE @status INT = 3
  373. -- IF @exception IS NOT NULL AND @exception != '' SET @status = 4
  374. -- Update the row
  375. UPDATE Files
  376. SET [Status] = @status, [CompletedWhen] = GETUTCDATE(), [Exception] = @exception, [RetryCount] = @retryCount, [NewFileName] = @newfilename, [NewFileSize] = @newfilesize, [OriginalFileSize] = @originalfilesize, [PotentialBJLabel] = @potentialBJLabel
  377. WHERE [Id] = @rowId
  378. -- Get the row to send back to the script
  379. SELECT * FROM Files f WHERE f.[Id] = @rowId
  380. GO
  381. /*
  382. Post-Deployment Script Template
  383. --------------------------------------------------------------------------------------
  384. This file contains SQL statements that will be appended to the build script.
  385. Use SQLCMD syntax to include a file in the post-deployment script.
  386. Example: :r .\myfile.sql
  387. Use SQLCMD syntax to reference a variable in the post-deployment script.
  388. Example: :setvar TableName MyTable
  389. SELECT * FROM [$(TableName)]
  390. --------------------------------------------------------------------------------------
  391. */
  392. /* STATUS VALUES
  393. 1 - Awaiting Processing
  394. 2 - In Process
  395. 3 - Complete
  396. 4 - Error
  397. 5 - Error rolling back (removing label)
  398. */
  399. -- GLOBAL CONFIG --
  400. SET IDENTITY_INSERT [GlobalConfig] ON
  401. INSERT INTO [GlobalConfig]
  402. (Id, [Key], [Value])
  403. VALUES
  404. (1, 'MaxRetries', '5'),
  405. (2, 'AADWebAppId', 'ABC-123'),
  406. (3, 'AADWebAppKey', 'XXX'),
  407. (4, 'AADNativeAppId', '123'),
  408. (5, 'AADToken', 'Token-1')
  409. SET IDENTITY_INSERT [GlobalConfig] OFF
  410. -- LABELS --
  411. SET IDENTITY_INSERT [Labels] ON
  412. INSERT INTO [Labels]
  413. (Id, LabelName, LabelGuid)
  414. VALUES
  415. (1, 'Public', '1234'),
  416. (2, 'Restricted External', '1234'),
  417. (3, 'Restricted Internal', '1234'),
  418. (4, 'Confidential', '1234'),
  419. (5, 'Secret', 'd9f23ae3-a239-45ea-bf23-f515f824c57b')
  420. SET IDENTITY_INSERT [Labels] OFF
  421. -- SERVERS --
  422. SET IDENTITY_INSERT [Servers] ON
  423. INSERT INTO [Servers]
  424. (Id, ServerName, StartTime, EndTime, NumberInstances, ServerComplete)
  425. VALUES
  426. (1, 'DAVROS', '09:00:00', '17:00:00', 1, NULL),
  427. (2, 'MININT-RDS9B7O', '09:00:00', '17:00:00', 2, NULL)
  428. SET IDENTITY_INSERT [Servers] OFF
  429. SET IDENTITY_INSERT [FileServers] ON
  430. INSERT INTO [FileServers]
  431. (Id, FileServers, BJPCStartDate, BJPCEndDate)
  432. VALUES
  433. (1, 'X', '2018-08-06', '2018-08-10'),
  434. (2, 'MININT-RDS9B7O', '2018-09-06', '2018-09-10')
  435. SET IDENTITY_INSERT [FileServers] OFF
  436. -- SERVERS - FILE SERVERS --
  437. INSERT INTO [ServersFileServers]
  438. (ServerId, FileServerId)
  439. VALUES
  440. (1, 1),
  441. (2, 2)
  442. -- STATUS CODES --
  443. INSERT INTO [StatusCodes] (Status) VALUES
  444. ('NotStarted'),('InProgress'),('SuccessfulEncrypt'),('EncryptError'),('FailedDecrypt'),('WillNotEncrypt'),('NotFound')
  445. GO
  446. GO
  447. DECLARE @VarDecimalSupported AS BIT;
  448. SELECT @VarDecimalSupported = 0;
  449. IF ((ServerProperty(N'EngineEdition') = 3)
  450. AND (((@@microsoftversion / power(2, 24) = 9)
  451. AND (@@microsoftversion & 0xffff >= 3024))
  452. OR ((@@microsoftversion / power(2, 24) = 10)
  453. AND (@@microsoftversion & 0xffff >= 1600))))
  454. SELECT @VarDecimalSupported = 1;
  455. IF (@VarDecimalSupported > 0)
  456. BEGIN
  457. EXECUTE sp_db_vardecimal_storage_format N'$(DatabaseName)', 'ON';
  458. END
  459. GO
  460. PRINT N'Update complete.';
  461. GO