Когда мне приходилось иметь дело с резервными копиями реляционных данных в прошлом (в MySQL, который не сильно отличается по возможностям от выполняемого вами MSSQL), нужно было создать резервный файл «пакета», который по сути, это zip-файл с другим расширением, чтобы окна не позволяли пользователям открывать его.
Если вы действительно хотите стать модным, зашифруйте файл после его архивирования и измените расширение. Я предполагаю, что вы используете ASP для своего SaaS, и, поскольку я - фанат PHP, я не могу особо помочь со стороны кода, но способ, которым я раньше занимался, был для сценария, который бы упаковывал весь сайт Joomla и база данных для миграции на новый сервер.
//open the MySQL connection
$dbc = mysql_connect($cfg->host,$cfg->user,$cfg->password);
//select the database
mysql_select_db($cfg->db,$dbc);
output( 'Getting database tables
');
//get all the tables in the database
$tables = array();
$result = mysql_query('SHOW TABLES',$dbc);
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
output( 'Found '.count($tables).' tables to be migrated.
Exporting tables:
');
$return = "";
//cycle through the tables and get their create statements and data
foreach($tables as $table) {
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);
$return.= 'DROP TABLE IF EXISTS '.$table.";\n";
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= $row2[1].";\n";
while($row = mysql_fetch_row($result)) {
$return.= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$num_fields; $j++) {
$row[$j] = mysql_escape_string($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (!empty($row[$j])) {
$return.= "'".$row[$j]."'" ;
} else {
$return.= "NULL";
}
if ($j<($num_fields-1)) {
$return.= ',';
}
}
$return.= ");\n";
}
}
Это релевантная часть кода в PHP, которая зацикливает структуру базы данных и сохраняет сценарий восстановления в $ result, который затем может быть выведен в файл.
В вашем случае вы не хотите воссоздавать базы данных, а сами данные. Вы немного усугубили проблему, поскольку у вас есть SaaS, который подвержен возможным изменениям структуры данных, которые вы должны учитывать. Мое предложение будет следующим:
Используйте систему, аналогичную описанной выше, для выгрузки соответствующих данных из отдельных таблиц. Я просто извлекаю все данные, но вы можете извлекать только те части, которые относятся к отдельному пользователю, используя операторы JOIN и еще много чего. Сбросьте содержимое каждого оператора вставки / замены таблицы в файл с именем таблицы. Создайте файл с именем manifest.xml или что-то в этом роде и заполните его текущей версией приложения SaaS, именем / информацией, уникальным идентификатором и т. Д. Клиента, экспортирующего данные.
Упакуйте все эти файлы в ZIP-файл, измените расширение на любое другое, зашифруйте его, если хотите, и т. Д. Пусть загрузят этот файл резервной копии, и все готово.
В вашем скрипте импорта вам нужно будет прочитать номер версии экспортируемых данных и сравнить его с каким-либо алгоритмом, который может обрабатывать переназначение данных на основе изменений, которые вы сделаете позже. Таким образом, если вам потребуется повторно импортировать одну из их резервных копий позже, вы можете правильно обработать переход данных с момента, когда они извлекли резервную копию, к текущей структуре данных в этой таблице.
Надеюсь, это поможет;)