Redshift external database not found

Hi,

Im using Metabase v0.39.2, trying to add an external redshift database (Spectrum) as a database, it works when i specify a normal database, but it says database not found if I specify an external database:
java.sql.SQLException: FATAL: database "external_db" does not exist

Does Metabase supporte external databases? am I missing something?

Thanks,
Sari

Hi @sari
Metabase has supported Redshift Spectrum since 0.36.3
But have you granted USAGE for the Metabase user to be able to access the database?

Hi @flamber,

I've already executed this if thats what you mean:

 grant USAGE ON SCHEMA external_db to metabase;

@sari When are you seeing the error? Can you include full stacktrace from Admin > Troubleshooting > Logs.
Are you getting the same error if you use another JDBC-based tool like DBeaver.io ? Important to use the same credentials of course.

It works and connects fine with the same credentials using the same redshift cluster but with an actual table.

I only get the error when trying to define a new database using an external table with the same settings, I fill out everything and when I click "Next" it says it there was an error net to the button and this is what I see in the logs:

576908c5-109b-4d20-8cc0-dcfa38d6423c] 2021-05-26T18:36:37+03:00 ERROR metabase.api.database Cannot connect to Database
java.lang.Exception: Looks like the database name is incorrect.
at metabase.driver.util$can_connect_with_details_QMARK_.invokeStatic(util.clj:39)
at metabase.driver.util$can_connect_with_details_QMARK_.doInvoke(util.clj:22)
at clojure.lang.RestFn.invoke(RestFn.java:442)
at metabase.api.database$test_database_connection.invokeStatic(database.clj:396)
at metabase.api.database$test_database_connection.doInvoke(database.clj:386)
at clojure.lang.RestFn.invoke(RestFn.java:425)
at metabase.api.database$fn__63801$test_connection_details__63806$fn__63807.invoke(database.clj:443)
at metabase.api.database$fn__63801$test_connection_details__63806.invoke(database.clj:425)
at metabase.api.database$fn__63836.invokeStatic(database.clj:492)
at metabase.api.database$fn__63836.invoke(database.clj:485)
at compojure.core$wrap_response$fn__1996.invoke(core.clj:160)
at compojure.core$wrap_route_middleware$fn__1980.invoke(core.clj:132)
at compojure.core$wrap_route_info$fn__1985.invoke(core.clj:139)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:151)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:153)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:152)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:152)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:152)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:153)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:152)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008.invoke(core.clj:200)
at metabase.server.middleware.auth$enforce_authentication$fn__75711.invoke(auth.clj:14)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008.invoke(core.clj:200)
at compojure.core$make_context$handler__2036.invoke(core.clj:287)
at compojure.core$make_context$fn__2038.invoke(core.clj:296)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$make_context$fn__2038.invoke(core.clj:297)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$make_context$fn__2038.invoke(core.clj:297)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$make_context$fn__2038.invoke(core.clj:297)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$make_context$fn__2038.invoke(core.clj:297)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$make_context$fn__2038.invoke(core.clj:297)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$make_context$fn__2038.invoke(core.clj:297)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at metabase.api.routes$fn__75833$fn__75835.invoke(routes.clj:70)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008.invoke(core.clj:200)
at clojure.lang.AFn.applyToHelper(AFn.java:160)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:665)
at clojure.core$apply.invoke(core.clj:660)
at metabase.server.routes$fn__78104$fn__78105.doInvoke(routes.clj:57)
at clojure.lang.RestFn.invoke(RestFn.java:436)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008.invoke(core.clj:200)
at compojure.core$make_context$handler__2036.invoke(core.clj:287)
at compojure.core$make_context$fn__2038.invoke(core.clj:296)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:153)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:153)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at compojure.core$wrap_route_matches$fn__1989.invoke(core.clj:153)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008$f__2009$respond_SINGLEQUOTE___2010.invoke(core.clj:197)
at metabase.server.routes$fn__78092$fn__78094.invoke(routes.clj:41)
at compojure.core$routes$fn__2008$f__2009.invoke(core.clj:198)
at compojure.core$routes$fn__2008.invoke(core.clj:200)
at metabase.server.middleware.exceptions$catch_uncaught_exceptions$fn__75824.invoke(exceptions.clj:98)
at metabase.server.middleware.exceptions$catch_api_exceptions$fn__75821.invoke(exceptions.clj:86)
at metabase.server.middleware.log$log_api_call$fn__78020$fn__78021.invoke(log.clj:195)
at toucan.db$do_with_call_counting.invokeStatic(db.clj:216)
at toucan.db$do_with_call_counting.invoke(db.clj:209)
at metabase.server.middleware.log$log_api_call$fn__78020.invoke(log.clj:189)
at metabase.server.middleware.browser_cookie$ensure_browser_id_cookie$fn__77656.invoke(browser_cookie.clj:30)
at metabase.server.middleware.security$add_security_headers$fn__75786.invoke(security.clj:142)
at metabase.server.middleware.json$wrap_json_body$fn__77801.invoke(json.clj:62)
at metabase.server.middleware.json$wrap_streamed_json_response$fn__77819.invoke(json.clj:98)
at ring.middleware.keyword_params$wrap_keyword_params$fn__78361.invoke(keyword_params.clj:55)
at ring.middleware.params$wrap_params$fn__78377.invoke(params.clj:69)
at metabase.server.middleware.misc$maybe_set_site_url$fn__35829.invoke(misc.clj:58)
at metabase.server.middleware.session$bind_current_user$fn__42529$fn__42530.invoke(session.clj:248)
at metabase.server.middleware.session$do_with_current_user.invokeStatic(session.clj:229)
at metabase.server.middleware.session$do_with_current_user.invoke(session.clj:221)
at metabase.server.middleware.session$bind_current_user$fn__42529.invoke(session.clj:247)
at metabase.server.middleware.session$wrap_current_user_info$fn__42516.invoke(session.clj:207)
at metabase.server.middleware.session$wrap_session_id$fn__42502.invoke(session.clj:153)
at metabase.server.middleware.auth$wrap_api_key$fn__75719.invoke(auth.clj:27)
at ring.middleware.cookies$wrap_cookies$fn__78281.invoke(cookies.clj:216)
at metabase.server.middleware.misc$add_content_type$fn__35812.invoke(misc.clj:27)
at metabase.server.middleware.misc$disable_streaming_buffering$fn__35837.invoke(misc.clj:75)
at ring.middleware.gzip$wrap_gzip$fn__78323.invoke(gzip.clj:86)
at metabase.server.middleware.misc$bind_request$fn__35840.invoke(misc.clj:92)
at metabase.server.middleware.ssl$redirect_to_https_middleware$fn__78037.invoke(ssl.clj:38)
at metabase.server$async_proxy_handler$fn__77600.invoke(server.clj:71)
at metabase.server.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:556)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:773)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:905)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.sql.SQLException: FATAL: database "external_db" does not exist
at com.amazon.redshift.util.RedshiftException.getSQLException(RedshiftException.java:48)
at com.amazon.redshift.Driver.connect(Driver.java:293)
at metabase.plugins.jdbc_proxy$proxy_driver$reify__77320.connect(jdbc_proxy.clj:33)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
at clojure.java.jdbc$get_driver_connection.invokeStatic(jdbc.clj:271)
at clojure.java.jdbc$get_driver_connection.invoke(jdbc.clj:250)
at clojure.java.jdbc$get_connection.invokeStatic(jdbc.clj:411)
at clojure.java.jdbc$get_connection.invoke(jdbc.clj:274)
at clojure.java.jdbc$db_query_with_resultset_STAR
.invokeStatic(jdbc.clj:1111)
at clojure.java.jdbc$db_query_with_resultset_STAR
.invoke(jdbc.clj:1093)
at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182)
at clojure.java.jdbc$query.invoke(jdbc.clj:1144)
at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1160)
at clojure.java.jdbc$query.invoke(jdbc.clj:1144)
at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invokeStatic(connection.clj:199)
at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invoke(connection.clj:196)
at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invokeStatic(connection.clj:207)
at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invoke(connection.clj:203)
at metabase.driver.sql_jdbc$fn__80977.invokeStatic(sql_jdbc.clj:35)
at metabase.driver.sql_jdbc$fn__80977.invoke(sql_jdbc.clj:33)
at clojure.lang.MultiFn.invoke(MultiFn.java:234)
at metabase.driver.util$can_connect_with_details_QMARK_$fn__29688.invoke(util.clj:34)
at metabase.util$do_with_timeout$fn__15624.invoke(util.clj:346)
at clojure.core$binding_conveyor_fn$fn__5754.invoke(core.clj:2030)
at clojure.lang.AFn.call(AFn.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
... 1 more

@sari Okay, I don't think I understand what you're trying to do, so open an issue and provide details on how to reproduce. https://github.com/metabase/metabase/issues/new/choose