Remove redundant usage of object URNs in database handler (#2245)

This commit is contained in:
Cory Rivera
2023-09-20 17:17:54 -07:00
committed by GitHub
parent d27e86915e
commit c29fb03b6e
5 changed files with 27 additions and 32 deletions

View File

@@ -11,10 +11,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts
{ {
public class DetachDatabaseRequestParams : GeneralRequestDetails public class DetachDatabaseRequestParams : GeneralRequestDetails
{ {
/// <summary>
/// SFC (SMO) URN identifying the object
/// </summary>
public string ObjectUrn { get; set; }
/// <summary> /// <summary>
/// The target database name. /// The target database name.
/// </summary> /// </summary>

View File

@@ -11,10 +11,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts
{ {
public class DropDatabaseRequestParams : GeneralRequestDetails public class DropDatabaseRequestParams : GeneralRequestDetails
{ {
/// <summary>
/// SFC (SMO) URN identifying the object
/// </summary>
public string ObjectUrn { get; set; }
/// <summary> /// <summary>
/// The target database name. /// The target database name.
/// </summary> /// </summary>

View File

@@ -11,10 +11,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts
{ {
public class PurgeQueryStoreDataRequestParams : GeneralRequestDetails public class PurgeQueryStoreDataRequestParams : GeneralRequestDetails
{ {
/// <summary>
/// SFC (SMO) URN identifying the object
/// </summary>
public string ObjectUrn { get; set; }
/// <summary> /// <summary>
/// The target database name. /// The target database name.
/// </summary> /// </summary>

View File

@@ -24,6 +24,7 @@ using System.Collections.Specialized;
using Microsoft.SqlTools.SqlCore.Utility; using Microsoft.SqlTools.SqlCore.Utility;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using Microsoft.Data.SqlClient; using Microsoft.Data.SqlClient;
using Microsoft.SqlServer.Management.Sdk.Sfc;
namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
{ {
@@ -196,7 +197,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
public override Task<InitializeViewResult> InitializeObjectView(InitializeViewRequestParams requestParams) public override Task<InitializeViewResult> InitializeObjectView(InitializeViewRequestParams requestParams)
{ {
// create a default data context and database object // create a default data context and database object
using (var dataContainer = CreateDatabaseDataContainer(requestParams.ConnectionUri, requestParams.ObjectUrn, requestParams.IsNewObject, requestParams.Database)) using (var dataContainer = CreateDatabaseDataContainer(requestParams.ConnectionUri, requestParams.IsNewObject, requestParams.Database))
{ {
if (dataContainer.Server == null) if (dataContainer.Server == null)
{ {
@@ -418,7 +419,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
public string Detach(DetachDatabaseRequestParams detachParams) public string Detach(DetachDatabaseRequestParams detachParams)
{ {
var sqlScript = string.Empty; var sqlScript = string.Empty;
using (var dataContainer = CreateDatabaseDataContainer(detachParams.ConnectionUri, detachParams.ObjectUrn, false, detachParams.Database)) using (var dataContainer = CreateDatabaseDataContainer(detachParams.ConnectionUri, false, detachParams.Database))
{ {
var smoDatabase = dataContainer.SqlDialogSubject as Database; var smoDatabase = dataContainer.SqlDialogSubject as Database;
if (smoDatabase != null) if (smoDatabase != null)
@@ -465,7 +466,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
} }
else else
{ {
throw new InvalidOperationException($"Provided URN '{detachParams.ObjectUrn}' did not correspond to an existing database."); throw new InvalidOperationException($"Could not find database '{detachParams.Database}'.");
} }
} }
return sqlScript; return sqlScript;
@@ -496,7 +497,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
{ {
var sqlScript = string.Empty; var sqlScript = string.Empty;
ConnectionInfo connectionInfo = this.GetConnectionInfo(attachParams.ConnectionUri); ConnectionInfo connectionInfo = this.GetConnectionInfo(attachParams.ConnectionUri);
using (var dataContainer = CreateDatabaseDataContainer(attachParams.ConnectionUri, null, true, null)) using (var dataContainer = CreateDatabaseDataContainer(attachParams.ConnectionUri, true, string.Empty))
{ {
var server = dataContainer.Server!; var server = dataContainer.Server!;
var originalExecuteMode = server.ConnectionContext.SqlExecutionModes; var originalExecuteMode = server.ConnectionContext.SqlExecutionModes;
@@ -552,7 +553,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
public string Drop(DropDatabaseRequestParams dropParams) public string Drop(DropDatabaseRequestParams dropParams)
{ {
var sqlScript = string.Empty; var sqlScript = string.Empty;
using (var dataContainer = CreateDatabaseDataContainer(dropParams.ConnectionUri, dropParams.ObjectUrn, false, dropParams.Database)) using (var dataContainer = CreateDatabaseDataContainer(dropParams.ConnectionUri, false, dropParams.Database))
{ {
var smoDatabase = dataContainer.SqlDialogSubject as Database; var smoDatabase = dataContainer.SqlDialogSubject as Database;
if (smoDatabase != null) if (smoDatabase != null)
@@ -624,7 +625,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
} }
else else
{ {
throw new InvalidOperationException($"Provided URN '{dropParams.ObjectUrn}' did not correspond to an existing database."); throw new InvalidOperationException($"Could not find database '{dropParams.Database}'.");
} }
} }
return sqlScript; return sqlScript;
@@ -636,7 +637,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
/// <param name="purgeParams"></param> /// <param name="purgeParams"></param>
public void PurgeQueryStoreData(PurgeQueryStoreDataRequestParams purgeParams) public void PurgeQueryStoreData(PurgeQueryStoreDataRequestParams purgeParams)
{ {
using (var dataContainer = CreateDatabaseDataContainer(purgeParams.ConnectionUri, purgeParams.ObjectUrn, false, purgeParams.Database)) using (var dataContainer = CreateDatabaseDataContainer(purgeParams.ConnectionUri, false, purgeParams.Database))
{ {
var smoDatabase = dataContainer.SqlDialogSubject as Database; var smoDatabase = dataContainer.SqlDialogSubject as Database;
if (smoDatabase != null) if (smoDatabase != null)
@@ -646,25 +647,28 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
} }
} }
private CDataContainer CreateDatabaseDataContainer(string connectionUri, string? objectURN, bool isNewDatabase, string? databaseName) private CDataContainer CreateDatabaseDataContainer(string connectionUri, bool isNewDatabase, string databaseName)
{ {
ConnectionInfo connectionInfo = this.GetConnectionInfo(connectionUri); ConnectionInfo connectionInfo = this.GetConnectionInfo(connectionUri);
var originalDatabaseName = connectionInfo.ConnectionDetails.DatabaseName; var originalDatabaseName = connectionInfo.ConnectionDetails.DatabaseName;
try try
{ {
string objectURN;
if (!isNewDatabase && !string.IsNullOrEmpty(databaseName)) if (!isNewDatabase && !string.IsNullOrEmpty(databaseName))
{ {
connectionInfo.ConnectionDetails.DatabaseName = databaseName; connectionInfo.ConnectionDetails.DatabaseName = databaseName;
objectURN = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Server/Database[@Name='{0}']", Urn.EscapeString(databaseName));
}
else
{
objectURN = "Server";
} }
CDataContainer dataContainer = CDataContainer.CreateDataContainer(connectionInfo, databaseExists: !isNewDatabase); CDataContainer dataContainer = CDataContainer.CreateDataContainer(connectionInfo, databaseExists: !isNewDatabase);
if (dataContainer.Server == null) if (dataContainer.Server == null)
{ {
throw new InvalidOperationException(serverNotExistsError); throw new InvalidOperationException(serverNotExistsError);
} }
if (string.IsNullOrEmpty(objectURN))
{
objectURN = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Server");
}
dataContainer.SqlDialogSubject = dataContainer.Server.GetSmoObject(objectURN); dataContainer.SqlDialogSubject = dataContainer.Server.GetSmoObject(objectURN);
return dataContainer; return dataContainer;
} }
@@ -681,7 +685,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
throw new ArgumentException("Database name not provided."); throw new ArgumentException("Database name not provided.");
} }
using (var dataContainer = CreateDatabaseDataContainer(viewParams.ConnectionUri, viewParams.ObjectUrn, viewParams.IsNewObject, viewParams.Database)) using (var dataContainer = CreateDatabaseDataContainer(viewParams.ConnectionUri, viewParams.IsNewObject, viewParams.Database))
{ {
if (dataContainer.Server == null) if (dataContainer.Server == null)
{ {

View File

@@ -65,11 +65,11 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
try try
{ {
// create and update // create and update
var parametersForCreation = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, "master", true, SqlObjectType.Database, "", ""); var parametersForCreation = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, testDatabase.Name, true, SqlObjectType.Database, "", "");
await ObjectManagementTestUtils.SaveObject(parametersForCreation, testDatabase); await ObjectManagementTestUtils.SaveObject(parametersForCreation, testDatabase);
Assert.That(DatabaseExists(testDatabase.Name!, server), $"Expected database '{testDatabase.Name}' was not created succesfully"); Assert.That(DatabaseExists(testDatabase.Name!, server), $"Expected database '{testDatabase.Name}' was not created succesfully");
var parametersForUpdate = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, "master", false, SqlObjectType.Database, "", objUrn); var parametersForUpdate = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, testDatabase.Name, false, SqlObjectType.Database, "", objUrn);
await ObjectManagementTestUtils.SaveObject(parametersForUpdate, testDatabase); await ObjectManagementTestUtils.SaveObject(parametersForUpdate, testDatabase);
// cleanup // cleanup
@@ -532,7 +532,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
var detachParams = new DetachDatabaseRequestParams() var detachParams = new DetachDatabaseRequestParams()
{ {
ConnectionUri = connectionUri, ConnectionUri = connectionUri,
ObjectUrn = objUrn, Database = testDatabase.Name,
DropConnections = true, DropConnections = true,
UpdateStatistics = true, UpdateStatistics = true,
GenerateScript = false GenerateScript = false
@@ -596,7 +596,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
var detachParams = new DetachDatabaseRequestParams() var detachParams = new DetachDatabaseRequestParams()
{ {
ConnectionUri = connectionUri, ConnectionUri = connectionUri,
ObjectUrn = objUrn, Database = testDatabase.Name,
DropConnections = false, DropConnections = false,
UpdateStatistics = false, UpdateStatistics = false,
GenerateScript = true GenerateScript = true
@@ -759,7 +759,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
var deleteParams = new DropDatabaseRequestParams() var deleteParams = new DropDatabaseRequestParams()
{ {
ConnectionUri = connectionUri, ConnectionUri = connectionUri,
ObjectUrn = objUrn, Database = testDatabase.Name,
DropConnections = false, DropConnections = false,
DeleteBackupHistory = false, DeleteBackupHistory = false,
GenerateScript = false GenerateScript = false
@@ -802,7 +802,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
var deleteParams = new DropDatabaseRequestParams() var deleteParams = new DropDatabaseRequestParams()
{ {
ConnectionUri = connectionUri, ConnectionUri = connectionUri,
ObjectUrn = objUrn, Database = testDatabase.Name,
DropConnections = false, DropConnections = false,
DeleteBackupHistory = false, DeleteBackupHistory = false,
GenerateScript = true GenerateScript = true
@@ -863,7 +863,10 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
{ {
if (db.Name == databaseName) if (db.Name == databaseName)
{ {
db.DropIfExists(); // Set database to single user mode to close any active connections
db.DatabaseOptions.UserAccess = SqlServer.Management.Smo.DatabaseUserAccess.Single;
db.Alter(TerminationClause.RollbackTransactionsImmediately);
db.Drop();
break; break;
} }
} }