PageRenderTime 55ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/EFRepository/DependencyAnalyzer2008/Repository.cs

#
C# | 1951 lines | 1613 code | 147 blank | 191 comment | 117 complexity | e32d125f08761732e81b678d1580e9a9 MD5 | raw file
Possible License(s): CC-BY-SA-3.0

Large files files are truncated, but you can click here to view the full file

  1. ///
  2. /// Microsoft SQL Server 2005 Business Intelligence Metadata Reporting Samples
  3. /// Dependency Analyzer Sample
  4. ///
  5. /// Copyright (c) Microsoft Corporation. All rights reserved.
  6. ///
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using System.Data.SqlClient;
  11. using System.Data;
  12. using System.Data.Common;
  13. using System.Data.OleDb;
  14. using System.Diagnostics;
  15. namespace Microsoft.Samples.DependencyAnalyzer
  16. {
  17. class Repository : IDisposable
  18. {
  19. internal class Domains
  20. {
  21. internal const string SSIS = "SSIS";
  22. internal const string SSAS = "SSAS";
  23. internal const string SSRS = "SSRS";
  24. internal const string Relational = "RDBMS";
  25. internal const string File = "FILE";
  26. internal const string Other = "Other";
  27. internal const string Column = "COLUMN";
  28. }
  29. /// <summary>
  30. /// Stores the current Database Version
  31. /// </summary>
  32. const int _dbVersion = 6;
  33. /// <summary>
  34. /// repository tables
  35. /// </summary>
  36. DataTable objectTable = new DataTable("Objects");
  37. DataTable objectDependenciesTable = new DataTable("ObjectDependencies");
  38. DataTable objectAttributesTable = new DataTable("ObjectAttributes");
  39. DataTable objectTypesTable = new DataTable("ObjectTypes");
  40. DataTable runScanTable = new DataTable("RunScan");
  41. internal class DependencyTypes
  42. {
  43. internal const string Containment = "Containment";
  44. internal const string Lineage = "Map";
  45. internal const string Use = "Use";
  46. }
  47. internal class ConnectionStringProperties
  48. {
  49. internal const string DataSource = "Data Source";
  50. internal const string Server = "Server";
  51. internal const string Location = "Location";
  52. internal const string Provider = "Provider";
  53. internal const string Database = "Database";
  54. internal const string InitialCatalog = "Initial Catalog";
  55. }
  56. internal class Attributes
  57. {
  58. internal const string ConnectionString = "ConnectionString";
  59. internal const string ConnectionServer = "Server";
  60. internal const string ConnectionDatabase = "Database";
  61. internal const string QueryDefinition = "QueryDefinition";
  62. }
  63. private SqlConnection repositoryConnection;
  64. /// <summary>
  65. /// the root of the containments
  66. /// </summary>
  67. private int rootRepositoryObjectID = 0;
  68. public int RootRepositoryObjectID
  69. {
  70. get
  71. {
  72. return rootRepositoryObjectID;
  73. }
  74. set
  75. {
  76. rootRepositoryObjectID = value;
  77. }
  78. }
  79. public Repository(string connectionString)
  80. {
  81. repositoryConnection = new SqlConnection();
  82. repositoryConnection.ConnectionString = connectionString;
  83. databasePrefixExclusions = new List<string>();
  84. }
  85. private int runKeyValue = 0;
  86. public int RunKeyValue
  87. {
  88. get
  89. {
  90. return this.runKeyValue;
  91. }
  92. set
  93. {
  94. this.runKeyValue = value;
  95. }
  96. }
  97. private bool databaseNameOnlyCompare = false;
  98. public bool DatabaseNameOnlyCompare
  99. {
  100. get
  101. {
  102. return databaseNameOnlyCompare;
  103. }
  104. set
  105. {
  106. databaseNameOnlyCompare = value;
  107. }
  108. }
  109. private List<string> databasePrefixExclusions;
  110. public List<string> DatabasePrefixExclusions
  111. {
  112. get
  113. {
  114. return databasePrefixExclusions;
  115. }
  116. }
  117. public void Open()
  118. {
  119. repositoryConnection.Open();
  120. // TODO:
  121. // Reset the rootRepositoryObjectID to the maximum ObjectID + 1 (if > 0 records)...
  122. DataColumn column = objectTable.Columns.Add("RunKey");
  123. column.DataType = typeof(int);
  124. column = objectTable.Columns.Add("ObjectKey");
  125. column.AutoIncrement = true;
  126. column.AutoIncrementSeed = 0; // ToDo: reset this to correct value...
  127. column.DataType = typeof(int);
  128. objectTable.Columns.Add("ObjectName");
  129. objectTable.Columns.Add("ObjectTypeString");
  130. objectTable.Columns.Add("ObjectDesc");
  131. column = objectDependenciesTable.Columns.Add("RunKey");
  132. column.DataType = typeof(int);
  133. column = objectDependenciesTable.Columns.Add("SrcObjectKey");
  134. column.DataType = typeof(int);
  135. column = objectDependenciesTable.Columns.Add("TgtObjectKey");
  136. column.DataType = typeof(int);
  137. column = objectDependenciesTable.Columns.Add("DependencyType");
  138. column = objectAttributesTable.Columns.Add("RunKey");
  139. column.DataType = typeof(int);
  140. column = objectAttributesTable.Columns.Add("ObjectKey");
  141. column.DataType = typeof(int);
  142. objectAttributesTable.Columns.Add("ObjectAttrName");
  143. objectAttributesTable.Columns.Add("ObjectAttrValue");
  144. objectTypesTable.Columns.Add("ObjectTypeID");
  145. objectTypesTable.Columns.Add("ObjectTypeName");
  146. objectTypesTable.Columns.Add("ObjectTypeDesc");
  147. objectTypesTable.Columns.Add("ObjectMetaType"); // todo: populate this column
  148. objectTypesTable.Columns.Add("Domain");
  149. column = runScanTable.Columns.Add("RunKey");
  150. column.AutoIncrement = true;
  151. column.AutoIncrementSeed = 0; // ToDo: reset this to correct value...
  152. column.DataType = typeof(int);
  153. column = runScanTable.Columns.Add("RunDate");
  154. column.DataType = typeof(DateTime);
  155. column = runScanTable.Columns.Add("RunCommand");
  156. }
  157. public void Close()
  158. {
  159. repositoryConnection.Close();
  160. }
  161. public void Dispose()
  162. {
  163. repositoryConnection.Dispose();
  164. }
  165. public bool IsValidRepository()
  166. {
  167. DataTable schemaInfo = repositoryConnection.GetSchema("Tables");
  168. DataRow[] rows = schemaInfo.Select(string.Format("TABLE_NAME = 'RunScan'"));
  169. if (rows.Length == 0)
  170. {
  171. return false;
  172. }
  173. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'LookupConnectionID'"));
  174. if (rows.Length == 0)
  175. {
  176. return false;
  177. }
  178. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'Version'"));
  179. if (rows.Length == 0)
  180. {
  181. return false;
  182. }
  183. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'ObjectTypes'"));
  184. if (rows.Length == 0)
  185. {
  186. return false;
  187. }
  188. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'Objects'"));
  189. if (rows.Length == 0)
  190. {
  191. return false;
  192. }
  193. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'ObjectDependencies'"));
  194. if (rows.Length == 0)
  195. {
  196. return false;
  197. }
  198. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'ObjectAttributes'"));
  199. if (rows.Length == 0)
  200. {
  201. return false;
  202. }
  203. using (SqlCommand sqlCommand = new SqlCommand("SELECT MAX(VersionID) FROM [dbo].[Version]", repositoryConnection))
  204. {
  205. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  206. {
  207. sqlReader.Read();
  208. if (System.Convert.ToInt32(sqlReader[0]) != _dbVersion)
  209. {
  210. return false;
  211. }
  212. }
  213. }
  214. return true;
  215. }
  216. public void Commit()
  217. {
  218. // write each data table to the database
  219. SqlBulkCopy bulkCopy = new SqlBulkCopy(repositoryConnection);
  220. bulkCopy.DestinationTableName = "RunScan";
  221. bulkCopy.WriteToServer(runScanTable);
  222. bulkCopy.DestinationTableName = "Objects";
  223. bulkCopy.WriteToServer(objectTable);
  224. bulkCopy.DestinationTableName = "ObjectDependencies";
  225. bulkCopy.WriteToServer(objectDependenciesTable);
  226. bulkCopy.DestinationTableName = "ObjectAttributes";
  227. bulkCopy.WriteToServer(objectAttributesTable);
  228. bulkCopy.DestinationTableName = "ObjectTypes";
  229. bulkCopy.WriteToServer(objectTypesTable);
  230. bulkCopy.Close();
  231. }
  232. public void CreateRepository()
  233. {
  234. int dbVersion = 0;
  235. int sqlVersion = 9;
  236. DataTable schemaInfo = repositoryConnection.GetSchema("Tables");
  237. DataRow[] rows = schemaInfo.Select(string.Format("TABLE_NAME = 'Version'"));
  238. if (rows.Length != 0)
  239. {
  240. using (SqlCommand sqlCommand = new SqlCommand("SELECT MAX(VersionID) FROM [dbo].[Version]", repositoryConnection))
  241. {
  242. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  243. {
  244. sqlReader.Read();
  245. dbVersion = System.Convert.ToInt32(sqlReader[0]);
  246. }
  247. }
  248. }
  249. using (SqlCommand sqlCommand = new SqlCommand("select left(cast(serverproperty('productversion') as nvarchar(128)), charindex(cast(serverproperty('productversion') as nvarchar(128)), '.') + 1)", repositoryConnection))
  250. {
  251. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  252. {
  253. sqlReader.Read();
  254. sqlVersion = System.Convert.ToInt32(sqlReader[0]);
  255. }
  256. }
  257. if (dbVersion == 0)
  258. {
  259. #region dbVersion 0
  260. // The following database create will create a Version 4 database.
  261. // If the database is prior to Version 4 (No Version Table) then it will be dropped.
  262. // This is OK, as the previous version didn't support history!
  263. using (SqlCommand sqlCommand = repositoryConnection.CreateCommand())
  264. {
  265. sqlCommand.CommandText = "SET ANSI_NULLS ON";
  266. sqlCommand.ExecuteNonQuery();
  267. sqlCommand.CommandText = "SET QUOTED_IDENTIFIER ON";
  268. sqlCommand.ExecuteNonQuery();
  269. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Version]') AND type in (N'U'))\r\n" +
  270. "BEGIN\r\n" +
  271. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectAttributes_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]'))\r\n" +
  272. " ALTER TABLE [dbo].[ObjectAttributes] DROP CONSTRAINT [FK_ObjectAttributes_Objects]\r\n" +
  273. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  274. " ALTER TABLE [dbo].[ObjectDependencies] DROP CONSTRAINT [FK_ObjectDependencies_Objects]\r\n" +
  275. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects1]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  276. " ALTER TABLE [dbo].[ObjectDependencies] DROP CONSTRAINT [FK_ObjectDependencies_Objects1]\r\n" +
  277. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Objects_RunScan]') AND parent_object_id = OBJECT_ID(N'[dbo].[Objects]'))\r\n" +
  278. " ALTER TABLE [dbo].[Objects] DROP CONSTRAINT [FK_Objects_RunScan]\r\n" +
  279. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]') AND type in (N'U'))\r\n" +
  280. " DROP TABLE [dbo].[ObjectAttributes]\r\n" +
  281. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]') AND type in (N'U'))\r\n" +
  282. " DROP TABLE [dbo].[ObjectDependencies]\r\n" +
  283. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Objects]') AND type in (N'U'))\r\n" +
  284. " DROP TABLE [dbo].[Objects]\r\n" +
  285. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectTypes]') AND type in (N'U'))\r\n" +
  286. "\r\n" +
  287. "DROP TABLE [dbo].[ObjectTypes]\r\n" +
  288. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RunScan]') AND type in (N'U'))\r\n" +
  289. " DROP TABLE [dbo].[RunScan]\r\n" +
  290. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Audit]') AND type in (N'U'))\r\n" +
  291. " DROP TABLE [dbo].[Audit]\r\n" +
  292. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LookupConnectionID]') AND type in (N'U'))\r\n" +
  293. " DROP TABLE [dbo].[LookupConnectionID]\r\n" +
  294. "END";
  295. sqlCommand.ExecuteNonQuery();
  296. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LookupConnectionID]') AND type in (N'U'))\r\n" +
  297. "BEGIN\r\n" +
  298. "CREATE TABLE [dbo].[LookupConnectionID](\r\n" +
  299. " [ConnectionGUID] [nvarchar](1000) NOT NULL,\r\n" +
  300. " [ConnectionDescription] [nvarchar](1000) NOT NULL\r\n" +
  301. ") ON [PRIMARY]\r\n" +
  302. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{5F2826BC-648B-4f3e-B930-587F4EF331D4}', N'ODBC 2005')\r\n" +
  303. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{9B5D63AB-A629-4A56-9F3E-B1044134B649}', N'OLEDB 2005')\r\n" +
  304. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{72692A11-F5CC-42b8-869D-84E7C8E48B14}', N'ADO.NET 2005')\r\n" +
  305. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{4CF60474-BA87-4ac2-B9F3-B7B9179D4183}', N'ADO 2005')\r\n" +
  306. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'RelationalDataSource', N'olap relational data source')\r\n" +
  307. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{09AD884B-0248-42C1-90E6-897D1CD16D37}', N'ODBC 2008')\r\n" +
  308. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{3BA51769-6C3C-46B2-85A1-81E58DB7DAE1}', N'OLEDB 2008')\r\n" +
  309. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{A1100566-934E-470C-9ECE-0D5EB920947D}', N'ADO 2008')\r\n" +
  310. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{894CAE21-539F-46EB-B36D-9381163B6C4E}', N'ADO.Net 2008')\r\n" +
  311. "END\r\n";
  312. sqlCommand.ExecuteNonQuery();
  313. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Audit]') AND type in (N'U'))\r\n" +
  314. "BEGIN\r\n" +
  315. "CREATE TABLE [dbo].[Audit](\r\n" +
  316. " [PackageGUID] [varchar](50) NOT NULL,\r\n" +
  317. " [DataFlowTaskID] [int] NOT NULL,\r\n" +
  318. " [SourceReadRows] [int] NULL,\r\n" +
  319. " [SourceReadErrorRows] [int] NULL,\r\n" +
  320. " [CleansedRows] [int] NULL,\r\n" +
  321. " [TargetWriteRows] [int] NULL,\r\n" +
  322. " [TargetWriteErrorRows] [int] NULL,\r\n" +
  323. " [Comment] [nvarchar](255) NULL\r\n" +
  324. ") ON [PRIMARY]\r\n" +
  325. "END\r\n";
  326. sqlCommand.ExecuteNonQuery();
  327. if (sqlVersion > 9)
  328. {
  329. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Version]') AND type in (N'U'))\r\n" +
  330. "BEGIN\r\n" +
  331. "CREATE TABLE [dbo].[Version](\r\n" +
  332. " [VersionID] [int] NOT NULL,\r\n" +
  333. " [InstallDate] [date] NOT NULL,\r\n" +
  334. " CONSTRAINT [PK_Version] PRIMARY KEY CLUSTERED \r\n" +
  335. "(\r\n" +
  336. " [VersionID] ASC\r\n" +
  337. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  338. ") ON [PRIMARY]\r\n" +
  339. "END\r\n";
  340. sqlCommand.ExecuteNonQuery();
  341. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RunScan]') AND type in (N'U'))\r\n" +
  342. "BEGIN\r\n" +
  343. "CREATE TABLE [dbo].[RunScan](\r\n" +
  344. " [RunKey] [int] NOT NULL,\r\n" +
  345. " [RunDate] [datetime2](7) NOT NULL,\r\n" +
  346. " [RunCommand] [nvarchar](512) NOT NULL,\r\n" +
  347. " CONSTRAINT [PK_RunScan] PRIMARY KEY CLUSTERED \r\n" +
  348. "(\r\n" +
  349. " [RunKey] ASC\r\n" +
  350. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  351. ") ON [PRIMARY]\r\n" +
  352. "END\r\n" +
  353. "IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty(N'MS_Description' , N'SCHEMA',N'dbo', N'TABLE',N'RunScan', NULL,NULL))\r\n" +
  354. "EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores a row for each execution of the DependancyAnalyzer program' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'RunScan'\r\n" +
  355. "";
  356. }
  357. else
  358. {
  359. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Version]') AND type in (N'U'))\r\n" +
  360. "BEGIN\r\n" +
  361. "CREATE TABLE [dbo].[Version](\r\n" +
  362. " [VersionID] [int] NOT NULL,\r\n" +
  363. " [InstallDate] [datetime] NOT NULL,\r\n" +
  364. " CONSTRAINT [PK_Version] PRIMARY KEY CLUSTERED \r\n" +
  365. "(\r\n" +
  366. " [VersionID] ASC\r\n" +
  367. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  368. ") ON [PRIMARY]\r\n" +
  369. "END\r\n";
  370. sqlCommand.ExecuteNonQuery();
  371. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RunScan]') AND type in (N'U'))\r\n" +
  372. "BEGIN\r\n" +
  373. "CREATE TABLE [dbo].[RunScan](\r\n" +
  374. " [RunKey] [int] NOT NULL,\r\n" +
  375. " [RunDate] [datetime] NOT NULL,\r\n" +
  376. " [RunCommand] [nvarchar](512) NOT NULL,\r\n" +
  377. " CONSTRAINT [PK_RunScan] PRIMARY KEY CLUSTERED \r\n" +
  378. "(\r\n" +
  379. " [RunKey] ASC\r\n" +
  380. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  381. ") ON [PRIMARY]\r\n" +
  382. "END\r\n" +
  383. "IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty(N'MS_Description' , N'SCHEMA',N'dbo', N'TABLE',N'RunScan', NULL,NULL))\r\n" +
  384. "EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores a row for each execution of the DependancyAnalyzer program' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'RunScan'\r\n" +
  385. "";
  386. }
  387. sqlCommand.ExecuteNonQuery();
  388. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectTypes]') AND type in (N'U'))\r\n" +
  389. "BEGIN\r\n" +
  390. "CREATE TABLE [dbo].[ObjectTypes](\r\n" +
  391. " [ObjectTypeKey] [nvarchar](255) NOT NULL,\r\n" +
  392. " [ObjectTypeName] [nvarchar](255) NULL,\r\n" +
  393. " [ObjectTypeDesc] [nvarchar](2000) NULL,\r\n" +
  394. " [ObjectMetaType] [nvarchar](255) NULL,\r\n" +
  395. " [Domain] [nvarchar](50) NULL\r\n" +
  396. ") ON [PRIMARY]\r\n" +
  397. "END\r\n" +
  398. "";
  399. sqlCommand.ExecuteNonQuery();
  400. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Objects]') AND type in (N'U'))\r\n" +
  401. "BEGIN\r\n" +
  402. "CREATE TABLE [dbo].[Objects](\r\n" +
  403. " [RunKey] [int] NOT NULL,\r\n" +
  404. " [ObjectKey] [int] NOT NULL,\r\n" +
  405. " [ObjectName] [nvarchar](1000) NULL,\r\n" +
  406. " [ObjectTypeString] [nvarchar](1000) NOT NULL,\r\n" +
  407. " [ObjectDesc] [nvarchar](1000) NULL,\r\n" +
  408. " CONSTRAINT [PK_Objects] PRIMARY KEY CLUSTERED \r\n" +
  409. "(\r\n" +
  410. " [RunKey] ASC,\r\n" +
  411. " [ObjectKey] ASC\r\n" +
  412. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  413. ") ON [PRIMARY]\r\n" +
  414. "END\r\n" +
  415. "";
  416. sqlCommand.ExecuteNonQuery();
  417. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]') AND type in (N'U'))\r\n" +
  418. "BEGIN\r\n" +
  419. "CREATE TABLE [dbo].[ObjectDependencies](\r\n" +
  420. " [RunKey] [int] NOT NULL,\r\n" +
  421. " [SrcObjectKey] [int] NOT NULL,\r\n" +
  422. " [TgtObjectKey] [int] NOT NULL,\r\n" +
  423. " [DependencyType] [nvarchar](50) NOT NULL,\r\n" +
  424. " CONSTRAINT [PK_ObjectDependencies] PRIMARY KEY CLUSTERED \r\n" +
  425. "(\r\n" +
  426. " [RunKey] ASC,\r\n" +
  427. " [SrcObjectKey] ASC,\r\n" +
  428. " [TgtObjectKey] ASC,\r\n" +
  429. " [DependencyType] ASC\r\n" +
  430. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  431. ") ON [PRIMARY]\r\n" +
  432. "END\r\n" +
  433. "";
  434. sqlCommand.ExecuteNonQuery();
  435. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]') AND type in (N'U'))\r\n" +
  436. "BEGIN\r\n" +
  437. "CREATE TABLE [dbo].[ObjectAttributes](\r\n" +
  438. " [RunKey] [int] NOT NULL,\r\n" +
  439. " [ObjectKey] [int] NOT NULL,\r\n" +
  440. " [ObjectAttrName] [nvarchar](1000) NOT NULL,\r\n" +
  441. " [ObjectAttrValue] [nvarchar](max) NOT NULL\r\n" +
  442. ") ON [PRIMARY]\r\n" +
  443. "END\r\n" +
  444. "";
  445. sqlCommand.ExecuteNonQuery();
  446. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectAttributes_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]'))\r\n" +
  447. "ALTER TABLE [dbo].[ObjectAttributes] WITH CHECK ADD CONSTRAINT [FK_ObjectAttributes_Objects] FOREIGN KEY([RunKey], [ObjectKey])\r\n" +
  448. "REFERENCES [dbo].[Objects] ([RunKey], [ObjectKey])\r\n" +
  449. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectAttributes_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]'))\r\n" +
  450. "ALTER TABLE [dbo].[ObjectAttributes] CHECK CONSTRAINT [FK_ObjectAttributes_Objects]\r\n" +
  451. "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  452. "ALTER TABLE [dbo].[ObjectDependencies] WITH CHECK ADD CONSTRAINT [FK_ObjectDependencies_Objects] FOREIGN KEY([RunKey], [SrcObjectKey])\r\n" +
  453. "REFERENCES [dbo].[Objects] ([RunKey], [ObjectKey])\r\n" +
  454. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  455. "ALTER TABLE [dbo].[ObjectDependencies] CHECK CONSTRAINT [FK_ObjectDependencies_Objects]\r\n" +
  456. "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects1]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  457. "ALTER TABLE [dbo].[ObjectDependencies] WITH CHECK ADD CONSTRAINT [FK_ObjectDependencies_Objects1] FOREIGN KEY([RunKey], [TgtObjectKey])\r\n" +
  458. "REFERENCES [dbo].[Objects] ([RunKey], [ObjectKey])\r\n" +
  459. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects1]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  460. "ALTER TABLE [dbo].[ObjectDependencies] CHECK CONSTRAINT [FK_ObjectDependencies_Objects1]\r\n" +
  461. "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Objects_RunScan]') AND parent_object_id = OBJECT_ID(N'[dbo].[Objects]'))\r\n" +
  462. "ALTER TABLE [dbo].[Objects] WITH CHECK ADD CONSTRAINT [FK_Objects_RunScan] FOREIGN KEY([RunKey])\r\n" +
  463. "REFERENCES [dbo].[RunScan] ([RunKey])\r\n" +
  464. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Objects_RunScan]') AND parent_object_id = OBJECT_ID(N'[dbo].[Objects]'))\r\n" +
  465. "ALTER TABLE [dbo].[Objects] CHECK CONSTRAINT [FK_Objects_RunScan]\r\n" +
  466. "";
  467. sqlCommand.ExecuteNonQuery();
  468. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Connections]'))\r\n" +
  469. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[Connections]\r\n" +
  470. "AS SELECT 1 AS Column1' \r\n" +
  471. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[SourceTables]'))\r\n" +
  472. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[SourceTables]\r\n" +
  473. "AS SELECT 1 AS Column1' \r\n" +
  474. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ObjectRelationships]'))\r\n" +
  475. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[ObjectRelationships]\r\n" +
  476. "AS\r\n" +
  477. "SELECT 1 AS Column1' \r\n" +
  478. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[LineageMap]'))\r\n" +
  479. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[LineageMap]\r\n" +
  480. "AS\r\n" +
  481. "SELECT 1 AS Column1' \r\n" +
  482. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[TargetTables]'))\r\n" +
  483. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[TargetTables]\r\n" +
  484. "AS\r\n" +
  485. "SELECT 1 AS Column1' \r\n" +
  486. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[DataFlows]'))\r\n" +
  487. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[DataFlows]\r\n" +
  488. "AS\r\n" +
  489. "SELECT 1 AS Column1' \r\n" +
  490. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[WalkSources]'))\r\n" +
  491. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[WalkSources]\r\n" +
  492. "AS\r\n" +
  493. "SELECT 1 AS Column1' \r\n" +
  494. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Packages]'))\r\n" +
  495. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[Packages]\r\n" +
  496. "AS\r\n" +
  497. "SELECT 1 AS Column1' \r\n" +
  498. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vAudit]'))\r\n" +
  499. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[vAudit]\r\n" +
  500. "AS\r\n" +
  501. "SELECT 1 AS Column1' \r\n" +
  502. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[TableLineageMap]'))\r\n" +
  503. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[TableLineageMap]\r\n" +
  504. "AS\r\n" +
  505. "SELECT 1 AS Column1' \r\n" +
  506. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ConnectionsMapping]'))\r\n" +
  507. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[ConnectionsMapping]\r\n" +
  508. "AS\r\n" +
  509. "SELECT 1 AS Column1' \r\n";
  510. sqlCommand.ExecuteNonQuery();
  511. sqlCommand.CommandText = "ALTER VIEW [dbo].[TargetTables]\r\n" +
  512. "AS\r\n" +
  513. "SELECT\r\n" +
  514. " Objects.RunKey,\r\n" +
  515. " ObjectDependencies.DependencyType,\r\n" +
  516. " Objects.ObjectKey,\r\n" +
  517. " Objects.ObjectName,\r\n" +
  518. " Objects.ObjectDesc,\r\n" +
  519. " ObjectDependencies.SrcObjectKey AS TgtComponentKey,\r\n" +
  520. " TargetObjects.ObjectName AS TargetComponentName,\r\n" +
  521. " TargetObjects.ObjectDesc AS TargetComponentDesc,\r\n" +
  522. " OD_DataFlow.SrcObjectKey AS DataFlowID,\r\n" +
  523. " OD_DestConnection.SrcObjectKey AS DestinationConnectionID\r\n" +
  524. "FROM dbo.Objects\r\n" +
  525. "INNER JOIN dbo.ObjectDependencies AS ObjectDependencies\r\n" +
  526. " ON Objects.ObjectKey = ObjectDependencies.TgtObjectKey\r\n" +
  527. " AND Objects.RunKey = ObjectDependencies.RunKey\r\n" +
  528. "INNER JOIN dbo.Objects AS TargetObjects\r\n" +
  529. " ON ObjectDependencies.SrcObjectKey = TargetObjects.ObjectKey\r\n" +
  530. " AND Objects.RunKey = TargetObjects.RunKey\r\n" +
  531. " AND ObjectDependencies.RunKey = TargetObjects.RunKey\r\n" +
  532. "INNER JOIN dbo.ObjectDependencies AS OD_DataFlow\r\n" +
  533. " ON ObjectDependencies.SrcObjectKey = OD_DataFlow.TgtObjectKey\r\n" +
  534. " AND ObjectDependencies.RunKey = OD_DataFlow.RunKey\r\n" +
  535. "INNER JOIN dbo.ObjectDependencies AS OD_DestConnection\r\n" +
  536. " ON Objects.ObjectKey = OD_DestConnection.TgtObjectKey\r\n" +
  537. " AND Objects.RunKey = OD_DestConnection.RunKey\r\n" +
  538. "WHERE ObjectDependencies.DependencyType = N'Map'\r\n" +
  539. " AND Objects.ObjectTypeString = N'Table'\r\n" +
  540. " AND OD_DataFlow.DependencyType = N'Containment'\r\n" +
  541. " AND OD_DestConnection.DependencyType = N'Containment'\r\n";
  542. sqlCommand.ExecuteNonQuery();
  543. sqlCommand.CommandText = "ALTER VIEW [dbo].[SourceTables]\r\n" +
  544. "AS\r\n" +
  545. "SELECT\r\n" +
  546. " dbo.Objects.RunKey,\r\n" +
  547. " dbo.Objects.ObjectKey,\r\n" +
  548. " dbo.Objects.ObjectName,\r\n" +
  549. " dbo.Objects.ObjectTypeString,\r\n" +
  550. " dbo.Objects.ObjectDesc,\r\n" +
  551. " dbo.ObjectDependencies.TgtObjectKey AS SrcComponentKey,\r\n" +
  552. " SourceObjects.ObjectName AS SourceObjectsName,\r\n" +
  553. " SourceObjects.ObjectDesc AS SourceObjectsDesc,\r\n" +
  554. " OD_DataFlow.SrcObjectKey AS DataFlowID,\r\n" +
  555. " OD_DestConnection.SrcObjectKey AS SourceConnectionID\r\n" +
  556. "FROM dbo.Objects\r\n" +
  557. "INNER JOIN dbo.ObjectDependencies\r\n" +
  558. " ON dbo.Objects.ObjectKey = dbo.ObjectDependencies.SrcObjectKey\r\n" +
  559. " AND dbo.Objects.RunKey = dbo.ObjectDependencies.RunKey\r\n" +
  560. "INNER JOIN dbo.ObjectDependencies AS OD_DataFlow\r\n" +
  561. " ON dbo.ObjectDependencies.TgtObjectKey = OD_DataFlow.TgtObjectKey\r\n" +
  562. " AND dbo.ObjectDependencies.RunKey = OD_DataFlow.RunKey\r\n" +
  563. "INNER JOIN dbo.Objects AS SourceObjects\r\n" +
  564. " ON dbo.ObjectDependencies.TgtObjectKey = SourceObjects.ObjectKey\r\n" +
  565. " AND dbo.ObjectDependencies.RunKey = SourceObjects.RunKey\r\n" +
  566. "INNER JOIN dbo.ObjectDependencies AS OD_DestConnection\r\n" +
  567. " ON dbo.Objects.ObjectKey = OD_DestConnection.TgtObjectKey\r\n" +
  568. " AND dbo.Objects.RunKey = OD_DestConnection.RunKey\r\n" +
  569. "WHERE dbo.ObjectDependencies.DependencyType = N'Map'\r\n" +
  570. " AND dbo.Objects.ObjectTypeString = N'Table'\r\n" +
  571. " AND OD_DataFlow.DependencyType = N'Containment'\r\n" +
  572. " AND OD_DataFlow.DependencyType = OD_DestConnection.DependencyType";
  573. sqlCommand.ExecuteNonQuery();
  574. sqlCommand.CommandText = "ALTER VIEW [dbo].[LineageMap]\r\n" +
  575. "AS\r\n" +
  576. "SELECT\r\n" +
  577. " RunKey,\r\n" +
  578. " SrcObjectKey,\r\n" +
  579. " TgtObjectKey\r\n" +
  580. "FROM dbo.ObjectDependencies\r\n" +
  581. "WHERE DependencyType = N'Map'";
  582. sqlCommand.ExecuteNonQuery();
  583. sqlCommand.CommandText = "ALTER VIEW [dbo].[WalkSources]\r\n" +
  584. "AS\r\n" +
  585. "WITH f(RunKey, osrc, tgt, lvl, objecttype) \r\n" +
  586. "AS \r\n" +
  587. "(SELECT Objects.RunKey, dbo.SourceTables.ObjectKey\r\n" +
  588. " , dbo.SourceTables.SrcComponentKey\r\n" +
  589. " , 0 AS Expr1\r\n" +
  590. " , dbo.Objects.ObjectTypeString\r\n" +
  591. "FROM dbo.SourceTables \r\n" +
  592. "INNER JOIN dbo.Objects \r\n" +
  593. " ON dbo.SourceTables.ObjectKey = dbo.Objects.ObjectKey\r\n" +
  594. " AND SourceTables.RunKey = Objects.RunKey\r\n" +
  595. "UNION ALL\r\n" +
  596. "SELECT Objects_1.RunKey, f_2.osrc\r\n" +
  597. " , dbo.LineageMap.TgtObjectKey\r\n" +
  598. " , f_2.lvl + 1 AS Expr1\r\n" +
  599. " , Objects_1.ObjectTypeString\r\n" +
  600. "FROM f AS f_2 \r\n" +
  601. "INNER JOIN dbo.LineageMap \r\n" +
  602. " ON f_2.tgt = dbo.LineageMap.SrcObjectKey \r\n" +
  603. "INNER JOIN dbo.Objects AS Objects_1 \r\n" +
  604. " ON dbo.LineageMap.TgtObjectKey = Objects_1.ObjectKey\r\n" +
  605. " AND LineageMap.RunKey = Objects_1.RunKey\r\n" +
  606. "WHERE (NOT (f_2.osrc = f_2.tgt)))\r\n" +
  607. "SELECT RunKey, osrc, tgt, lvl, objecttype\r\n" +
  608. "FROM f AS f_1";
  609. sqlCommand.ExecuteNonQuery();
  610. sqlCommand.CommandText = "ALTER VIEW [dbo].[ObjectRelationships]\r\n" +
  611. "AS\r\n" +
  612. "SELECT\r\n" +
  613. " RunKey,\r\n" +
  614. " SrcObjectKey AS ParentObjectKey,\r\n" +
  615. " TgtObjectKey AS ChildObjectKey\r\n" +
  616. "FROM dbo.ObjectDependencies\r\n" +
  617. "WHERE DependencyType = N'Containment'";
  618. sqlCommand.ExecuteNonQuery();
  619. sqlCommand.CommandText = "ALTER VIEW [dbo].[Packages]\r\n" +
  620. "AS\r\n" +
  621. "SELECT \r\n" +
  622. " Objects.RunKey,\r\n" +
  623. " Objects.ObjectKey AS PackageID, \r\n" +
  624. " Objects.ObjectName AS PackageName,\r\n" +
  625. " Objects.ObjectDesc AS PackageDesc,\r\n" +
  626. " PackageProperties.PackageLocation,\r\n" +
  627. " PackageProperties.PackageGUID\r\n" +
  628. "FROM [dbo].[Objects],\r\n" +
  629. " (SELECT \r\n" +
  630. " RunKey,\r\n" +
  631. " PackageProperties.ObjectKey,\r\n" +
  632. " [PackageLocation],\r\n" +
  633. " [PackageGUID]\r\n" +
  634. " FROM dbo.ObjectAttributes \r\n" +
  635. " PIVOT (\r\n" +
  636. " MIN (ObjectAttrValue) \r\n" +
  637. " FOR ObjectAttrName \r\n" +
  638. " IN ([PackageLocation], [PackageGUID])\r\n" +
  639. " ) AS PackageProperties\r\n" +
  640. " ) AS PackageProperties\r\n" +
  641. "WHERE [Objects].ObjectKey = PackageProperties.ObjectKey \r\n" +
  642. "AND [Objects].RunKey = PackageProperties.RunKey\r\n" +
  643. "AND [Objects].ObjectTypeString = N'SSIS Package'";
  644. sqlCommand.ExecuteNonQuery();
  645. sqlCommand.CommandText = "ALTER VIEW [dbo].[Connections]\r\n" +
  646. "AS\r\n" +
  647. "SELECT \r\n" +
  648. " [Objects].[RunKey],\r\n" +
  649. " [Objects].ObjectKey AS ConnectionID,\r\n" +
  650. " [Objects].ObjectName AS ConnectionName,\r\n" +
  651. " [Objects].ObjectDesc AS ConnectionDesc,\r\n" +
  652. " ConnectionString,\r\n" +
  653. " ConnectionProperties.[Server],\r\n" +
  654. " ConnectionProperties.[Database]\r\n" +
  655. "FROM [dbo].[Objects] \r\n" +
  656. "INNER JOIN\r\n" +
  657. " (SELECT\r\n" +
  658. " RunKey,\r\n" +
  659. " ConnectionProperties.ObjectKey,\r\n" +
  660. " ConnectionString,\r\n" +
  661. " [Server],\r\n" +
  662. " [Database]\r\n" +

Large files files are truncated, but you can click here to view the full file