PageRenderTime 51ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/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
  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" +
  663. " FROM [dbo].[ObjectAttributes] \r\n" +
  664. " PIVOT \r\n" +
  665. " (\r\n" +
  666. " MIN(ObjectAttrValue) FOR ObjectAttrName \r\n" +
  667. " IN (ConnectionString, [Server], [Database])\r\n" +
  668. " ) AS ConnectionProperties\r\n" +
  669. " ) AS ConnectionProperties\r\n" +
  670. " ON [Objects].ObjectKey = ConnectionProperties.ObjectKey\r\n" +
  671. " AND [Objects].RunKey = ConnectionProperties.RunKey\r\n" +
  672. "INNER JOIN dbo.LookupConnectionID\r\n" +
  673. " ON ConnectionGUID = [Objects].ObjectTypeString";
  674. sqlCommand.ExecuteNonQuery();
  675. sqlCommand.CommandText = "ALTER VIEW [dbo].[TableLineageMap]\r\n" +
  676. "AS\r\n" +
  677. "SELECT\r\n" +
  678. " dbo.WalkSources.RunKey,\r\n" +
  679. " dbo.SourceTables.ObjectKey AS SourceTableObjectKey,\r\n" +
  680. " dbo.SourceTables.ObjectName AS SourceTable,\r\n" +
  681. " srel.ParentObjectKey AS SourceConnectionKey,\r\n" +
  682. " sconn.ConnectionName AS SourceConnectionName,\r\n" +
  683. " sconn.ConnectionString AS SourceConnectionString,\r\n" +
  684. " sconn.[Server] AS SourceServer,\r\n" +
  685. " sconn.[Database] AS SourceDatabase,\r\n" +
  686. " dbo.SourceTables.SrcComponentKey AS SourceComponentKey,\r\n" +
  687. " dbo.TargetTables.ObjectName AS TargetTable,\r\n" +
  688. " dbo.TargetTables.TgtComponentKey AS TargetComponentKey,\r\n" +
  689. " trel.ParentObjectKey AS TargetConnectionKey,\r\n" +
  690. " tconn.ConnectionName AS TargetConnectionName,\r\n" +
  691. " tconn.ConnectionString AS TargetConnectionString,\r\n" +
  692. " tconn.[Server] AS TargetServer,\r\n" +
  693. " tconn.[Database] AS TargetDatabase,\r\n" +
  694. " dfrel.ParentObjectKey AS DataFlowKey,\r\n" +
  695. " dbo.Packages.PackageName,\r\n" +
  696. " dbo.Packages.PackageDesc,\r\n" +
  697. " dbo.Packages.PackageLocation,\r\n" +
  698. " dbo.Packages.PackageGUID\r\n" +
  699. "FROM dbo.WalkSources\r\n" +
  700. "INNER JOIN dbo.SourceTables\r\n" +
  701. " ON dbo.WalkSources.osrc = dbo.SourceTables.ObjectKey\r\n" +
  702. " AND dbo.WalkSources.RunKey = dbo.SourceTables.RunKey\r\n" +
  703. "INNER JOIN dbo.TargetTables\r\n" +
  704. " ON dbo.WalkSources.tgt = dbo.TargetTables.ObjectKey\r\n" +
  705. " AND dbo.WalkSources.RunKey = dbo.TargetTables.RunKey\r\n" +
  706. "INNER JOIN dbo.ObjectRelationships AS srel\r\n" +
  707. " ON dbo.SourceTables.ObjectKey = srel.ChildObjectKey\r\n" +
  708. " AND dbo.SourceTables.RunKey = srel.RunKey\r\n" +
  709. "INNER JOIN dbo.ObjectRelationships AS trel\r\n" +
  710. "\r\n" +
  711. " ON dbo.TargetTables.ObjectKey = trel.ChildObjectKey\r\n" +
  712. " AND dbo.TargetTables.RunKey = trel.RunKey\r\n" +
  713. "INNER JOIN dbo.ObjectRelationships AS dfrel\r\n" +
  714. " ON dbo.TargetTables.TgtComponentKey = dfrel.ChildObjectKey\r\n" +
  715. " AND dbo.TargetTables.RunKey = dfrel.RunKey\r\n" +
  716. "INNER JOIN dbo.ObjectRelationships AS pkgrel\r\n" +
  717. " ON dfrel.ParentObjectKey = pkgrel.ChildObjectKey\r\n" +
  718. " AND dfrel.RunKey = pkgrel.RunKey\r\n" +
  719. "INNER JOIN dbo.Packages\r\n" +
  720. " ON pkgrel.ParentObjectKey = dbo.Packages.PackageID\r\n" +
  721. " AND pkgrel.RunKey = dbo.Packages.RunKey\r\n" +
  722. "INNER JOIN dbo.Connections AS sconn\r\n" +
  723. " ON srel.ParentObjectKey = sconn.ConnectionID\r\n" +
  724. " AND srel.RunKey = sconn.RunKey\r\n" +
  725. "INNER JOIN dbo.Connections AS tconn\r\n" +
  726. " ON trel.ParentObjectKey = tconn.ConnectionID\r\n" +
  727. " AND trel.RunKey = tconn.RunKey";
  728. sqlCommand.ExecuteNonQuery();
  729. sqlCommand.CommandText = "ALTER VIEW [dbo].[DataFlows]\r\n" +
  730. "AS\r\n" +
  731. "SELECT\r\n" +
  732. " dbo.Objects.RunKey,\r\n" +
  733. " dbo.Objects.ObjectKey,\r\n" +
  734. " dbo.Objects.ObjectName,\r\n" +
  735. " dbo.Objects.ObjectDesc,\r\n" +
  736. " dbo.ObjectDependencies.SrcObjectKey AS PackageID\r\n" +
  737. "FROM dbo.Objects\r\n" +
  738. "INNER JOIN dbo.ObjectDependencies\r\n" +
  739. " ON dbo.Objects.ObjectKey = dbo.ObjectDependencies.TgtObjectKey\r\n" +
  740. " AND dbo.Objects.RunKey = dbo.ObjectDependencies.RunKey\r\n" +
  741. "WHERE dbo.Objects.ObjectTypeString IN (\r\n" +
  742. " N'{C3BF9DC1-4715-4694-936F-D3CFDA9E42C5}', \r\n" +
  743. " N'{E3CFBEA8-1F48-40D8-91E1-2DEDC1EDDD56}'\r\n" +
  744. ")\r\n" +
  745. " AND dbo.ObjectDependencies.DependencyType = N'Containment'";
  746. sqlCommand.ExecuteNonQuery();
  747. sqlCommand.CommandText = "ALTER VIEW [dbo].[ConnectionsMapping]\r\n" +
  748. "AS\r\n" +
  749. "SELECT DISTINCT \r\n" +
  750. " srel.ParentObjectKey AS SourceConnectionID,\r\n" +
  751. " trel.ParentObjectKey AS TargetConnectionID\r\n" +
  752. "FROM dbo.WalkSources\r\n" +
  753. "INNER JOIN dbo.SourceTables\r\n" +
  754. " ON dbo.WalkSources.osrc = dbo.SourceTables.ObjectKey\r\n" +
  755. " AND dbo.WalkSources.RunKey = dbo.SourceTables.RunKey\r\n" +
  756. "INNER JOIN dbo.TargetTables\r\n" +
  757. " ON dbo.WalkSources.tgt = dbo.TargetTables.ObjectKey\r\n" +
  758. " AND dbo.WalkSources.RunKey = dbo.TargetTables.RunKey\r\n" +
  759. "INNER JOIN dbo.ObjectRelationships AS srel\r\n" +
  760. " ON dbo.SourceTables.ObjectKey = srel.ChildObjectKey\r\n" +
  761. " AND srel.RunKey = dbo.SourceTables.RunKey\r\n" +
  762. "INNER JOIN dbo.ObjectRelationships AS trel\r\n" +
  763. " ON dbo.TargetTables.ObjectKey = trel.ChildObjectKey\r\n" +
  764. " AND dbo.TargetTables.RunKey = trel.RunKey";
  765. sqlCommand.ExecuteNonQuery();
  766. sqlCommand.CommandText = "INSERT INTO dbo.Version\r\n" +
  767. "(VersionID, InstallDate)\r\n" +
  768. "VALUES\r\n" +
  769. "(4, GETDATE())";
  770. sqlCommand.ExecuteNonQuery();
  771. //// sqlCommand.CommandText = "";
  772. //// sqlCommand.ExecuteNonQuery();
  773. }
  774. #endregion
  775. dbVersion = 4;
  776. }
  777. if (dbVersion == 4)
  778. {
  779. #region dbVersion 4
  780. // Apply corrected WalkSources View
  781. using (SqlCommand sqlAlterCommand = repositoryConnection.CreateCommand())
  782. {
  783. sqlAlterCommand.CommandText = "SET ANSI_NULLS ON";
  784. sqlAlterCommand.ExecuteNonQuery();
  785. sqlAlterCommand.CommandText = "SET QUOTED_IDENTIFIER ON";
  786. sqlAlterCommand.ExecuteNonQuery();
  787. sqlAlterCommand.CommandText = "ALTER VIEW [dbo].[WalkSources]\r\n" +
  788. "AS\r\n" +
  789. "WITH WalkSourceCTE(RunKey, osrc, tgt, lvl, objecttype, ParentString) \r\n" +
  790. "AS \r\n" +
  791. "(\r\n" +
  792. " SELECT Objects.RunKey\r\n" +
  793. " , dbo.SourceTables.ObjectKey\r\n" +
  794. " , dbo.SourceTables.SrcComponentKey\r\n" +
  795. " , 0 AS Expr1\r\n" +
  796. " , dbo.Objects.ObjectTypeString\r\n" +
  797. " , CAST(',' + CAST(dbo.SourceTables.ObjectKey as varchar(14)) + ',' AS VARCHAR(2000)) AS ParentString\r\n" +
  798. " FROM dbo.SourceTables \r\n" +
  799. " INNER JOIN dbo.Objects \r\n" +
  800. " ON dbo.SourceTables.ObjectKey = dbo.Objects.ObjectKey\r\n" +
  801. " AND SourceTables.RunKey = Objects.RunKey\r\n" +
  802. " UNION ALL\r\n" +
  803. " SELECT Objects.RunKey\r\n" +
  804. " , WalkSourceCTE.osrc\r\n" +
  805. " , dbo.LineageMap.TgtObjectKey\r\n" +
  806. " , WalkSourceCTE.lvl + 1 AS Expr1\r\n" +
  807. " , Objects.ObjectTypeString\r\n" +
  808. " , CAST(WalkSourceCTE.ParentString + CAST(WalkSourceCTE.tgt as varchar(14)) + ',' AS VARCHAR(2000)) AS ParentString\r\n" +
  809. " FROM WalkSourceCTE\r\n" +
  810. " INNER JOIN dbo.LineageMap \r\n" +
  811. " ON WalkSourceCTE.tgt = dbo.LineageMap.SrcObjectKey \r\n" +
  812. " AND WalkSourceCTE.RunKey = dbo.LineageMap.RunKey\r\n" +
  813. " INNER JOIN dbo.Objects\r\n" +
  814. " ON dbo.LineageMap.TgtObjectKey = Objects.ObjectKey\r\n" +
  815. " AND LineageMap.RunKey = Objects.RunKey\r\n" +
  816. " WHERE NOT ((WalkSourceCTE.osrc = WalkSourceCTE.tgt)\r\n" +
  817. " OR CHARINDEX(',' + CAST(WalkSourceCTE.tgt AS VARCHAR(40)) + ',', WalkSourceCTE.ParentString) > 0)\r\n" +
  818. ")\r\n" +
  819. " \r\n" +
  820. "SELECT RunKey, osrc, tgt, lvl, objecttype\r\n" +
  821. "FROM WalkSourceCTE\r\n";
  822. sqlAlterCommand.ExecuteNonQuery();
  823. sqlAlterCommand.CommandText = "INSERT INTO dbo.Version\r\n" +
  824. "(VersionID, InstallDate)\r\n" +
  825. "VALUES\r\n" +
  826. "(5, GETDATE())";
  827. sqlAlterCommand.ExecuteNonQuery();
  828. }
  829. #endregion
  830. dbVersion = 5;
  831. }
  832. if (dbVersion == 5)
  833. {
  834. #region dbVersion 5
  835. // New Procedures
  836. using (SqlCommand sqlAlterCommand = repositoryConnection.CreateCommand())
  837. {
  838. sqlAlterCommand.CommandText = "SET ANSI_NULLS ON";
  839. sqlAlterCommand.ExecuteNonQuery();
  840. sqlAlterCommand.CommandText = "SET QUOTED_IDENTIFIER ON";
  841. sqlAlterCommand.ExecuteNonQuery();
  842. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveRunIDs]') AND type in (N'P', N'PC'))\r\n";
  843. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveRunIDs] AS SELECT 1')";
  844. sqlAlterCommand.ExecuteNonQuery();
  845. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  846. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  847. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  848. sqlAlterCommand.CommandText += "-- Description: Retrieves the list of Run's\r\n";
  849. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  850. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveRunIDs]\r\n";
  851. sqlAlterCommand.CommandText += "AS\r\n";
  852. sqlAlterCommand.CommandText += "BEGIN\r\n";
  853. sqlAlterCommand.CommandText += "SET NOCOUNT ON;\r\n";
  854. sqlAlterCommand.CommandText += "SELECT [RunKey] ,CONVERT(NVARCHAR(40), [RunDate], 120) + CHAR(9) + [RunCommand] FROM [dbo].[RunScan]\r\n";
  855. sqlAlterCommand.CommandText += "END\r\n";
  856. sqlAlterCommand.ExecuteNonQuery();
  857. sqlAlterCommand.CommandText = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IntCSVSplit]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))\r\n";
  858. sqlAlterCommand.CommandText += "DROP FUNCTION [dbo].[fn_IntCSVSplit]";
  859. sqlAlterCommand.ExecuteNonQuery();
  860. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  861. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  862. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  863. sqlAlterCommand.CommandText += "-- Description: Retrieves a table of integers from a csv string\r\n";
  864. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  865. sqlAlterCommand.CommandText = "CREATE FUNCTION [dbo].[fn_IntCSVSplit]\r\n";
  866. sqlAlterCommand.CommandText += "( @RowData NVARCHAR(MAX) )\r\n";
  867. sqlAlterCommand.CommandText += "RETURNS @RtnValue TABLE \r\n";
  868. sqlAlterCommand.CommandText += "( Data INT ) \r\n";
  869. sqlAlterCommand.CommandText += "AS\r\n";
  870. sqlAlterCommand.CommandText += "BEGIN \r\n";
  871. sqlAlterCommand.CommandText += " DECLARE @Iterator INT\r\n";
  872. sqlAlterCommand.CommandText += " DECLARE @WorkString NVARCHAR(MAX)\r\n";
  873. sqlAlterCommand.CommandText += " SET @Iterator = 1\r\n";
  874. sqlAlterCommand.CommandText += " DECLARE @FoundIndex INT\r\n";
  875. sqlAlterCommand.CommandText += " SET @FoundIndex = CHARINDEX(',',@RowData)\r\n";
  876. sqlAlterCommand.CommandText += " WHILE (@FoundIndex>0)\r\n";
  877. sqlAlterCommand.CommandText += " BEGIN\r\n";
  878. sqlAlterCommand.CommandText += " SET @WorkString = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1)))\r\n";
  879. sqlAlterCommand.CommandText += " IF ISNUMERIC(@WorkString) = 1\r\n";
  880. sqlAlterCommand.CommandText += " BEGIN\r\n";
  881. sqlAlterCommand.CommandText += " INSERT INTO @RtnValue (data) VALUES (@WorkString)\r\n";
  882. sqlAlterCommand.CommandText += " END\r\n";
  883. sqlAlterCommand.CommandText += " ELSE\r\n";
  884. sqlAlterCommand.CommandText += " BEGIN\r\n";
  885. sqlAlterCommand.CommandText += " INSERT INTO @RtnValue (data) VALUES(NULL)\r\n";
  886. sqlAlterCommand.CommandText += " END\r\n";
  887. sqlAlterCommand.CommandText += " SET @RowData = SUBSTRING(@RowData, @FoundIndex + 1,LEN(@RowData))\r\n";
  888. sqlAlterCommand.CommandText += " SET @Iterator = @Iterator + 1\r\n";
  889. sqlAlterCommand.CommandText += " SET @FoundIndex = CHARINDEX(',', @RowData)\r\n";
  890. sqlAlterCommand.CommandText += " END\r\n";
  891. sqlAlterCommand.CommandText += " IF ISNUMERIC(LTRIM(RTRIM(@RowData))) = 1\r\n";
  892. sqlAlterCommand.CommandText += " BEGIN\r\n";
  893. sqlAlterCommand.CommandText += " INSERT INTO @RtnValue (Data) SELECT LTRIM(RTRIM(@RowData))\r\n";
  894. sqlAlterCommand.CommandText += " END\r\n";
  895. sqlAlterCommand.CommandText += " RETURN\r\n";
  896. sqlAlterCommand.CommandText += "END\r\n";
  897. sqlAlterCommand.ExecuteNonQuery();
  898. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjects]') AND type in (N'P', N'PC'))\r\n";
  899. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjects] AS SELECT 1')";
  900. sqlAlterCommand.ExecuteNonQuery();
  901. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  902. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  903. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  904. sqlAlterCommand.CommandText += "-- Description: Retrieves the list of Objects\r\n";
  905. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  906. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjects]\r\n";
  907. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  908. sqlAlterCommand.CommandText += "AS\r\n";
  909. sqlAlterCommand.CommandText += "BEGIN\r\n";
  910. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  911. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName], [Objects].[ObjectTypeString], [ObjectTypes].[ObjectTypeName], [RunKey]\r\n";
  912. sqlAlterCommand.CommandText += " FROM [dbo].[Objects] \r\n";
  913. sqlAlterCommand.CommandText += " LEFT OUTER JOIN [dbo].[ObjectTypes]\r\n";
  914. sqlAlterCommand.CommandText += " ON [Objects].[ObjectTypeString] = [ObjectTypes].[ObjectTypeKey]\r\n";
  915. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  916. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  917. sqlAlterCommand.CommandText += "END\r\n";
  918. sqlAlterCommand.ExecuteNonQuery();
  919. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveLineageMap]') AND type in (N'P', N'PC'))\r\n";
  920. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveLineageMap] AS SELECT 1')";
  921. sqlAlterCommand.ExecuteNonQuery();
  922. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  923. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  924. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  925. sqlAlterCommand.CommandText += "-- Description: Retrieves the list of LineageMap\r\n";
  926. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  927. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveLineageMap]\r\n";
  928. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  929. sqlAlterCommand.CommandText += "AS\r\n";
  930. sqlAlterCommand.CommandText += "BEGIN\r\n";
  931. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  932. sqlAlterCommand.CommandText += " SELECT [SrcObjectKey], [TgtObjectKey], [DependencyType] \r\n";
  933. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectDependencies]\r\n";
  934. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  935. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  936. sqlAlterCommand.CommandText += "END\r\n";
  937. sqlAlterCommand.ExecuteNonQuery();
  938. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjectDetails]') AND type in (N'P', N'PC'))\r\n";
  939. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjectDetails] AS SELECT 1')";
  940. sqlAlterCommand.ExecuteNonQuery();
  941. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  942. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  943. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  944. sqlAlterCommand.CommandText += "-- Description: Retrieves the ObjectDetails\r\n";
  945. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  946. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjectDetails]\r\n";
  947. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  948. sqlAlterCommand.CommandText += ", @ObjectKey INT\r\n";
  949. sqlAlterCommand.CommandText += "AS\r\n";
  950. sqlAlterCommand.CommandText += "BEGIN\r\n";
  951. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  952. sqlAlterCommand.CommandText += " SELECT [ObjectTypeString], [ObjectDesc] \r\n";
  953. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  954. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  955. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  956. sqlAlterCommand.CommandText += " AND ObjectKey = @ObjectKey\r\n";
  957. sqlAlterCommand.CommandText += "END\r\n";
  958. sqlAlterCommand.ExecuteNonQuery();
  959. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjectTypes]') AND type in (N'P', N'PC'))\r\n";
  960. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjectTypes] AS SELECT 1')";
  961. sqlAlterCommand.ExecuteNonQuery();
  962. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  963. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  964. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  965. sqlAlterCommand.CommandText += "-- Description: Retrieves the ObjectTypes\r\n";
  966. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  967. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjectTypes]\r\n";
  968. sqlAlterCommand.CommandText += " @ObjectTypeKey NVARCHAR(255)\r\n";
  969. sqlAlterCommand.CommandText += "AS\r\n";
  970. sqlAlterCommand.CommandText += "BEGIN\r\n";
  971. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  972. sqlAlterCommand.CommandText += " SELECT [ObjectTypeName]\r\n";
  973. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectTypes] \r\n";
  974. sqlAlterCommand.CommandText += " WHERE ObjectTypeKey = @ObjectTypeKey\r\n";
  975. sqlAlterCommand.CommandText += "END\r\n";
  976. sqlAlterCommand.ExecuteNonQuery();
  977. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjectAttributes]') AND type in (N'P', N'PC'))\r\n";
  978. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjectAttributes] AS SELECT 1')";
  979. sqlAlterCommand.ExecuteNonQuery();
  980. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  981. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  982. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  983. sqlAlterCommand.CommandText += "-- Description: Retrieves the ObjectAttributes\r\n";
  984. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  985. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjectAttributes]\r\n";
  986. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  987. sqlAlterCommand.CommandText += ", @ObjectKey INT\r\n";
  988. sqlAlterCommand.CommandText += "AS\r\n";
  989. sqlAlterCommand.CommandText += "BEGIN\r\n";
  990. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  991. sqlAlterCommand.CommandText += " SELECT [ObjectAttrName], [ObjectAttrValue]\r\n";
  992. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectAttributes] \r\n";
  993. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  994. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  995. sqlAlterCommand.CommandText += " AND ObjectKey = @ObjectKey\r\n";
  996. sqlAlterCommand.CommandText += " ORDER BY [ObjectAttrName];\r\n";
  997. sqlAlterCommand.CommandText += "END\r\n";
  998. sqlAlterCommand.ExecuteNonQuery();
  999. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveContainedTargetDependencies]') AND type in (N'P', N'PC'))\r\n";
  1000. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveContainedTargetDependencies] AS SELECT 1')";
  1001. sqlAlterCommand.ExecuteNonQuery();
  1002. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1003. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1004. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1005. sqlAlterCommand.CommandText += "-- Description: Retrieves the Contained Target Dependencies\r\n";
  1006. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1007. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveContainedTargetDependencies]\r\n";
  1008. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1009. sqlAlterCommand.CommandText += ", @TgtObjectKey INT\r\n";
  1010. sqlAlterCommand.CommandText += "AS\r\n";
  1011. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1012. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1013. sqlAlterCommand.CommandText += " SELECT [SrcObjectKey] \r\n";
  1014. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectDependencies] \r\n";
  1015. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1016. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1017. sqlAlterCommand.CommandText += " AND [DependencyType] = 'Containment' \r\n";
  1018. sqlAlterCommand.CommandText += " AND [TgtObjectKey] = @TgtObjectKey\r\n";
  1019. sqlAlterCommand.CommandText += "END\r\n";
  1020. sqlAlterCommand.ExecuteNonQuery();
  1021. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSSASObjects]') AND type in (N'P', N'PC'))\r\n";
  1022. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSSASObjects] AS SELECT 1')";
  1023. sqlAlterCommand.ExecuteNonQuery();
  1024. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1025. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1026. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1027. sqlAlterCommand.CommandText += "-- Description: Retrieves the SSAS Objects\r\n";
  1028. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1029. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSSASObjects]\r\n";
  1030. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1031. sqlAlterCommand.CommandText += "AS\r\n";
  1032. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1033. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1034. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName]\r\n";
  1035. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  1036. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1037. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1038. sqlAlterCommand.CommandText += " AND [ObjectTypeString] = 'Ssas.Analysis Server'\r\n";
  1039. sqlAlterCommand.CommandText += " ORDER BY [ObjectName]\r\n";
  1040. sqlAlterCommand.CommandText += "END\r\n";
  1041. sqlAlterCommand.ExecuteNonQuery();
  1042. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSQLSObjects]') AND type in (N'P', N'PC'))\r\n";
  1043. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSQLSObjects] AS SELECT 1')";
  1044. sqlAlterCommand.ExecuteNonQuery();
  1045. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1046. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1047. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1048. sqlAlterCommand.CommandText += "-- Description: Retrieves the SQL Server Objects\r\n";
  1049. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1050. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSQLSObjects]\r\n";
  1051. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1052. sqlAlterCommand.CommandText += "AS\r\n";
  1053. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1054. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1055. sqlAlterCommand.CommandText += " SELECT ConnectionID, ISNULL([Server], ConnectionName) + ISNULL('.' + [Database], '') as DisplayName\r\n";
  1056. sqlAlterCommand.CommandText += " FROM [dbo].[Connections]\r\n";
  1057. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1058. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1059. sqlAlterCommand.CommandText += " ORDER BY DisplayName\r\n";
  1060. sqlAlterCommand.CommandText += "END\r\n";
  1061. sqlAlterCommand.ExecuteNonQuery();
  1062. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSSRSObjects]') AND type in (N'P', N'PC'))\r\n";
  1063. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSSRSObjects] AS SELECT 1')";
  1064. sqlAlterCommand.ExecuteNonQuery();
  1065. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1066. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1067. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1068. sqlAlterCommand.CommandText += "-- Description: Retrieves the SSRS Objects\r\n";
  1069. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1070. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSSRSObjects]\r\n";
  1071. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1072. sqlAlterCommand.CommandText += "AS\r\n";
  1073. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1074. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1075. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName]\r\n";
  1076. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  1077. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1078. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1079. sqlAlterCommand.CommandText += " AND [ObjectTypeString] = 'ReportServer'\r\n";
  1080. sqlAlterCommand.CommandText += " ORDER BY [ObjectName]\r\n";
  1081. sqlAlterCommand.CommandText += "END\r\n";
  1082. sqlAlterCommand.ExecuteNonQuery();
  1083. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveFileObjects]') AND type in (N'P', N'PC'))\r\n";
  1084. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveFileObjects] AS SELECT 1')";
  1085. sqlAlterCommand.ExecuteNonQuery();
  1086. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1087. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1088. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1089. sqlAlterCommand.CommandText += "-- Description: Retrieves the File Server Objects\r\n";
  1090. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1091. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveFileObjects]\r\n";
  1092. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1093. sqlAlterCommand.CommandText += "AS\r\n";
  1094. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1095. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1096. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName]\r\n";
  1097. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  1098. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1099. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1100. sqlAlterCommand.CommandText += " AND [ObjectTypeString] = 'Machine'\r\n";
  1101. sqlAlterCommand.CommandText += " ORDER BY [ObjectName]\r\n";
  1102. sqlAlterCommand.CommandText += "END\r\n";
  1103. sqlAlterCommand.ExecuteNonQuery();
  1104. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSSISObjects]') AND type in (N'P', N'PC'))\r\n";
  1105. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSSISObjects] AS SELECT 1')";
  1106. sqlAlterCommand.ExecuteNonQuery();
  1107. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1108. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1109. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1110. sqlAlterCommand.CommandText += "-- Description: Retrieves the SSIS Objects\r\n";
  1111. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1112. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSSISObjects]\r\n";
  1113. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1114. sqlAlterCommand.CommandText += "AS\r\n";
  1115. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1116. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1117. sqlAlterCommand.CommandText += " SELECT [PackageID], [PackageLocation] \r\n";
  1118. sqlAlterCommand.CommandText += " FROM [dbo].[Packages]\r\n";
  1119. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1120. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1121. sqlAlterCommand.CommandText += " ORDER BY [PackageID]\r\n";
  1122. sqlAlterCommand.CommandText += "END\r\n";
  1123. sqlAlterCommand.ExecuteNonQuery();
  1124. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveContained]') AND type in (N'P', N'PC'))\r\n";
  1125. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveContained] AS SELECT 1')";
  1126. sqlAlterCommand.ExecuteNonQuery();
  1127. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1128. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1129. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1130. sqlAlterCommand.CommandText += "-- Description: Retrieves the Children of this Containment Object\r\n";
  1131. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1132. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveContained]\r\n";
  1133. sqlAlterCommand.CommandText += " @SrcObjectKey INT\r\n";
  1134. sqlAlterCommand.CommandText += "AS\r\n";
  1135. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1136. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1137. sqlAlterCommand.CommandText += " SELECT DISTINCT TgtObjectKey, ObjectName, ISNULL(ObjectTypes.ObjectTypeName, ObjectTypeString) as ObjectTypeString \r\n";
  1138. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectDependencies]\r\n";
  1139. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[Objects] \r\n";
  1140. sqlAlterCommand.CommandText += " ON ObjectKey = TgtObjectKey\r\n";
  1141. sqlAlterCommand.CommandText += " AND [DependencyType] = 'Containment' \r\n";
  1142. sqlAlterCommand.CommandText += " AND SrcObjectKey = @SrcObjectKey\r\n";
  1143. sqlAlterCommand.CommandText += " LEFT OUTER JOIN [dbo].[ObjectTypes] \r\n";
  1144. sqlAlterCommand.CommandText += " ON ObjectTypes.ObjectTypeKey = ObjectTypeString \r\n";
  1145. sqlAlterCommand.CommandText += " ORDER BY ObjectTypeString, ObjectName\r\n";
  1146. sqlAlterCommand.CommandText += "END\r\n";
  1147. sqlAlterCommand.ExecuteNonQuery();
  1148. sqlAlterCommand.CommandText = "INSERT INTO dbo.Version\r\n" +
  1149. "(VersionID, InstallDate)\r\n" +
  1150. "VALUES\r\n" +
  1151. "(6, GETDATE())";
  1152. sqlAlterCommand.ExecuteNonQuery();
  1153. }
  1154. #endregion
  1155. dbVersion = 6;
  1156. }
  1157. }
  1158. public void LoadExisingRepository()
  1159. {
  1160. using (SqlCommand sqlCommand = new SqlCommand("SELECT COALESCE(MAX(ObjectKey), 0) + 1 FROM [dbo].[Objects]", repositoryConnection))
  1161. {
  1162. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  1163. {
  1164. sqlReader.Read();
  1165. objectTable.Columns["ObjectKey"].AutoIncrementSeed = System.Convert.ToInt32(sqlReader[0]);
  1166. }
  1167. }
  1168. using (SqlCommand sqlCommand = new SqlCommand("SELECT COALESCE(MAX(RunKey), 0) + 1 FROM [dbo].[RunScan]", repositoryConnection))
  1169. {
  1170. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  1171. {
  1172. sqlReader.Read();
  1173. RunKeyValue = System.Convert.ToInt32(sqlReader[0]);
  1174. runScanTable.Columns["RunKey"].AutoIncrementSeed = System.Convert.ToInt32(sqlReader[0]);
  1175. }
  1176. }
  1177. using (SqlCommand sqlCommand = new SqlCommand("SELECT [ObjectTypeKey], [ObjectTypeName], [ObjectTypeDesc], [ObjectMetaType], [Domain] FROM [dbo].[ObjectTypes]", repositoryConnection))
  1178. {
  1179. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  1180. {
  1181. while (sqlReader.Read())
  1182. {
  1183. this.AddObjectType(sqlReader[4].ToString(), sqlReader[0].ToString(), sqlReader[1].ToString(), sqlReader[2].ToString());
  1184. }
  1185. }
  1186. }
  1187. using (SqlCommand sqlCommand = new SqlCommand("truncate table ObjectTypes", repositoryConnection))
  1188. {
  1189. sqlCommand.ExecuteNonQuery();
  1190. }
  1191. }
  1192. public void DeleteExistingRepository()
  1193. {
  1194. using (SqlCommand sqlCommand = repositoryConnection.CreateCommand())
  1195. {
  1196. sqlCommand.CommandText = "truncate table dbo.ObjectAttributes";
  1197. sqlCommand.ExecuteNonQuery();
  1198. sqlCommand.CommandText = "truncate table dbo.ObjectDependencies";
  1199. sqlCommand.ExecuteNonQuery();
  1200. sqlCommand.CommandText = "delete from dbo.Objects";
  1201. sqlCommand.ExecuteNonQuery();
  1202. sqlCommand.CommandText = "delete from dbo.RunScan";
  1203. sqlCommand.ExecuteNonQuery();
  1204. sqlCommand.CommandText = "truncate table ObjectTypes";
  1205. sqlCommand.ExecuteNonQuery();
  1206. }
  1207. }
  1208. public void InitialiseRepository(string commandLine)
  1209. {
  1210. // adds an object and returns the ID
  1211. DataRow row = runScanTable.NewRow();
  1212. row["RunDate"] = DateTime.Now;
  1213. row["RunCommand"] = commandLine;
  1214. runScanTable.Rows.Add(row);
  1215. }
  1216. /// <summary>
  1217. /// Add a new object to the repository
  1218. /// </summary>
  1219. /// <param name="name"></param>
  1220. /// <param name="description"></param>
  1221. /// <param name="objectType"></param>
  1222. /// <param name="parentObjectID"></param>
  1223. /// <returns></returns>
  1224. public int AddObject(string name, string description, string objectType, int parentObjectID)
  1225. {
  1226. // adds an object and returns the ID
  1227. DataRow row = objectTable.NewRow();
  1228. row["RunKey"] = this.runKeyValue;
  1229. row["ObjectName"] = name;
  1230. row["ObjectTypeString"] = objectType;
  1231. row["ObjectDesc"] = description;
  1232. objectTable.Rows.Add(row);
  1233. // the ObjectKey is an identity column and should be incremented automatically.
  1234. int objectID = (int)row["ObjectKey"];
  1235. // add containment
  1236. AddObjectContainment(parentObjectID, objectID);
  1237. return objectID;
  1238. }
  1239. /// <summary>
  1240. /// adds the type of object to the repository
  1241. /// </summary>
  1242. /// <param name="objectType"></param>
  1243. public void AddObjectType(string domain, string objectType)
  1244. {
  1245. AddObjectType(domain, objectType, objectType, string.Empty);
  1246. }
  1247. /// <summary>
  1248. /// adds the type of object to the repository
  1249. /// </summary>
  1250. /// <param name="objectType"></param>
  1251. public void AddObjectType(string domain, string objectTypeKey, string objectTypeName)
  1252. {
  1253. AddObjectType(domain, objectTypeKey, objectTypeName, string.Empty);
  1254. }
  1255. /// <summary>
  1256. /// Adds the type of object to the repository
  1257. /// </summary>
  1258. /// <param name="objectType"></param>
  1259. /// <param name="name"></param>
  1260. /// <param name="description"></param>
  1261. public void AddObjectType(string domain, string objectType, string name, string description)
  1262. {
  1263. if (!IsTypeDefined(objectType))
  1264. {
  1265. DataRow row = objectTypesTable.NewRow();
  1266. row["ObjectTypeID"] = objectType;
  1267. row["ObjectTypeName"] = name;
  1268. row["ObjectTypeDesc"] = description;
  1269. row["Domain"] = domain;
  1270. objectTypesTable.Rows.Add(row);
  1271. }
  1272. }
  1273. public bool IsTypeDefined(string typeID)
  1274. {
  1275. DataRow[] rows = this.objectTypesTable.Select(string.Format("ObjectTypeID = '{0}'", typeID));
  1276. Debug.Assert(rows.Length == 0 || rows.Length == 1);
  1277. return (rows.Length > 0);
  1278. }
  1279. /// <summary>
  1280. /// adds a relationship between objects that's not containment or lineage map
  1281. /// </summary>
  1282. /// <param name="from"></param>
  1283. /// <param name="to"></param>
  1284. public void AddUseDependency(int from, int to)
  1285. {
  1286. AddDependency(from, to, DependencyTypes.Use);
  1287. }
  1288. /// <summary>
  1289. /// Adds a containment relationship between specified objects
  1290. /// </summary>
  1291. /// <param name="parent"></param>
  1292. /// <param name="child"></param>
  1293. private void AddObjectContainment(int parent, int child)
  1294. {
  1295. AddDependency(parent, child, DependencyTypes.Containment);
  1296. }
  1297. /// <summary>
  1298. /// Adds a data mapping between objects
  1299. /// </summary>
  1300. /// <param name="from"></param>
  1301. /// <param name="to"></param>
  1302. public void AddMapping(int from, int to)
  1303. {
  1304. AddDependency(from, to, DependencyTypes.Lineage);
  1305. }
  1306. /// <summary>
  1307. /// adds a row to the dependencies table
  1308. /// </summary>
  1309. /// <param name="from"></param>
  1310. /// <param name="to"></param>
  1311. /// <param name="type"></param>
  1312. private void AddDependency(int from, int to, string type)
  1313. {
  1314. DataRow row = objectDependenciesTable.NewRow();
  1315. row["RunKey"] = this.runKeyValue;
  1316. row["SrcObjectKey"] = from;
  1317. row["TgtObjectKey"] = to;
  1318. row["DependencyType"] = type;
  1319. objectDependenciesTable.Rows.Add(row);
  1320. }
  1321. /// <summary>
  1322. /// returns whether there's a mapping between the source and target objects
  1323. /// todo: perf hit?
  1324. /// </summary>
  1325. /// <param name="from"></param>
  1326. /// <param name="to"></param>
  1327. /// <returns></returns>
  1328. public bool DoesMappingExist(int from, int to)
  1329. {
  1330. return DoesDependencyExist(from, to, DependencyTypes.Lineage);
  1331. }
  1332. /// <summary>
  1333. /// returns whether there's a mapping between the source and target objects
  1334. /// todo: perf hit?
  1335. /// </summary>
  1336. /// <param name="from"></param>
  1337. /// <param name="to"></param>
  1338. /// <returns></returns>
  1339. public bool DoesDependencyExist(int from, int to, string dependencyType)
  1340. {
  1341. DataRow[] rows = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND TgtObjectKey = '{1}' AND DependencyType = '{2}'", from, to, dependencyType));
  1342. return (rows.Length > 0);
  1343. }
  1344. /// <summary>
  1345. /// Adds attributes for an object.
  1346. /// </summary>
  1347. /// <param name="objectID"></param>
  1348. /// <param name="attributeName"></param>
  1349. /// <param name="attributeValue"></param>
  1350. public void AddAttribute(int objectID, string attributeName, string attributeValue)
  1351. {
  1352. if (!string.IsNullOrEmpty(attributeName) && !string.IsNullOrEmpty(attributeValue))
  1353. {
  1354. DataRow row = objectAttributesTable.NewRow();
  1355. row["RunKey"] = this.runKeyValue;
  1356. row["ObjectKey"] = objectID;
  1357. row["ObjectAttrName"] = attributeName;
  1358. row["ObjectAttrValue"] = attributeValue;
  1359. objectAttributesTable.Rows.Add(row);
  1360. }
  1361. }
  1362. /// <summary>
  1363. /// Return IDs of objects that have specified name and type
  1364. /// </summary>
  1365. /// <param name="name">name</param>
  1366. /// <param name="type">type</param>
  1367. /// <returns>Array of object IDs that satisfy the condition</returns>
  1368. private int[] GetNamedObjects(string name, string type)
  1369. {
  1370. DataRow[] rows = objectTable.Select(string.Format("ObjectTypeString = '{0}' AND ObjectName = '{1}'", type, name));
  1371. int[] ids = new int[rows.Length];
  1372. for (int i = 0; i < ids.Length; ++i)
  1373. {
  1374. ids[i] = (int)rows[i]["ObjectKey"];
  1375. }
  1376. return ids;
  1377. }
  1378. /// <summary>
  1379. /// Return ID of objects that have specified name and type
  1380. /// </summary>
  1381. /// <param name="name">name</param>
  1382. /// <param name="type">type</param>
  1383. /// <returns>Object ID or -1</returns>
  1384. private int GetNamedObject(string name, string type)
  1385. {
  1386. int[] ids = GetNamedObjects(name, type);
  1387. if (ids.Length > 0)
  1388. {
  1389. Debug.Assert(ids.Length == 1);
  1390. return ids[0];
  1391. }
  1392. else
  1393. {
  1394. return -1;
  1395. }
  1396. }
  1397. /// <summary>
  1398. /// returns ID of the connection with specified connection string. -1 if there's no connection with
  1399. /// specificed connection string.
  1400. /// </summary>
  1401. /// <param name="connectionString"></param>
  1402. /// <returns></returns>
  1403. public int GetConnection(string connectionString)
  1404. {
  1405. int connectionID = -1; // assume no connection will be found
  1406. // if a connection with the same string exists, return it.
  1407. DataRow[] rows = objectAttributesTable.Select(string.Format("ObjectAttrName = 'ConnectionString' AND ObjectAttrValue = '{0}' ", connectionString));
  1408. if (rows.Length > 0)
  1409. {
  1410. Debug.Assert(rows.Length == 1); // should be only one because we're keeping them unique.
  1411. connectionID = (int)rows[0]["ObjectKey"];
  1412. }
  1413. else
  1414. {
  1415. connectionID = GetOleDbCanonicalConnection(connectionString);
  1416. }
  1417. return connectionID;
  1418. }
  1419. private int GetOleDbCanonicalConnection(string connectionString)
  1420. {
  1421. int connectionID = -1;
  1422. try
  1423. {
  1424. DbConnectionStringBuilder targetConnectionStringBuilder = GetConnectionStringBuilder(connectionString);
  1425. if (targetConnectionStringBuilder != null)
  1426. {
  1427. // get a list of existing connection strings
  1428. DataRow[] rows = objectAttributesTable.Select(string.Format("ObjectAttrName = 'ConnectionString'"));
  1429. foreach (DataRow row in rows)
  1430. {
  1431. try
  1432. {
  1433. DbConnectionStringBuilder currentConnectionStringBuilder = GetConnectionStringBuilder(row["ObjectAttrValue"].ToString());
  1434. if (currentConnectionStringBuilder != null)
  1435. {
  1436. if (databaseNameOnlyCompare)
  1437. {
  1438. // todo: does username matter for the relational database?
  1439. //if (CompareProviders(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1440. // && CompareDatabases(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1441. // )
  1442. // And drop the Provider name, as this isn't there for the SQLDBEnumerator...
  1443. if (CompareDatabases(targetConnectionStringBuilder, currentConnectionStringBuilder))
  1444. {
  1445. connectionID = (int)row["ObjectKey"];
  1446. break;
  1447. }
  1448. }
  1449. else
  1450. {
  1451. // todo: does username matter for the relational database?
  1452. if (CompareProviders(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1453. && CompareServers(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1454. && CompareDatabases(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1455. )
  1456. {
  1457. connectionID = (int)row["ObjectKey"];
  1458. break;
  1459. }
  1460. }
  1461. }
  1462. }
  1463. catch (System.Exception)
  1464. {
  1465. }
  1466. }
  1467. }
  1468. }
  1469. catch (System.Exception)
  1470. {
  1471. // ignore
  1472. }
  1473. return connectionID;
  1474. }
  1475. private bool CompareDatabases(DbConnectionStringBuilder builder1, DbConnectionStringBuilder builder2)
  1476. {
  1477. string db1 = GetDatabase(builder1);
  1478. string db2 = GetDatabase(builder2);
  1479. if (db1 == null)
  1480. return false;
  1481. if (db2 == null)
  1482. return false;
  1483. if (databasePrefixExclusions.Count > 0)
  1484. {
  1485. foreach (string dbPrefix in databasePrefixExclusions)
  1486. {
  1487. if (db1.StartsWith(dbPrefix))
  1488. {
  1489. db1 = db1.Substring(dbPrefix.Length);
  1490. }
  1491. if (db2.StartsWith(dbPrefix))
  1492. {
  1493. db2 = db2.Substring(dbPrefix.Length);
  1494. }
  1495. }
  1496. }
  1497. return (db1.ToLower() == db2.ToLower());
  1498. }
  1499. /// <summary>
  1500. /// parses the database out of connection string by understanding the different ways providers store
  1501. /// this information.
  1502. /// </summary>
  1503. /// <param name="builder"></param>
  1504. /// <returns></returns>
  1505. public string GetDatabase(DbConnectionStringBuilder builder)
  1506. {
  1507. object ob = null;
  1508. builder.TryGetValue(ConnectionStringProperties.InitialCatalog, out ob);
  1509. if ((ob == null) || (string.IsNullOrEmpty(ob.ToString())))
  1510. {
  1511. builder.TryGetValue(ConnectionStringProperties.Database, out ob);
  1512. }
  1513. string database = null;
  1514. if (ob != null)
  1515. database = ob.ToString();
  1516. return database;
  1517. }
  1518. public DbConnectionStringBuilder GetConnectionStringBuilder(string connectionString)
  1519. {
  1520. DbConnectionStringBuilder builder = null;
  1521. // try to create an OledbConnectionString
  1522. try
  1523. {
  1524. builder = new OleDbConnectionStringBuilder(connectionString);
  1525. // if we reach here, we were able to parse it
  1526. }
  1527. catch (System.Exception)
  1528. {
  1529. }
  1530. return builder;
  1531. }
  1532. /// <summary>
  1533. /// returns True if the providers in both connection strings match
  1534. /// </summary>
  1535. /// <param name="builder1"></param>
  1536. /// <param name="builder2"></param>
  1537. /// <returns></returns>
  1538. private bool CompareProviders(DbConnectionStringBuilder builder1, DbConnectionStringBuilder builder2)
  1539. {
  1540. bool providersMatch = false;
  1541. object ob = null;
  1542. if (builder1.TryGetValue(ConnectionStringProperties.Provider, out ob))
  1543. {
  1544. string provider1 = ob.ToString();
  1545. if (builder2.TryGetValue(ConnectionStringProperties.Provider, out ob))
  1546. {
  1547. string provider2 = ob.ToString();
  1548. if (provider1.ToLower() == provider2.ToLower())
  1549. {
  1550. providersMatch = true;
  1551. }
  1552. else
  1553. {
  1554. if ((provider1.StartsWith("SQLNCLI") || (provider1.StartsWith("SQLOLEDB")))
  1555. && (provider2.StartsWith("SQLNCLI") || provider2.StartsWith("SQLOLEDB")))
  1556. {
  1557. providersMatch = true;
  1558. }
  1559. }
  1560. }
  1561. }
  1562. return providersMatch;
  1563. }
  1564. /// <summary>
  1565. /// compares if the servers in the two connection strings are the same.
  1566. /// </summary>
  1567. /// <param name="builder1"></param>
  1568. /// <param name="builder2"></param>
  1569. /// <returns></returns>
  1570. private bool CompareServers(DbConnectionStringBuilder builder1, DbConnectionStringBuilder builder2)
  1571. {
  1572. bool matched = false;
  1573. string dataSource1 = GetServer(builder1);
  1574. string dataSource2 = GetServer(builder2);
  1575. if (dataSource1.ToLower() == dataSource2.ToLower())
  1576. {
  1577. matched = true;
  1578. }
  1579. else
  1580. {
  1581. if (dataSource1 == "." || (string.Compare(dataSource1, "localhost", true) == 0) || (string.Compare(dataSource1, "(local)", true) == 0))
  1582. {
  1583. if (dataSource2 == "." || (string.Compare(dataSource2, "localhost", true) == 0) || (string.Compare(dataSource2, "(local)", true) == 0))
  1584. {
  1585. matched = true;
  1586. }
  1587. }
  1588. }
  1589. return matched;
  1590. }
  1591. /// <summary>
  1592. /// Tries to get the server out of the connection strings by looking for common ways of specifying them.
  1593. /// </summary>
  1594. /// <param name="builder1"></param>
  1595. /// <returns></returns>
  1596. public string GetServer(DbConnectionStringBuilder builder1)
  1597. {
  1598. object ob = null;
  1599. string dataSource = null;
  1600. builder1.TryGetValue(ConnectionStringProperties.DataSource, out ob);
  1601. if ((ob == null) || (string.IsNullOrEmpty(ob.ToString())))
  1602. builder1.TryGetValue(ConnectionStringProperties.Server, out ob);
  1603. if ((ob == null) || (string.IsNullOrEmpty(ob.ToString())))
  1604. builder1.TryGetValue(ConnectionStringProperties.Location, out ob);
  1605. if (ob != null)
  1606. {
  1607. dataSource = ob.ToString();
  1608. }
  1609. return dataSource;
  1610. }
  1611. public int GetTable(int connectionID, string tableName)
  1612. {
  1613. int tableID = -1; // assume no table will be found
  1614. // get the tables that correspond to this connection
  1615. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", connectionID, DependencyTypes.Containment));
  1616. // see if any table has our name
  1617. foreach (DataRow row in connectionChildren)
  1618. {
  1619. DataRow[] relationalTableRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], RelationalEnumerator.ObjectTypes.Table, tableName));
  1620. if (relationalTableRows.Length > 0)
  1621. {
  1622. Debug.Assert(relationalTableRows.Length == 1); // should be only one table in a connection with the same name
  1623. tableID = (int)relationalTableRows[0]["ObjectKey"];
  1624. break;
  1625. }
  1626. }
  1627. if (tableID == -1)
  1628. {
  1629. tableID = AddObject(tableName, string.Empty, RelationalEnumerator.ObjectTypes.Table, connectionID);
  1630. }
  1631. return tableID;
  1632. }
  1633. /// <summary>
  1634. /// Searches for an existing ID for a Procedure, and if not found, adds a new entry.
  1635. /// </summary>
  1636. /// <param name="connectionID">The connection that this procedure should be found in</param>
  1637. /// <param name="procName">The name of the procedure</param>
  1638. /// <returns>the ID that belongs to the procedure</returns>
  1639. public int GetProcedure(int connectionID, string procName)
  1640. {
  1641. int procID = -1; // assume no procedure will be found
  1642. // get the procedures that correspond to this connection
  1643. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", connectionID, DependencyTypes.Containment));
  1644. // see if any procedure has our name
  1645. foreach (DataRow row in connectionChildren)
  1646. {
  1647. DataRow[] relationalProcedureRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], RelationalEnumerator.ObjectTypes.Procedure, procName));
  1648. if (relationalProcedureRows.Length > 0)
  1649. {
  1650. Debug.Assert(relationalProcedureRows.Length == 1); // should be only one procedure in a connection with the same name
  1651. procID = (int)relationalProcedureRows[0]["ObjectKey"];
  1652. break;
  1653. }
  1654. }
  1655. if (procID == -1)
  1656. {
  1657. procID = AddObject(procName, string.Empty, RelationalEnumerator.ObjectTypes.Procedure, connectionID);
  1658. }
  1659. return procID;
  1660. }
  1661. /// <summary>
  1662. /// Searches for an existing ID for a Function, and if not found, adds a new entry.
  1663. /// </summary>
  1664. /// <param name="connectionID">The connection that this Function should be found in</param>
  1665. /// <param name="funcName">The name of the Function</param>
  1666. /// <returns>the ID that belongs to the Function</returns>
  1667. public int GetFunction(int connectionID, string funcName)
  1668. {
  1669. int funcID = -1; // assume no Function will be found
  1670. // get the Functions that correspond to this connection
  1671. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", connectionID, DependencyTypes.Containment));
  1672. // see if any Function has our name
  1673. foreach (DataRow row in connectionChildren)
  1674. {
  1675. DataRow[] relationalFunctionRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], RelationalEnumerator.ObjectTypes.Function, funcName));
  1676. if (relationalFunctionRows.Length > 0)
  1677. {
  1678. Debug.Assert(relationalFunctionRows.Length == 1); // should be only one Function in a connection with the same name
  1679. funcID = (int)relationalFunctionRows[0]["ObjectKey"];
  1680. break;
  1681. }
  1682. }
  1683. if (funcID == -1)
  1684. {
  1685. funcID = AddObject(funcName, string.Empty, RelationalEnumerator.ObjectTypes.Function, connectionID);
  1686. }
  1687. return funcID;
  1688. }
  1689. /// <summary>
  1690. /// Returns the column id for column which belongs to something.
  1691. /// </summary>
  1692. /// <param name="parentID">The RepositoryID for the parent of this column</param>
  1693. /// <param name="columnName">The name of the column as known by this parent</param>
  1694. /// <returns>The ID of the column in the Repository</returns>
  1695. public int GetColumn(int parentID, string columnName)
  1696. {
  1697. int columnID = -1; // assume that the column hasn't been added yet
  1698. // get the columns that correspond to the table
  1699. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", parentID, DependencyTypes.Containment));
  1700. // see if any table has our name
  1701. foreach (DataRow row in connectionChildren)
  1702. {
  1703. DataRow[] relationalTableRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], ColumnEnumerator.ObjectTypes.Column, columnName));
  1704. if (relationalTableRows.Length > 0)
  1705. {
  1706. Debug.Assert(relationalTableRows.Length == 1); // should be only one table in a connection with the same name
  1707. columnID = (int)relationalTableRows[0]["ObjectKey"];
  1708. break;
  1709. }
  1710. }
  1711. if (columnID == -1)
  1712. {
  1713. columnID = AddObject(columnName, string.Empty, ColumnEnumerator.ObjectTypes.Column, parentID);
  1714. }
  1715. return columnID;
  1716. }
  1717. /// <summary>
  1718. /// Get object corresponding to the specified Report Name
  1719. /// </summary>
  1720. /// <param name="reportName">The name of the report</param>
  1721. /// <param name="description">The description of the report</param>
  1722. /// <param name="reportServerID">The ID of the reporting server</param>
  1723. /// <returns></returns>
  1724. public int GetReport(string reportName, string description, int reportServerID)
  1725. {
  1726. int reportID = -1;
  1727. // get the objects that correspond to this reportServer
  1728. DataRow[] reportChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", reportServerID, DependencyTypes.Containment));
  1729. // see if any report has our name
  1730. foreach (DataRow row in reportChildren)
  1731. {
  1732. DataRow[] reportRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], ReportEnumerator.ObjectTypes.Report, reportName));
  1733. if (reportRows.Length > 0)
  1734. {
  1735. Debug.Assert(reportRows.Length == 1); // should be only one Report in a Server with the same name
  1736. reportID = (int)reportRows[0]["ObjectKey"];
  1737. break;
  1738. }
  1739. }
  1740. if (reportID == -1)
  1741. {
  1742. reportID = AddObject(reportName, description, ReportEnumerator.ObjectTypes.Report, reportServerID);
  1743. }
  1744. return reportID;
  1745. }
  1746. /// <summary>
  1747. /// Get object corresponding to specified file.
  1748. /// </summary>
  1749. /// <param name="fileName">File Name</param>
  1750. /// <param name="hostMachineName">Host where the File Name points to the file</param>
  1751. /// <returns></returns>
  1752. public int GetFile(string fileName, string hostMachineName)
  1753. {
  1754. string fileMachineName = hostMachineName;
  1755. if (fileName.StartsWith(@"\\"))
  1756. {
  1757. fileMachineName = fileName.Substring(2);
  1758. if (fileMachineName.IndexOf('\\') > 0)
  1759. fileMachineName = fileMachineName.Substring(0, fileMachineName.IndexOf('\\'));
  1760. }
  1761. fileMachineName = fileMachineName.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
  1762. // find machine object
  1763. int machineID = GetNamedObject(fileMachineName, FileEnumerator.ObjectTypes.Machine);
  1764. if (machineID < 0)
  1765. {
  1766. // create if does not exist
  1767. machineID = AddObject(fileMachineName, "Computer", FileEnumerator.ObjectTypes.Machine, 0);
  1768. }
  1769. // get all the files and check machine ownership
  1770. int[] files = GetNamedObjects(fileName, FileEnumerator.ObjectTypes.File);
  1771. foreach (int fileCandidate in files)
  1772. {
  1773. if (DoesDependencyExist(machineID, fileCandidate, DependencyTypes.Containment))
  1774. return fileCandidate;
  1775. }
  1776. // Create the file record
  1777. int fileID = AddObject(fileName, "File", FileEnumerator.ObjectTypes.File, machineID);
  1778. Debug.Assert(DoesDependencyExist(machineID, fileID, DependencyTypes.Containment));
  1779. return fileID;
  1780. }
  1781. internal int GetDataSet(string sdsName, int reportServerID)
  1782. {
  1783. int dataSetID = -1;
  1784. // get the objects that correspond to this reportServer
  1785. DataRow[] reportChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", reportServerID, DependencyTypes.Containment));
  1786. // see if any report has our name
  1787. foreach (DataRow row in reportChildren)
  1788. {
  1789. DataRow[] dataSetRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], ReportEnumerator.ObjectTypes.Report, sdsName));
  1790. if (dataSetRows.Length > 0)
  1791. {
  1792. Debug.Assert(dataSetRows.Length == 1); // should be only one Shared Data Set in a Server with the same name
  1793. dataSetID = (int)dataSetRows[0]["ObjectKey"];
  1794. break;
  1795. }
  1796. }
  1797. if (dataSetID == -1)
  1798. {
  1799. dataSetID = AddObject(sdsName, string.Empty, ReportEnumerator.ObjectTypes.DataSet, reportServerID);
  1800. }
  1801. return dataSetID;
  1802. }
  1803. }
  1804. }