Skip to content

Commit

Permalink
fix: cannot delete a database if team member has SQL editor tab that …
Browse files Browse the repository at this point in the history
…uses that db (#19243)

* fix: update sql lab models constraints to support db deletion

* update with master

* solve db migration conflict

* fix tests
  • Loading branch information
diegomedina248 committed Apr 6, 2022
1 parent 73e9391 commit 350f21d
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""sql_lab_models_database_constraint_updates
Revision ID: 8b841273bec3
Revises: 2ed890b36b94
Create Date: 2022-03-16 21:07:48.768425
"""

# revision identifiers, used by Alembic.
revision = "8b841273bec3"
down_revision = "2ed890b36b94"

import sqlalchemy as sa
from alembic import op

from superset.utils.core import generic_find_fk_constraint_name


def upgrade():
bind = op.get_bind()
insp = sa.engine.reflection.Inspector.from_engine(bind)

with op.batch_alter_table("tab_state") as batch_op:
table_schema_id_constraint = generic_find_fk_constraint_name(
"tab_state", {"id"}, "dbs", insp
)
if table_schema_id_constraint:
batch_op.drop_constraint(
table_schema_id_constraint,
type_="foreignkey",
)

table_schema_id_constraint = generic_find_fk_constraint_name(
"tab_state", {"client_id"}, "query", insp
)
if table_schema_id_constraint:
batch_op.drop_constraint(
table_schema_id_constraint,
type_="foreignkey",
)

batch_op.create_foreign_key(
"tab_state_database_id_fkey",
"dbs",
["database_id"],
["id"],
ondelete="CASCADE",
)

batch_op.create_foreign_key(
"tab_state_latest_query_id_fkey",
"query",
["latest_query_id"],
["client_id"],
ondelete="SET NULL",
)

with op.batch_alter_table("table_schema") as batch_op:
table_schema_id_constraint = generic_find_fk_constraint_name(
"table_schema", {"id"}, "dbs", insp
)
if table_schema_id_constraint:
batch_op.drop_constraint(
table_schema_id_constraint,
type_="foreignkey",
)

batch_op.create_foreign_key(
"table_schema_database_id_fkey",
"dbs",
["database_id"],
["id"],
ondelete="CASCADE",
)


def downgrade():
bind = op.get_bind()
insp = sa.engine.reflection.Inspector.from_engine(bind)

with op.batch_alter_table("tab_state") as batch_op:
table_schema_id_constraint = generic_find_fk_constraint_name(
"tab_state", {"id"}, "dbs", insp
)
if table_schema_id_constraint:
batch_op.drop_constraint(
table_schema_id_constraint,
type_="foreignkey",
)

table_schema_id_constraint = generic_find_fk_constraint_name(
"tab_state", {"client_id"}, "query", insp
)
if table_schema_id_constraint:
batch_op.drop_constraint(
table_schema_id_constraint,
type_="foreignkey",
)

batch_op.create_foreign_key(
"tab_state_database_id_fkey", "dbs", ["database_id"], ["id"]
)
batch_op.create_foreign_key(
"tab_state_latest_query_id_fkey",
"query",
["latest_query_id"],
["client_id"],
)

with op.batch_alter_table("table_schema") as batch_op:
table_schema_id_constraint = generic_find_fk_constraint_name(
"table_schema", {"id"}, "dbs", insp
)
if table_schema_id_constraint:
batch_op.drop_constraint(
table_schema_id_constraint,
type_="foreignkey",
)

batch_op.create_foreign_key(
"table_schema_database_id_fkey", "dbs", ["database_id"], ["id"]
)
10 changes: 7 additions & 3 deletions superset/models/sql_lab.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ class TabState(Model, AuditMixinNullable, ExtraJSONMixin):
active = Column(Boolean, default=False)

# selected DB and schema
database_id = Column(Integer, ForeignKey("dbs.id"))
database_id = Column(Integer, ForeignKey("dbs.id", ondelete="CASCADE"))
database = relationship("Database", foreign_keys=[database_id])
schema = Column(String(256))

Expand All @@ -282,7 +282,9 @@ class TabState(Model, AuditMixinNullable, ExtraJSONMixin):
query_limit = Column(Integer)

# latest query that was run
latest_query_id = Column(Integer, ForeignKey("query.client_id"))
latest_query_id = Column(
Integer, ForeignKey("query.client_id", ondelete="SET NULL")
)
latest_query = relationship("Query")

# other properties
Expand Down Expand Up @@ -322,7 +324,9 @@ class TableSchema(Model, AuditMixinNullable, ExtraJSONMixin):
id = Column(Integer, primary_key=True, autoincrement=True)
tab_state_id = Column(Integer, ForeignKey("tab_state.id", ondelete="CASCADE"))

database_id = Column(Integer, ForeignKey("dbs.id"), nullable=False)
database_id = Column(
Integer, ForeignKey("dbs.id", ondelete="CASCADE"), nullable=False
)
database = relationship("Database", foreign_keys=[database_id])
schema = Column(String(256))
table = Column(String(256))
Expand Down

0 comments on commit 350f21d

Please sign in to comment.