Skip to content

Commit d20215c

Browse files
authored
added script as alter (#564)
* added script as alter
1 parent 4dd30c5 commit d20215c

File tree

12 files changed

+87
-17
lines changed

12 files changed

+87
-17
lines changed
-3.55 MB
Binary file not shown.
3.56 MB
Binary file not shown.

src/Microsoft.SqlTools.Credentials/Microsoft.SqlTools.Credentials.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
</ItemGroup>
2020
<ItemGroup>
2121
<PackageReference Include="System.Data.SqlClient" Version="4.4.0" />
22-
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.8" />
22+
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.9" />
2323
<PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
2424
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="2.0.0" />
2525
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />

src/Microsoft.SqlTools.ServiceLayer/Microsoft.SqlTools.ServiceLayer.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
<Reference Include="System.Data.SqlClient" />
1919
</ItemGroup>
2020
<ItemGroup>
21-
<PackageReference Include="System.Data.SqlClient" Version="4.4.0" />
22-
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.8" />
21+
<PackageReference Include="System.Data.SqlClient" Version="4.4.0" />
22+
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.9" />
2323
</ItemGroup>
2424
<ItemGroup>
2525
<Compile Include="**\*.cs" />

src/Microsoft.SqlTools.ServiceLayer/Scripting/Contracts/ScriptingOperationType.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public enum ScriptingOperationType
1515
Insert = 2,
1616
Update = 3,
1717
Delete = 4,
18-
Execute = 5
18+
Execute = 5,
19+
Alter = 6
1920
}
2021
}

src/Microsoft.SqlTools.ServiceLayer/Scripting/ScriptAsScriptingOperation.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public override void Execute()
8787
switch (this.Parameters.Operation)
8888
{
8989
case ScriptingOperationType.Create:
90+
case ScriptingOperationType.Alter:
9091
case ScriptingOperationType.Delete: // Using Delete here is wrong. delete usually means delete rows from table but sqlopsstudio sending the operation name as delete instead of drop
9192
resultScript = GenerateScriptAs(server, urns, options);
9293
break;
@@ -438,6 +439,17 @@ private string GenerateScriptAs(Server server, UrnCollection urns, ScriptingOpti
438439
try
439440
{
440441
scripter = new SqlServer.Management.Smo.Scripter(server);
442+
if(this.Parameters.Operation == ScriptingOperationType.Alter)
443+
{
444+
options.ScriptForAlter = true;
445+
foreach (var urn in urns)
446+
{
447+
SqlSmoObject smoObject = server.GetSmoObject(urn);
448+
449+
// without calling the toch method, no alter script get generated from smo
450+
smoObject.Touch();
451+
}
452+
}
441453

442454
scripter.Options = options;
443455
scripter.ScriptingError += ScripterScriptingError;

src/Microsoft.SqlTools.ServiceLayer/Scripting/ScriptingService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ private bool ShouldCreateScriptAsOperation(ScriptingParams parameters)
163163
// To script Select, alter and execute use scripting as operation. The other operation doesn't support those types
164164
if( (parameters.ScriptingObjects != null && parameters.ScriptingObjects.Count == 1 && parameters.ScriptOptions != null
165165
&& parameters.ScriptOptions.TypeOfDataToScript == "SchemaOnly" && parameters.ScriptDestination == "ToEditor") ||
166-
parameters.Operation == ScriptingOperationType.Select || parameters.Operation == ScriptingOperationType.Execute)
166+
parameters.Operation == ScriptingOperationType.Select || parameters.Operation == ScriptingOperationType.Execute ||
167+
parameters.Operation == ScriptingOperationType.Alter)
167168
{
168169
return true;
169170
}

test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Microsoft.SqlTools.ServiceLayer.IntegrationTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<PackageReference Include="xunit" Version="2.2.0" />
3333
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
3434
<PackageReference Include="System.Data.SqlClient" Version="4.4.0" />
35-
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.8" />
35+
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.9" />
3636
</ItemGroup>
3737
<ItemGroup>
3838
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />

test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Scripting/ScriptingServiceTests.cs

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts;
1313
using Moq;
1414
using System.Collections.Generic;
15+
using System.Linq;
1516
using System.Threading;
1617
using System.Threading.Tasks;
1718
using Xunit;
@@ -113,10 +114,51 @@ public async void VerifyScriptAsExecuteTableFailes()
113114
Type = "Table"
114115
};
115116
string expectedScript = null;
116-
117117
await VerifyScriptAs(query, scriptingObject, scriptCreateDrop, expectedScript);
118118
}
119119

