diff --git a/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx b/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx
index 4dd2dd93aff682dcc0cf31e14790668f475faeba..d71083400a29d52bbb2ab0fd1740e5f7e8effd3b 100644
--- a/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx
@@ -7,6 +7,9 @@ import LoadingSpinner from "metabase/components/LoadingSpinner";
 import { delay } from "metabase/lib/promise";
 import { CardApi } from "metabase/services";
 
+import Databases from "metabase/entities/databases";
+
+import Database from "metabase-lib/lib/metadata/Database";
 import Question from "metabase-lib/lib/Question";
 
 import { SpinnerContainer } from "./ModelCacheControl.styled";
@@ -17,6 +20,10 @@ interface ModelCacheControlProps {
   onChange?: (isPersisted: boolean) => void;
 }
 
+type DatabaseEntityLoaderProps = {
+  database?: Database;
+};
+
 function ModelCacheControl({
   model,
   size,
@@ -24,8 +31,7 @@ function ModelCacheControl({
   ...props
 }: ModelCacheControlProps) {
   const [isLoading, setLoading] = useState(false);
-  const isPersisted = model.isPersisted();
-  const tooltip = isPersisted ? t`Unpersist model` : t`Persist model`;
+  const label = model.isPersisted() ? t`Unpersist model` : t`Persist model`;
 
   const handleClick = useCallback(async () => {
     const id = model.id();
@@ -46,14 +52,28 @@ function ModelCacheControl({
     }
   }, [model, onChange]);
 
-  return isLoading ? (
-    <SpinnerContainer>
-      <LoadingSpinner size={size} />
-    </SpinnerContainer>
-  ) : (
-    <Button {...props} icon="database" onClick={handleClick} iconSize={size}>
-      {tooltip}
-    </Button>
+  return (
+    <Databases.Loader id={model.databaseId()} loadingAndErrorWrapper={false}>
+      {({ database }: DatabaseEntityLoaderProps) => {
+        if (!database || !database["can-manage"]) {
+          return null;
+        }
+        return isLoading ? (
+          <SpinnerContainer>
+            <LoadingSpinner size={size} />
+          </SpinnerContainer>
+        ) : (
+          <Button
+            {...props}
+            icon="database"
+            onClick={handleClick}
+            iconSize={size}
+          >
+            {label}
+          </Button>
+        );
+      }}
+    </Databases.Loader>
   );
 }
 
diff --git a/frontend/src/metabase-lib/lib/metadata/Database.ts b/frontend/src/metabase-lib/lib/metadata/Database.ts
index bc8cdcefa0c3984e99597ebd9414952acb7a93a9..78750947d02a5bfc781b3a683827f5e49a2ee43b 100644
--- a/frontend/src/metabase-lib/lib/metadata/Database.ts
+++ b/frontend/src/metabase-lib/lib/metadata/Database.ts
@@ -25,6 +25,9 @@ class DatabaseInner extends Base {
   schemas: Schema[];
   metadata: Metadata;
 
+  // Only appears in  GET /api/database/:id
+  "can-manage"?: boolean;
+
   // TODO Atte Keinänen 6/11/17: List all fields here (currently only in types/Database)
   displayName() {
     return this.name;
diff --git a/frontend/src/metabase-types/api/database.ts b/frontend/src/metabase-types/api/database.ts
index 0d81213986dc9206ae36e29c6d539fa509d01d9c..082798759e863efd5ffeb9d9902e5ce94ffa168c 100644
--- a/frontend/src/metabase-types/api/database.ts
+++ b/frontend/src/metabase-types/api/database.ts
@@ -15,4 +15,7 @@ export interface Database {
   timezone?: string;
   native_permissions: NativePermissions;
   initial_sync_status: InitialSyncStatus;
+
+  // Only appears in  GET /api/database/:id
+  "can-manage"?: boolean;
 }