PageRenderTime 52ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Main/DependencyAnalyzer2008/Repository.cs

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

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