120+
[Fact]
121+
public async void VerifyScriptAsAlter()
122+
{
123+
string query = @"CREATE PROCEDURE testSp1 @StartProductID [int] AS BEGIN Select * from sys.all_columns END
124+
GO
125+
CREATE VIEW testView1 AS SELECT * from sys.all_columns
126+
GO
127+
CREATE FUNCTION testFun1() RETURNS [int] AS BEGIN RETURN 1 END
128+
GO";
129+
ScriptingOperationType scriptCreateDrop = ScriptingOperationType.Alter;
130+
131+
List<ScriptingObject> scriptingObjects = new List<ScriptingObject>
132+
{
133+
new ScriptingObject
134+
{
135+
Name = "testSp1",
136+
Schema = "dbo",
137+
Type = "StoredProcedure"
138+
},
139+
new ScriptingObject
140+
{
141+
Name = "testView1",
142+
Schema = "dbo",
143+
Type = "View"
144+
},
145+
new ScriptingObject
146+
{
147+
Name = "testFun1",
148+
Schema = "dbo",
149+
Type = "UserDefinedFunction"
150+
}
151+
};
152+
List<string> expectedScripts = new List<string>
153+
{
154+
"ALTER PROCEDURE [dbo].[testSp1]",
155+
"ALTER VIEW [dbo].[testView1]",
156+
"ALTER FUNCTION [dbo].[testFun1]"
157+
};
158+
159+
await VerifyScriptAsForMultipleObjects(query, scriptingObjects, scriptCreateDrop, expectedScripts);
160+
}
161+
120162
[Fact]
121163
public async void VerifyScriptAsExecuteStoredProcedure()
122164
{
@@ -238,6 +280,11 @@ public async void VerifyScriptAsDropStoredProcedure()
238280
}
239281

240282
private async Task VerifyScriptAs(string query, ScriptingObject scriptingObject, ScriptingOperationType operation, string expectedScript)
283+
{
284+
await VerifyScriptAsForMultipleObjects(query, new List<ScriptingObject> { scriptingObject }, operation, new List<string> { expectedScript });
285+
}
286+
287+
private async Task VerifyScriptAsForMultipleObjects(string query, List<ScriptingObject> scriptingObjects, ScriptingOperationType operation, List<string> expectedScripts)
241288
{
242289
var testDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, query, "ScriptingTests");
243290
try
@@ -271,18 +318,15 @@ private async Task VerifyScriptAs(string query, ScriptingObject scriptingObject,
271318
ScriptCreateDrop = scriptCreateOperation,
272319
};
273320

274-
scriptingParams.ScriptingObjects = new List<ScriptingObject>
275-
{
276-
scriptingObject
277-
};
321+
scriptingParams.ScriptingObjects = scriptingObjects;
278322

279323

280324
ScriptingService service = new ScriptingService();
281325
await service.HandleScriptExecuteRequest(scriptingParams, requestContext.Object);
282326
Thread.Sleep(2000);
283327
await service.ScriptingTask;
284328

285-
requestContext.Verify(x => x.SendResult(It.Is<ScriptingResult>(r => VerifyScriptingResult(r, expectedScript))));
329+
requestContext.Verify(x => x.SendResult(It.Is<ScriptingResult>(r => VerifyScriptingResult(r, expectedScripts))));
286330
connectionService.Disconnect(new ServiceLayer.Connection.Contracts.DisconnectParams
287331
{
288332
OwnerUri = queryTempFile.FilePath
@@ -299,9 +343,21 @@ private async Task VerifyScriptAs(string query, ScriptingObject scriptingObject,
299343
}
300344
}
301345

302-
private static bool VerifyScriptingResult(ScriptingResult result, string expected)
346+
private static bool VerifyScriptingResult(ScriptingResult result, List<string> expectedScripts)
303347
{
304-
return string.IsNullOrEmpty(expected) ? string.IsNullOrEmpty(result.Script) : !string.IsNullOrEmpty(result.Script) && result.Script.Contains(expected);
348+
if (expectedScripts == null || (expectedScripts.Count > 0 && expectedScripts.All(x => x == null)))
349+
{
350+
return string.IsNullOrEmpty(result.Script);
351+
}
352+
353+
foreach (string expectedScript in expectedScripts)
354+
{
355+
if (!result.Script.Contains(expectedScript))
356+
{
357+
return false;
358+
}
359+
}
360+
return true;
305361
}
306362
}
307363
}

test/Microsoft.SqlTools.ServiceLayer.Test.Common/Microsoft.SqlTools.ServiceLayer.Test.Common.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<PackageReference Include="xunit" Version="2.2.0" />
1313
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
1414
<PackageReference Include="System.Data.SqlClient" Version="4.4.0" />
15-
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.8" />
15+
<PackageReference Include="Microsoft.SqlServer.Smo" Version="140.2.9" />
1616
</ItemGroup>
1717
<ItemGroup>
1818
<EmbeddedResource Include="Scripts/CreateTestDatabaseObjects.sql" />

0 commit comments

Comments
 (0)