{"record":{"id":"5dc612e6b28f2d4e","repo":"googleapis/mcp-toolbox","slug":"failed-to-delete-logical-view-w","errorCode":null,"errorMessage":"failed to delete logical view: %w","messagePattern":"failed to delete logical view: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/bigtable/admin_wrappers.go","lineNumber":232,"sourceCode":"\treturn map[string]string{\"status\": \"logical view created successfully\"}, nil\n}\n\nfunc (s *Source) UpdateLogicalView(ctx context.Context, instanceId, logicalViewId, query string) (any, error) {\n\tconf := bigtable.LogicalViewInfo{ // MUST be value per bigtable SDK\n\t\tLogicalViewID: logicalViewId,\n\t\tQuery:         query,\n\t}\n\terr := s.InstanceAdmin.UpdateLogicalView(ctx, instanceId, conf)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to update logical view: %w\", err)\n\t}\n\treturn map[string]string{\"status\": \"logical view updated successfully\"}, nil\n}\n\nfunc (s *Source) DeleteLogicalView(ctx context.Context, instanceId, logicalViewId string) (any, error) {\n\terr := s.InstanceAdmin.DeleteLogicalView(ctx, instanceId, logicalViewId)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to delete logical view: %w\", err)\n\t}\n\treturn map[string]string{\"status\": \"logical view deleted successfully\"}, nil\n}\n\nfunc (s *Source) GetMaterializedView(ctx context.Context, instanceId, materializedViewId string) (any, error) {\n\tview, err := s.InstanceAdmin.MaterializedViewInfo(ctx, instanceId, materializedViewId)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get materialized view: %w\", err)\n\t}\n\treturn view, nil\n}\n\nfunc (s *Source) CreateMaterializedView(ctx context.Context, instanceId, materializedViewId, query string) (any, error) {\n\tconf := &bigtable.MaterializedViewInfo{\n\t\tMaterializedViewID: materializedViewId,\n\t\tQuery:              query,\n\t}\n\terr := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/bigtable/admin_wrappers.go#L214-L250","documentation":"DeleteLogicalView wraps errors from InstanceAdmin.DeleteLogicalView. Deletion fails if the logical view does not exist (NotFound), permissions are missing, or a transient gRPC error occurs. The raw API error is preserved via %w.","triggerScenarios":"Calling DeleteLogicalView (bigtable_delete_logical_view tool) when: logicalViewId was already deleted or never existed, caller lacks bigtable.views.delete permission, or the InstanceAdmin RPC fails due to network/timeout.","commonSituations":"Double-delete in cleanup scripts expecting idempotency; deleting a logical view that was actually a materialized view (wrong ID type); IAM changes; regional API outage.","solutions":["Treat codes.NotFound as success (idempotent delete) using errors.As/status.FromError on the wrapped error","Confirm the correct ID type: logical views and materialized views live in separate namespaces","Grant roles/bigtable.admin or bigtable.views.delete to the caller","Retry on Unavailable/DeadlineExceeded transient codes"],"exampleFix":"// before: non-idempotent delete breaks cleanup scripts\nerr := s.InstanceAdmin.DeleteLogicalView(ctx, instanceId, id)\nif err != nil { return nil, fmt.Errorf(\"failed to delete logical view: %w\", err) }\n// after: tolerate already-deleted\nerr := s.InstanceAdmin.DeleteLogicalView(ctx, instanceId, id)\nif err != nil {\n    if st, ok := status.FromError(err); ok && st.Code() == codes.NotFound {\n        return map[string]string{\"status\": \"logical view already deleted\"}, nil\n    }\n    return nil, fmt.Errorf(\"failed to delete logical view: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":"views, err := src.ListLogicalViews(ctx, instanceId)\nif err != nil { return err }\nif !containsViewID(views, viewId) {\n    return nil // nothing to delete; treat as success\n}","typeGuard":"func isNotFound(err error) bool {\n    st, ok := status.FromError(errors.Unwrap(err))\n    return ok && st.Code() == codes.NotFound\n}","tryCatchPattern":"res, err := src.DeleteLogicalView(ctx, instanceId, viewId)\nswitch {\ncase err == nil:\n    // deleted\ncase isNotFound(err):\n    // already gone: treat as success (idempotent delete)\ndefault:\n    return err\n}","preventionTips":["Write delete/cleanup scripts to treat NotFound as success so reruns are idempotent","Don't mix logical-view and materialized-view IDs — they are separate namespaces","Verify the view still exists if another process may have deleted it","Retry transient codes (Unavailable, DeadlineExceeded) with backoff"],"tags":["gcp","bigtable","admin-api","permissions"],"backgroundTag":"gcp-api-error","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}