BulkEncryptionDatabase.sql 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. /*
  2. Deployment script for BulkEncryptionDatabase_1
  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 "BulkEncryptionDatabase_1"
  12. :setvar DefaultFilePrefix "BulkEncryptionDatabase_1"
  13. :setvar DefaultDataPath "C:\Users\damoo\AppData\Local\Microsoft\VisualStudio\SSDT\BulkEncryption"
  14. :setvar DefaultLogPath "C:\Users\damoo\AppData\Local\Microsoft\VisualStudio\SSDT\BulkEncryption"
  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. USE [$(DatabaseName)];
  32. GO
  33. IF EXISTS (SELECT 1
  34. FROM [master].[dbo].[sysdatabases]
  35. WHERE [name] = N'$(DatabaseName)')
  36. BEGIN
  37. ALTER DATABASE [$(DatabaseName)]
  38. SET ARITHABORT ON,
  39. CONCAT_NULL_YIELDS_NULL ON,
  40. CURSOR_DEFAULT LOCAL
  41. WITH ROLLBACK IMMEDIATE;
  42. END
  43. GO
  44. IF EXISTS (SELECT 1
  45. FROM [master].[dbo].[sysdatabases]
  46. WHERE [name] = N'$(DatabaseName)')
  47. BEGIN
  48. ALTER DATABASE [$(DatabaseName)]
  49. SET PAGE_VERIFY NONE,
  50. DISABLE_BROKER
  51. WITH ROLLBACK IMMEDIATE;
  52. END
  53. GO
  54. ALTER DATABASE [$(DatabaseName)]
  55. SET TARGET_RECOVERY_TIME = 0 SECONDS
  56. WITH ROLLBACK IMMEDIATE;
  57. GO
  58. IF EXISTS (SELECT 1
  59. FROM [master].[dbo].[sysdatabases]
  60. WHERE [name] = N'$(DatabaseName)')
  61. BEGIN
  62. ALTER DATABASE [$(DatabaseName)]
  63. SET QUERY_STORE (QUERY_CAPTURE_MODE = AUTO, OPERATION_MODE = READ_WRITE)
  64. WITH ROLLBACK IMMEDIATE;
  65. END
  66. GO
  67. PRINT N'Creating [dbo].[Files]...';
  68. GO
  69. CREATE TABLE [dbo].[Files] (
  70. [Id] INT IDENTITY (1, 1) NOT NULL,
  71. [FilePath] NVARCHAR (1023) NOT NULL,
  72. [FileServer] NVARCHAR (1023) NOT NULL,
  73. [Location] NVARCHAR (1023) NULL,
  74. [Status] INT NOT NULL,
  75. [StartedWhen] DATETIME NULL,
  76. [CompletedWhen] DATETIME NULL,
  77. [Exception] NVARCHAR (MAX) NULL,
  78. [RetryCount] INT NULL,
  79. [InstanceId] INT NULL,
  80. [LabelId] INT NOT NULL,
  81. [NewFileName] NVARCHAR (1023) NULL,
  82. [NewFileSize] BIGINT NULL,
  83. [OriginalFileSize] BIGINT NULL,
  84. PRIMARY KEY CLUSTERED ([Id] ASC)
  85. );
  86. GO
  87. PRINT N'Creating [dbo].[GlobalConfig]...';
  88. GO
  89. CREATE TABLE [dbo].[GlobalConfig] (
  90. [Id] INT IDENTITY (1, 1) NOT NULL,
  91. [Key] NVARCHAR (1023) NOT NULL,
  92. [Value] NVARCHAR (1023) NOT NULL,
  93. PRIMARY KEY CLUSTERED ([Id] ASC)
  94. );
  95. GO
  96. PRINT N'Creating [dbo].[Instances]...';
  97. GO
  98. CREATE TABLE [dbo].[Instances] (
  99. [Id] INT IDENTITY (1, 1) NOT NULL,
  100. [StartTime] DATETIME NOT NULL,
  101. [EndTime] DATETIME NULL,
  102. [NumberProcessed] INT NULL,
  103. [NumberErrors] INT NULL,
  104. [Exception] NVARCHAR (MAX) NULL,
  105. [ServerId] INT NOT NULL,
  106. PRIMARY KEY CLUSTERED ([Id] ASC)
  107. );
  108. GO
  109. PRINT N'Creating [dbo].[Labels]...';
  110. GO
  111. CREATE TABLE [dbo].[Labels] (
  112. [Id] INT IDENTITY (1, 1) NOT NULL,
  113. [LabelName] NVARCHAR (255) NOT NULL,
  114. [LabelGuid] NVARCHAR (255) NOT NULL,
  115. PRIMARY KEY CLUSTERED ([Id] ASC)
  116. );
  117. GO
  118. PRINT N'Creating [dbo].[Servers]...';
  119. GO
  120. CREATE TABLE [dbo].[Servers] (
  121. [Id] INT IDENTITY (1, 1) NOT NULL,
  122. [StartTime] TIME (7) NOT NULL,
  123. [EndTime] TIME (7) NOT NULL,
  124. [ServerName] NVARCHAR (1023) NOT NULL,
  125. [NumberInstances] INT NOT NULL,
  126. [ServerComplete] BIT NULL,
  127. [IsActive] BIT NULL,
  128. PRIMARY KEY CLUSTERED ([Id] ASC)
  129. );
  130. GO
  131. PRINT N'Creating [dbo].[ServersFileServers]...';
  132. GO
  133. CREATE TABLE [dbo].[ServersFileServers] (
  134. [Id] INT IDENTITY (1, 1) NOT NULL,
  135. [ServerId] INT NOT NULL,
  136. [FileServer] NVARCHAR (1023) NOT NULL,
  137. PRIMARY KEY CLUSTERED ([Id] ASC)
  138. );
  139. GO
  140. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  141. GO
  142. ALTER TABLE [dbo].[Files]
  143. ADD DEFAULT 1 FOR [Status];
  144. GO
  145. PRINT N'Creating unnamed constraint on [dbo].[Servers]...';
  146. GO
  147. ALTER TABLE [dbo].[Servers]
  148. ADD DEFAULT 1 FOR [IsActive];
  149. GO
  150. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  151. GO
  152. ALTER TABLE [dbo].[Files] WITH NOCHECK
  153. ADD FOREIGN KEY ([InstanceId]) REFERENCES [dbo].[Instances] ([Id]);
  154. GO
  155. PRINT N'Creating unnamed constraint on [dbo].[Files]...';
  156. GO
  157. ALTER TABLE [dbo].[Files] WITH NOCHECK
  158. ADD FOREIGN KEY ([LabelId]) REFERENCES [dbo].[Labels] ([Id]);
  159. GO
  160. PRINT N'Creating unnamed constraint on [dbo].[Instances]...';
  161. GO
  162. ALTER TABLE [dbo].[Instances] WITH NOCHECK
  163. ADD FOREIGN KEY ([ServerId]) REFERENCES [dbo].[Servers] ([Id]);
  164. GO
  165. PRINT N'Creating unnamed constraint on [dbo].[ServersFileServers]...';
  166. GO
  167. ALTER TABLE [dbo].[ServersFileServers] WITH NOCHECK
  168. ADD FOREIGN KEY ([ServerId]) REFERENCES [dbo].[Servers] ([Id]);
  169. GO
  170. PRINT N'Creating [dbo].[GetActiveInstances]...';
  171. GO
  172. CREATE PROCEDURE [dbo].[GetActiveInstances]
  173. @serverId INT
  174. AS
  175. -- Get all the running scripts for this server
  176. SELECT * FROM [Instances] i
  177. WHERE i.[ServerId] = @serverId AND i.[EndTime] IS NULL
  178. GO
  179. PRINT N'Creating [dbo].[GetActiveServers]...';
  180. GO
  181. CREATE PROCEDURE [dbo].[GetActiveServers]
  182. AS
  183. -- Get all the servers which should be running
  184. DECLARE @timeNow TIME(7) = CONVERT (time, GETUTCDATE())
  185. SELECT * FROM [Servers] s
  186. WHERE
  187. s.[StartTime] < @timeNow
  188. AND s.[EndTime] > @timeNow
  189. AND (s.[ServerComplete] IS NULL OR s.[ServerComplete] <> 1)
  190. AND s.IsActive = 1
  191. GO
  192. PRINT N'Creating [dbo].[GetServerConfig]...';
  193. GO
  194. CREATE PROCEDURE [dbo].[GetServerConfig]
  195. @serverName NVARCHAR(1023)
  196. AS
  197. SELECT * FROM [Servers] s
  198. WHERE s.[ServerName] = @serverName
  199. GO
  200. PRINT N'Creating [dbo].[LogScriptEnd]...';
  201. GO
  202. CREATE PROCEDURE [dbo].[LogScriptEnd]
  203. @instanceId INT,
  204. @numberProcessed INT = NULL,
  205. @numberErrors INT = NULL,
  206. @exception NVARCHAR(MAX) = NULL
  207. AS
  208. -- Update the instances table to mark this script as 'done'... at least for now
  209. UPDATE Instances
  210. SET
  211. [EndTime] = GETUTCDATE(),
  212. [NumberProcessed] = @numberProcessed,
  213. [NumberErrors] = @numberErrors,
  214. [Exception] = @exception
  215. WHERE [Id] = @instanceId
  216. GO
  217. PRINT N'Creating [dbo].[LogScriptStart]...';
  218. GO
  219. CREATE PROCEDURE [dbo].[LogScriptStart]
  220. @serverName NVARCHAR(1023)
  221. AS
  222. DECLARE @rowId INT = NULL
  223. BEGIN TRANSACTION
  224. -- Get the row from the Servers table
  225. DECLARE @serverId INT
  226. SELECT @serverId = [Id] FROM [Servers] s WHERE s.ServerName = @serverName
  227. -- Return null if there isn't a row in the server table for this
  228. IF @serverId = NULL RETURN NULL
  229. -- Add a row to the instances table to log this script as 'running'
  230. INSERT INTO Instances (StartTime, ServerId)
  231. VALUES (GETUTCDATE(), @serverId)
  232. -- Return the new Id for the script to use
  233. SELECT SCOPE_IDENTITY()
  234. COMMIT
  235. GO
  236. PRINT N'Creating [dbo].[LogServerComplete]...';
  237. GO
  238. CREATE PROCEDURE [dbo].[LogServerComplete]
  239. @serverName NVARCHAR(1023)
  240. AS
  241. -- Update the servers table that this server is done
  242. UPDATE [Servers] SET [ServerComplete] = 1 WHERE [ServerName] = @serverName
  243. GO
  244. PRINT N'Creating [dbo].[SelectNextFileToProcess]...';
  245. GO
  246. CREATE PROCEDURE [dbo].[SelectNextFileToProcess]
  247. @serverId INT,
  248. @scriptInstanceId INT,
  249. @maxRetries INT,
  250. @mode NVARCHAR(50)
  251. AS
  252. BEGIN TRANSACTION
  253. -- Get the next row to process
  254. DECLARE @rowId INT = 0
  255. IF @mode = 'encrypt'
  256. BEGIN
  257. SELECT @rowId = Id
  258. FROM Files f
  259. WITH (TABLOCKX, HOLDLOCK)
  260. WHERE
  261. (f.[Status] = 1 OR f.[Status] = 4)
  262. AND f.[FileServer] IN (SELECT [FileServer] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
  263. AND (f.[RetryCount] IS NULL OR f.[RetryCount] < @maxRetries)
  264. ORDER BY f.[RetryCount] DESC, f.[Id] ASC
  265. END
  266. IF @mode = 'decrypt'
  267. BEGIN
  268. SELECT @rowId = Id
  269. FROM Files f
  270. WITH (TABLOCKX, HOLDLOCK)
  271. WHERE
  272. (f.[Status] = 3 OR f.[Status] = 5)
  273. AND f.[FileServer] IN (SELECT [FileServer] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
  274. AND (f.[RetryCount] IS NULL OR f.[RetryCount] < @maxRetries)
  275. ORDER BY f.[RetryCount] DESC, f.[Id] ASC
  276. END
  277. IF @rowId IS NOT NULL AND @rowId > 0
  278. BEGIN
  279. -- 'Lock' the row for processing by this script
  280. UPDATE Files
  281. SET [Status] = 2, [StartedWhen] = GETUTCDATE(), [InstanceId] = @scriptInstanceId
  282. WHERE [Id] = @rowId
  283. -- Get the row (with the label info + server status) to send back to the script
  284. SELECT f.*, l.[LabelGuid], l.[LabelName], s.IsActive
  285. FROM Files f
  286. LEFT JOIN Labels l on f.[LabelId] = l.Id
  287. LEFT JOIN Instances i on f.[InstanceId] = i.Id
  288. LEFT JOIN [Servers] s on i.ServerId = s.Id
  289. WHERE f.[Id] = @rowId
  290. END
  291. COMMIT
  292. GO
  293. PRINT N'Creating [dbo].[UpdateFileRow]...';
  294. GO
  295. CREATE PROCEDURE [dbo].[UpdateFileRow]
  296. @rowId INT,
  297. @exception NVARCHAR(MAX) = NULL,
  298. @retryCount INT = NULL,
  299. @status INT,
  300. @newfilename NVARCHAR(1024) = NULL,
  301. @newfilesize BIGINT = NULL,
  302. @originalfilesize BIGINT = NULL
  303. AS
  304. -- Is this an error or are we good?
  305. -- DECLARE @status INT = 3
  306. -- IF @exception IS NOT NULL AND @exception != '' SET @status = 4
  307. -- Update the row
  308. UPDATE Files
  309. SET [Status] = @status, [CompletedWhen] = GETUTCDATE(), [Exception] = @exception, [RetryCount] = @retryCount, [NewFileName] = @newfilename, [NewFileSize] = @newfilesize, [OriginalFileSize] = @originalfilesize
  310. WHERE [Id] = @rowId
  311. -- Get the row to send back to the script
  312. SELECT * FROM Files f WHERE f.[Id] = @rowId
  313. GO
  314. /*
  315. Post-Deployment Script Template
  316. --------------------------------------------------------------------------------------
  317. This file contains SQL statements that will be appended to the build script.
  318. Use SQLCMD syntax to include a file in the post-deployment script.
  319. Example: :r .\myfile.sql
  320. Use SQLCMD syntax to reference a variable in the post-deployment script.
  321. Example: :setvar TableName MyTable
  322. SELECT * FROM [$(TableName)]
  323. --------------------------------------------------------------------------------------
  324. */
  325. /* STATUS VALUES
  326. 1 - Awaiting Processing
  327. 2 - In Process
  328. 3 - Complete
  329. 4 - Error
  330. 5 - Error rolling back (removing label)
  331. */
  332. -- GLOBAL CONFIG --
  333. SET IDENTITY_INSERT [GlobalConfig] ON
  334. INSERT INTO [GlobalConfig]
  335. (Id, [Key], [Value])
  336. VALUES
  337. (1, 'MaxRetries', '5'),
  338. (2, 'AADWebAppId', 'ABC-123'),
  339. (3, 'AADWebAppKey', 'XXX'),
  340. (4, 'AADNativeAppId', '123'),
  341. (5, 'AADToken', 'Token-1')
  342. SET IDENTITY_INSERT [GlobalConfig] OFF
  343. -- LABELS --
  344. SET IDENTITY_INSERT [Labels] ON
  345. INSERT INTO [Labels]
  346. (Id, LabelName, LabelGuid)
  347. VALUES
  348. (1, 'Public', '1234'),
  349. (2, 'Restricted External', '1234'),
  350. (3, 'Restricted Internal', '1234'),
  351. (4, 'Confidential', '1234'),
  352. (5, 'Secret', 'd9f23ae3-a239-45ea-bf23-f515f824c57b')
  353. SET IDENTITY_INSERT [Labels] OFF
  354. -- SERVERS --
  355. SET IDENTITY_INSERT [Servers] ON
  356. INSERT INTO [Servers]
  357. (Id, ServerName, StartTime, EndTime, NumberInstances, ServerComplete)
  358. VALUES
  359. (1, 'DAVROS', '09:00:00', '17:00:00', 1, NULL),
  360. (2, 'MININT-RDS9B7O', '09:00:00', '17:00:00', 2, NULL)
  361. SET IDENTITY_INSERT [Servers] OFF
  362. -- SERVERS - FILE SERVERS --
  363. INSERT INTO [ServersFileServers]
  364. (ServerId, FileServer)
  365. VALUES
  366. (1, 'X'),
  367. (1, 'Y'),
  368. (1, 'Z'),
  369. (2, 'A'),
  370. (2, 'B')
  371. -- FILES --
  372. INSERT INTO [Files]
  373. ([Status], [FileServer], [LabelId], [FilePath])
  374. VALUES
  375. (1, 'X', 5, 'X:\docs\ValidDoc1.docx'),
  376. (1, 'X', 5, 'X:\docs\ValidDoc2.docx'),
  377. (1, 'X', 5, 'X:\docs\ValidDoc3.docx'),
  378. (1, 'X', 5, 'X:\docs\ValidDoc4.docx'),
  379. (1, 'X', 5, 'X:\docs\ValidDoc5.docx'),
  380. (1, 'X', 5, 'X:\docs\ValidSpread1.xlsx'),
  381. (1, 'X', 5, 'X:\docs\ValidSpread2.xlsx'),
  382. (1, 'Y', 5, 'X:\docs\ValidSpread3.xlsx'),
  383. (1, 'Y', 5, 'X:\docs\ValidSpread4.xlsx'),
  384. (1, 'Y', 5, 'X:\docs\ValidSpread5.xlsx'),
  385. (1, 'Y', 5, 'X:\docs\OldDoc.doc'),
  386. (1, 'Y', 5, 'X:\docs\OldSpread.xls'),
  387. (1, 'Y', 5, 'X:\docs\CorruptedDoc.docx'),
  388. (1, 'Y', 5, 'X:\docs\CorruptedOldDoc.doc'),
  389. (1, 'X', 5, 'X:\docs\CorruptedSpread.xlsx'),
  390. (1, 'X', 5, 'X:\docs\CorruptedOldSpread.xls'),
  391. (1, 'X', 5, 'X:\docs\MissingDoc.docx'),
  392. (1, 'Z', 5, 'X:\docs\MisingSpread.docx'),
  393. (1, 'X', 5, 'X:\docs\AccessDeniedDoc.docx'),
  394. (1, 'X', 5, 'X:\docs\AccessDeniedSpread.xlsx'),
  395. (1, 'Z', 5, 'X:\docs\TextFile.txt'),
  396. (1, 'Z', 5, 'X:\docs\Image.jpg'),
  397. (1, 'A', 5, 'c:\test\1.docx'),
  398. (1, 'A', 5, 'c:\test\2.docx'),
  399. (1, 'A', 5, 'c:\test\3.docx'),
  400. (1, 'B', 5, 'c:\test\4.docx'),
  401. (1, 'B', 5, 'c:\test\5.docx'),
  402. (1, 'B', 5, 'c:\test\6.docx')
  403. -- STATUS CODES --
  404. INSERT INTO [StatusCodes] (Status) VALUES
  405. ('NotStarted'),('InProgress'),('SuccessfulEncrypt'),('EncryptError'),('FailedDecrypt'),('WillNotEncrypt'),('NotFound')
  406. GO
  407. GO
  408. PRINT N'Checking existing data against newly created constraints';
  409. GO
  410. USE [$(DatabaseName)];
  411. GO
  412. CREATE TABLE [#__checkStatus] (
  413. id INT IDENTITY (1, 1) PRIMARY KEY CLUSTERED,
  414. [Schema] NVARCHAR (256),
  415. [Table] NVARCHAR (256),
  416. [Constraint] NVARCHAR (256)
  417. );
  418. SET NOCOUNT ON;
  419. DECLARE tableconstraintnames CURSOR LOCAL FORWARD_ONLY
  420. FOR SELECT SCHEMA_NAME([schema_id]),
  421. OBJECT_NAME([parent_object_id]),
  422. [name],
  423. 0
  424. FROM [sys].[objects]
  425. WHERE [parent_object_id] IN (OBJECT_ID(N'dbo.Files'), OBJECT_ID(N'dbo.Instances'), OBJECT_ID(N'dbo.ServersFileServers'))
  426. AND [type] IN (N'F', N'C')
  427. AND [object_id] IN (SELECT [object_id]
  428. FROM [sys].[check_constraints]
  429. WHERE [is_not_trusted] <> 0
  430. AND [is_disabled] = 0
  431. UNION
  432. SELECT [object_id]
  433. FROM [sys].[foreign_keys]
  434. WHERE [is_not_trusted] <> 0
  435. AND [is_disabled] = 0);
  436. DECLARE @schemaname AS NVARCHAR (256);
  437. DECLARE @tablename AS NVARCHAR (256);
  438. DECLARE @checkname AS NVARCHAR (256);
  439. DECLARE @is_not_trusted AS INT;
  440. DECLARE @statement AS NVARCHAR (1024);
  441. BEGIN TRY
  442. OPEN tableconstraintnames;
  443. FETCH tableconstraintnames INTO @schemaname, @tablename, @checkname, @is_not_trusted;
  444. WHILE @@fetch_status = 0
  445. BEGIN
  446. PRINT N'Checking constraint: ' + @checkname + N' [' + @schemaname + N'].[' + @tablename + N']';
  447. SET @statement = N'ALTER TABLE [' + @schemaname + N'].[' + @tablename + N'] WITH ' + CASE @is_not_trusted WHEN 0 THEN N'CHECK' ELSE N'NOCHECK' END + N' CHECK CONSTRAINT [' + @checkname + N']';
  448. BEGIN TRY
  449. EXECUTE [sp_executesql] @statement;
  450. END TRY
  451. BEGIN CATCH
  452. INSERT [#__checkStatus] ([Schema], [Table], [Constraint])
  453. VALUES (@schemaname, @tablename, @checkname);
  454. END CATCH
  455. FETCH tableconstraintnames INTO @schemaname, @tablename, @checkname, @is_not_trusted;
  456. END
  457. END TRY
  458. BEGIN CATCH
  459. PRINT ERROR_MESSAGE();
  460. END CATCH
  461. IF CURSOR_STATUS(N'LOCAL', N'tableconstraintnames') >= 0
  462. CLOSE tableconstraintnames;
  463. IF CURSOR_STATUS(N'LOCAL', N'tableconstraintnames') = -1
  464. DEALLOCATE tableconstraintnames;
  465. SELECT N'Constraint verification failed:' + [Schema] + N'.' + [Table] + N',' + [Constraint]
  466. FROM [#__checkStatus];
  467. IF @@ROWCOUNT > 0
  468. BEGIN
  469. DROP TABLE [#__checkStatus];
  470. RAISERROR (N'An error occurred while verifying constraints', 16, 127);
  471. END
  472. SET NOCOUNT OFF;
  473. DROP TABLE [#__checkStatus];
  474. GO
  475. PRINT N'Update complete.';
  476. GO