diff --git a/doc/v3-migration-guide.md b/doc/v3-migration-guide.md
index 9ac6298d27609..9cfa5c05c00fb 100644
--- a/doc/v3-migration-guide.md
+++ b/doc/v3-migration-guide.md
@@ -46,6 +46,64 @@ module which can be added to your `MODULE.bazel` file as a dependency.
### Bigtable
+
+Removed bigtable::RowReader constructors
+
+
+The `bigtable::RowReader` constructors that accept `DataClient` as an argument
+have been removed.
+
+Developers that read rows by directly constructing a `RowReader` object should
+instead construct a `Table` object and call `Table::ReadRows(...)`.
+
+For example, code that used to look like this:
+
+**Before:**
+
+```cpp
+#include "google/cloud/bigtable/data_client.h"
+#include "google/cloud/bigtable/row_reader.h"
+#include "google/cloud/bigtable/table.h"
+
+// ...
+
+auto client = google::cloud::bigtable::MakeDataClient(
+ "my-project", "my-instance", creds);
+auto reader = google::cloud::bigtable::RowReader(
+ client, "my-table-id", google::cloud::bigtable::RowSet("r1", "r2"),
+ google::cloud::bigtable::RowReader::NO_ROWS_LIMIT,
+ google::cloud::bigtable::Filter::PassAllFilter(),
+ /*...retry and backoff policies...*/);
+
+for (auto& row : reader) {
+ if (!row) throw std::move(row).status();
+ // ...
+}
+```
+
+Should be changed to this:
+
+**After:**
+
+```cpp
+#include "google/cloud/bigtable/table.h"
+
+// ...
+
+namespace cbt = google::cloud::bigtable;
+cbt::Table table(cbt::MakeDataConnection(),
+ cbt::TableResource("my-project", "my-instance", "my-table-id"));
+
+for (auto& row : table.ReadRows(
+ cbt::RowSet("r1", "r2"),
+ cbt::Filter::PassAllFilter())) {
+ if (!row) throw std::move(row).status();
+ // ...
+}
+```
+
+
+
### Pubsub
### Spanner
diff --git a/google/cloud/bigtable/row_reader.cc b/google/cloud/bigtable/row_reader.cc
index 3efcf408cdfb0..66d7889201e30 100644
--- a/google/cloud/bigtable/row_reader.cc
+++ b/google/cloud/bigtable/row_reader.cc
@@ -65,32 +65,6 @@ RowReader::RowReader()
: RowReader(
std::make_shared(Status{})) {}
-RowReader::RowReader(
- std::shared_ptr client, std::string table_name, RowSet row_set,
- std::int64_t rows_limit, Filter filter,
- std::unique_ptr retry_policy,
- std::unique_ptr backoff_policy,
- MetadataUpdatePolicy metadata_update_policy,
- std::unique_ptr parser_factory)
- : RowReader(std::make_shared(
- std::move(client), std::move(table_name), std::move(row_set),
- rows_limit, std::move(filter), std::move(retry_policy),
- std::move(backoff_policy), std::move(metadata_update_policy),
- std::move(parser_factory))) {}
-
-RowReader::RowReader(
- std::shared_ptr client, std::string app_profile_id,
- std::string table_name, RowSet row_set, std::int64_t rows_limit,
- Filter filter, std::unique_ptr retry_policy,
- std::unique_ptr backoff_policy,
- MetadataUpdatePolicy metadata_update_policy,
- std::unique_ptr parser_factory)
- : RowReader(std::make_shared(
- std::move(client), std::move(app_profile_id), std::move(table_name),
- std::move(row_set), rows_limit, std::move(filter),
- std::move(retry_policy), std::move(backoff_policy),
- std::move(metadata_update_policy), std::move(parser_factory))) {}
-
std::int64_t constexpr RowReader::NO_ROWS_LIMIT;
// The name must be all lowercase to work with range-for loops.
diff --git a/google/cloud/bigtable/row_reader.h b/google/cloud/bigtable/row_reader.h
index 11ba0d202eba9..ea33b8ee8ff76 100644
--- a/google/cloud/bigtable/row_reader.h
+++ b/google/cloud/bigtable/row_reader.h
@@ -65,22 +65,6 @@ class RowReader {
/// Default constructs an empty RowReader.
RowReader();
- GOOGLE_CLOUD_CPP_BIGTABLE_ROW_READER_CTOR_DEPRECATED()
- RowReader(std::shared_ptr client, std::string table_name,
- RowSet row_set, std::int64_t rows_limit, Filter filter,
- std::unique_ptr retry_policy,
- std::unique_ptr backoff_policy,
- MetadataUpdatePolicy metadata_update_policy,
- std::unique_ptr parser_factory);
-
- GOOGLE_CLOUD_CPP_BIGTABLE_ROW_READER_CTOR_DEPRECATED()
- RowReader(std::shared_ptr client, std::string app_profile_id,
- std::string table_name, RowSet row_set, std::int64_t rows_limit,
- Filter filter, std::unique_ptr retry_policy,
- std::unique_ptr backoff_policy,
- MetadataUpdatePolicy metadata_update_policy,
- std::unique_ptr parser_factory);
-
// NOLINTNEXTLINE(performance-noexcept-move-constructor)
RowReader(RowReader&&) = default;