Skip to content

Commit 745495f

Browse files
committed
[mssql] Prevent overwriting existing tables via drag and drop in browser
Fixes #16805
1 parent da21193 commit 745495f

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

src/providers/mssql/qgsmssqlprovider.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,6 +1819,26 @@ QgsVectorLayerExporter::ExportError QgsMssqlProvider::createEmptyLayer( const QS
18191819
return QgsVectorLayerExporter::ErrCreateLayer;
18201820
}
18211821
}
1822+
else
1823+
{
1824+
// test for existing
1825+
sql = QStringLiteral( "SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[%1].[%2]') AND type in (N'U')" )
1826+
.arg( schemaName, tableName );
1827+
if ( !q.exec( sql ) )
1828+
{
1829+
if ( errorMessage )
1830+
*errorMessage = q.lastError().text();
1831+
return QgsVectorLayerExporter::ErrCreateLayer;
1832+
}
1833+
1834+
// if we got a hit, abort!!
1835+
if ( q.next() )
1836+
{
1837+
if ( errorMessage )
1838+
*errorMessage = tr( "Table [%1].[%2] already exists" ).arg( schemaName, tableName );
1839+
return QgsVectorLayerExporter::ErrCreateLayer;
1840+
}
1841+
}
18221842

18231843
if ( !geometryColumn.isEmpty() )
18241844
{

tests/src/python/test_provider_mssql.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,25 @@ def testInsertPolygonInMultiPolygon(self):
298298
geom = [f.geometry().asWkt() for f in new_layer.getFeatures()]
299299
self.assertEqual(geom, ['MultiPolygon (((0 0, 1 0, 1 1, 0 1, 0 0)),((10 0, 11 0, 11 1, 10 1, 10 0)))', 'MultiPolygon (((30 0, 31 0, 31 1, 30 1, 30 0)))'])
300300

301+
def testOverwriteExisting(self):
302+
layer = QgsVectorLayer("NoGeometry?field=pk:integer", "addfeat", "memory")
303+
pr = layer.dataProvider()
304+
f = QgsFeature()
305+
f.setAttributes([133])
306+
pr.addFeatures([f])
307+
308+
uri = '{} table="qgis_test"."sacrificalLamb" sql='.format(self.dbconn)
309+
new_layer = QgsVectorLayer(uri, 'new', 'mssql')
310+
self.assertTrue(new_layer.isValid())
311+
self.assertEqual([f.attributes() for f in new_layer.getFeatures()], [[1]])
312+
313+
# try to overwrite
314+
error, message = QgsVectorLayerExporter.exportLayer(layer, uri, 'mssql', QgsCoordinateReferenceSystem())
315+
self.assertEqual(error, QgsVectorLayerExporter.ErrCreateLayer)
316+
317+
# should not have overwritten features
318+
self.assertEqual([f.attributes() for f in new_layer.getFeatures()], [[1]])
319+
301320
def testMultiGeomColumns(self):
302321
uri = '{} table="qgis_test"."multiGeomColumns" (geom1) sql='.format(self.dbconn)
303322
new_layer = QgsVectorLayer(uri, 'new', 'mssql')

tests/testdata/provider/testdata_mssql.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ GO
2525
DROP TABLE IF EXISTS qgis_test.[multiGeomColumns];
2626
GO
2727

28+
DROP TABLE IF EXISTS qgis_test.[sacrificalLamb];
29+
GO
30+
2831
DROP SCHEMA qgis_test;
2932
GO
3033

@@ -69,6 +72,11 @@ CREATE TABLE qgis_test.[multiGeomColumns] (
6972
);
7073
GO
7174

75+
CREATE TABLE qgis_test.[sacrificalLamb] (
76+
pk integer PRIMARY KEY
77+
);
78+
GO
79+
7280
INSERT INTO qgis_test.[someData] (pk, cnt, name, name2, num_char, geom) VALUES
7381
(5, -200, NULL, 'NuLl', '5', geometry::STGeomFromText( 'Point(-71.123 78.23)', 4326 )),
7482
(3, 300, 'Pear', 'PEaR', '3', NULL),
@@ -93,6 +101,10 @@ INSERT INTO qgis_test.[float_dec] (id, float_field, dec_field ) VALUES
93101
(1, 1.1111111111, 1.123 );
94102
GO
95103

104+
INSERT INTO qgis_test.[sacrificalLamb] (pk) VALUES
105+
(1);
106+
GO
107+
96108
INSERT INTO qgis_test.[multiGeomColumns] (pk, geom1, geom2) VALUES
97109
(5, geometry::STGeomFromText( 'Point( 1 2 )', 4326 ), NULL),
98110
(3, NULL, geometry::STGeomFromText( 'LineString( 1 2, 3 4 )', 4326 )),

0 commit comments

Comments
 (0)