Как использовать MS Sync Framework для фильтрации специфичных для клиента данных? - PullRequest
2 голосов
/ 06 января 2011

Допустим, у меня есть таблица базы данных SQL 2008 с множеством записей, связанных с двумя разными клиентами, клиентом A и клиентом B.

Я хотел бы создать полнофункциональное клиентское приложение, которое извлекает все записи, относящиеся либо к клиенту A , либо к клиенту B на основе учетных данных запрашивающего пользователя, а затем сохраняет извлеченные записи в временная локальная таблица.

Подумав, что для этого можно использовать MS Sync Framework, я начал читать о фильтрации строк, когда наткнулся на этот маленький каштан:

Не полагайтесь на фильтрацию для безопасности. Возможность фильтрации данных из сервер на основе идентификатора клиента или пользователя не функция безопасности. В других словами, этот подход не может быть использован для запретить одному клиенту читать данные это принадлежит другому клиенту. это Тип фильтрации полезен только для разделение данных и уменьшение количество данных, которые сводятся к клиентская база.

Итак, это говорит мне о том, что MS Sync Framework является хорошим вариантом, если вы хотите скопировать всю таблицу между точкой A и точкой B?

Не кажется ли это чрезвычайно ограничивающей характеристикой каркаса? Или я просто неверно истолковываю это утверждение? Или есть какой-то другой способ использования фреймворка для достижения моих целей?

Идеи кому-нибудь?

Спасибо!

1 Ответ

1 голос
/ 06 января 2011

Нет, это только предупреждение безопасности.

Мы широко используем фильтрацию в нашем полуподключенном приложении.

Вот код, с которого можно начать:

//helper
void PrepareFilter(string tablename, string filter)
{
  SyncAdapters.Remove(tablename);

  var ab = new SqlSyncAdapterBuilder(this.Connection as SqlConnection);
  ab.TableName = "dbo." + tablename;
  ab.ChangeTrackingType = ChangeTrackingType.SqlServerChangeTracking;
  ab.FilterClause = filter;
  var cpar = new SqlParameter("@filterid", SqlDbType.UniqueIdentifier);
  cpar.IsNullable = true;
  cpar.Value = DBNull.Value;
  ab.FilterParameters.Add(cpar);

  var nsa = ab.ToSyncAdapter();
  nsa.TableName = tablename;

  SyncAdapters.Add(nsa);
}

// usage
void SetupFooBar()
{
  var tablename = "FooBar";
  var filter = "FooId IN (SELECT BarId FROM dbo.GetAllFooBars(@filterid))";

  PrepareFilter(tablename, filter);
}
...