Metrika

28 апреля 2011 г.

Разбиение отчета в SSRS на страницы через параметр отчета

При выводе отчета в Web SSRS автоматически разбивает его на страницы, но есть возможность управлять этим процессом через параметр отчета. Все нижеследующее относиться к SQL Server 2008 R2. Я раньше делал это на SQL Server 2005 таким же способом, но какие то детали могут отличаться.

Для того, что бы разбить отчет на страницы через параметр, надо создать параметр типа Int, в моем случае он будет означать количество строк на станице. Далее создаем группу и в значение группировки вставляем выражение:
=Ceiling(RowNumber(Nothing)/Parameters!rows_per_page.Value)
В таблицу добавиться поле, что бы оно не мешалось, я делаю его ширину нулевой.

Далее, в свойствах группы, в разделе Page Breaks ставим галку Between each instance of a group. После этого я запустил отчет и он мне выдал ошибку, суть которой в том, что у таблицы выражение сортировки использует функцию RowNumber, а такого не может быть. После некоторых попыток избавиться от этого пришел к такому решению - для таблицы и для группы (на всякий случай) установил значения сортировки на первом попавшемся поле, а потом сбросил эти значения. Видимо при создании группы, выражение группировки автоматом попало в выражение сортировки (Мелкомягким привет!). 

Далее на кнопке строки отчета, которая появляется слева от самой таблицы при попадании таблицы в фокус ввода, тыкаем правой кнопкой и выбираем пункт Tablix Properties. На вкладке General нужно поставить галку Keep together on one page if possible, иначе могут появиться странности, например у меня при значении 50 строк на страницу выдавало каждые несколько страниц по 3-4 записи. Видимо автоматическое разбиение на страницы создается  без учета других разбиений.

Единственное чего я не смог сделать, так это оставить названия колонок на каждой странице. В окне Tablix Properties есть галка Repeat header rows on each page, но что-то ее установка ни к чему не привела.

К стати, здесь про разбиение на странице кратко написано: http://msdn.microsoft.com/en-us/library/ms157328.aspx , раздел Page Breaks.

Значок "замка" на папке или файле в Windows Server 2008 R2

Иногда в Windows Server 2008 R2, а так же в Windows 7, можно увидеть в эксплорере значок "замка" на папке или файле. Это знак того, что к папке (файлу) ограничен доступ пользователей, т.е. можо разрешить доступ, например, только себе. С одной стороны штука полезная, но с другой, может и напрячь, особенно если о ней не знать.
Я хотел к SQL Server приаттачить базу, которая лежала в папке с таким ограничением и SQL Server просто не видел файл внутри папки. Решение оказалось простым, надо было дать доступ к папке и самому файлу пользователю, из под которого был запущен SQL Server. В моем случае NETWORK SERVICE.
Как так получилось, что на папке оказался "замок", точно не знаю, я деаттачил базу, потом хотел расшарить папку для того, что бы перелить файл на другой сервер. Потом шару снял и появился замок и обратно приаттачить базу не вышло :))

1 апреля 2011 г.

Проверка правильности JSON

Вот здесь: http://json.org/ внизу страницы перечислены различные утилиты для работы с JSON. Мне понравилась утилита проверки правильности JSON-кода написанная на C#: JSON_checker.

Кстати, о том, зачем я начал проверять JSON. Сначала я использовал в проекте www.asvix.ru jQuery 1.3.2 и когда я делал вызов метода:
$.getJSON(url, callback);
То callback-функция нормально вызывалась после получения ответа с сервера. У меня с сервера возвращался не очень корректный ответ в виде JSON, примерно такой: {x:"50",y:"100"}.
После перехода на jQuery 1.5 колбэки перестали работать, т.е. сама callback-функция работала, если ее вызвать на прямую, но из getJSON она не вызывалась. Проблема оказалась в том, что JSON был некорректен. Исправил на сервере, что бы возвращало правильно: {"x":"50","y":"100"} и все заработало.

31 марта 2011 г.

Редирект 301 (Moved Permanently) в IIS 7

Поисковые машины считают, что сайты http://site.ru и http://www.site.ru являются разными сайтами. Поэтому, если оба этих URL ведут на один и тот же контент, поисковая машина может понижать ваш сайт в результатах выдачи за дублирущийся контент. Чтобы такого не произошло, нужно в файле robots.txt указать строку:
Host: www.site.ru
В которой указывается основное доменное имя (все равно какое выбрать с www или без него, дело вкуса). А со второго имени нужно сделать редирект с кодом 301 на основное доменное имя.
В IIS 7 редирект можно сделать несколькими способами, правда не все подходят для этого случая.
1. Самый простой способ сделать редирект - это выделить в IIS в папке Sites необходимый домен и в основной панели два раза тыкнуть HTTP Redirect. В открывшемся окне установить галку Redirect requests to this destination и указать необходимый URL, ниже в выпадающем списке выбрать код редиректа 301 и в меню справа тыкнуть Apply. Подробнее и с картинками можно почитать тут: http://www.trainsignaltraining.com/windows-server-2008-http-redirection .
Этот способ для рассматриваемого случая не подходит, т.к. он предполагает наличие двух разных сайтов на одном сервере или редирект с одного сервера на другой.

2. Второй способ: установить дополнительный модуль для ASP.NET URL Rewrite Module 2.0, а далее прописать правила редиректа в Web.Config:
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Redirect to WWW" stopProcessing="true">
          <match url=".*" />
          <conditions>
            <add input="{HTTP_HOST}" pattern="^site.ru$" />
          </conditions>
          <action type="Redirect" url="http://www.site.ru/{R:0}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

3. Третий способ в Global.asax добавить метод  Application_BeginRequest со следующим содержанием:
    void Application_BeginRequest(object sender, EventArgs e)
    {
        string req_domain = HttpContext.Current.Request.Url.ToString().ToLower();

        if (req_domain.Contains("http://site.ru"))
        {
            req_domain = req_domain.Replace("http://site.ru", "http://www.site.ru");
           
            Response.Clear();
            Response.StatusCode = 301;
            Response.AddHeader("Location", req_domain);
            Response.End();
        }
    }


18 марта 2011 г.

Взаимодействие с OLAP кубами (SSAS 2008) на C#

Работу с данными рассматривать не буду, потому что сам еще не пробовал.
Для того, что бы работать с кубами из кода необходимо скачать библиотеку ADOMD.NET. Забирать надо ADOMD.NET.msi. Установить ее. Далее, в VS добавить ее в проект (на иконке проекта тыкаем правой кнопкой и выбираем Add Reference...). Я работал на VS 2010 и после установки библиотеки я ее не нашел на вкладке .NET окна Add Reference, поэтому пошел на вкладку Browse и добавил ее руками. Выбирать надо вот этот файл C:\Program Files\Microsoft.NET\Adomd.NET\80\Microsoft.AnalysisServices.AdomdClient.dll.
Классы, необходимые для соединения к кубам и отправки им команд, находятся в пространстве имен Microsoft.AnalysisServices.AdomdClient.
Соединиться с БД (имеется в виду БД кубов) и выполнить команду можно следующим образом:

            AdomdConnection cnn = null;
            try
            {
                cnn = new AdomdConnection("Provider=MSOLAP;  DataSource=server_ip_or_name;Initial Catalog=db_name");
                cnn.Open();

                AdomdCommand cmd = cnn.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = command;

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                 // Обработка ошибки
            }
            finally
            {
                cnn.Close();
            }
Как я писал выше, я не пробовал еще работать с данными кубов из кода, но таким кодом точно можно отпроцессить куб, разбить меру на партиции и т.п. Соответствующая команда в формате XMLA подставляется вместо переменной command. Опять же, я пока не разбирался можно ли туда передать MDX и как работать с ответом.
Небольшой хинт: для того, что б написать команду к кубу для какой-либо операции, не обязательно напрягать голову, т.к. в Management Studio можно сгенерить скрипт команды. Например, что бы сгенерить команду для процессинга куба необходимо на кубе тыкнуть правой кнопкой, далее Porcess и в открывшемся окне нажать кнопку Script, она будет вверху. Скрипт сгенериться в новое окно запроса. Так же можно сгенерить скрипт для команды Merge для партиций меры. Так же, для элементов куба можно сгенерить команды CREATE, ALTER и DELETE. У кубов, партиций и измерений есть пункт в меню Script cube as, Script partition as, Script dimension as.

14 марта 2011 г.

PostgreSQL: как посмотреть список таблиц

В PostgreSQL список таблиц можно посмотреть запросом:
select * from information_schema.tables
Список колонок:
select * from information_schema.columns
В общем, так же как и в MS SQL Server

10 марта 2011 г.

Как указать IIS 7 какой IP слушать

Если у вас стоит IIS 7, у вас есть несколько IP, то IIS будет слушать их все на 80 порту. Если необходимо установить еще один веб-сервер на один из IP на 80 порт, нужно указать IIS 7, какой IP слушать ему. Делается это с помощью утилиты Netsh, которая входит в поставку Windows:
netsh http add iplisten ipaddress=xxx.xxx.xxx.xxx
Решение нашел тут: http://serverfault.com/questions/148439/how-can-i-control-which-ip-address-iis7-uses

5 марта 2011 г.

Ухаживаем за индексами в SQL Server

Периодически индексы надо ребилдить или реорганизовывать. Выбор, что применять, делается по проценту фрагментации индекса.

Посмотреть процент фрагментации индексов в базе данных можно с помощью запроса:
use DB_NAME 


SELECT ps.database_id, ps.OBJECT_ID, o.name table_name,
ps.index_id, b.name,
ps.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS ps
INNER JOIN sys.indexes AS b ON ps.OBJECT_ID = b.OBJECT_ID
INNER JOIN sys.objects o ON b.OBJECT_ID = o.OBJECT_ID
AND ps.index_id = b.index_id
WHERE ps.database_id = DB_ID()
ORDER BY ps.avg_fragmentation_in_percent desc
 Если фрагментация больше 30%, то ребилдим:
ALTER INDEX ALL ON table_name REBUILD
Эта команда ребилдит все индексы в таблице. Вместо ALL можно поставить имя индекса, тогда ребилдиться будет только он.

Если фрагментация 5%-30%, то реорганизуем:
ALTER INDEX ALL ON table_name REORGANIZE
Естественно, проценты не жесткие, все зависит от ситуации и собственного мнения DBA.

В первоисточнике можно почитать тут: http://msdn.microsoft.com/en-us/library/ms189858.aspx

4 марта 2011 г.

Очистка лога с помощью SHRINKDATABASE в SQL Server 2008

В SQL Server 2008 используется несколько моделей восстановления (Recovery Models) для баз данных:
  1. Simple - в логе минимум информации, можно восстанавливаться из полного или инкрементального бэкапа, но нельзя восстановиться в состояние на определенный момент времени;
  2. Full - можно восстановиться в состояние на определенный момент времени;
  3. Bulk-logged - в этом типе операции с большими массивами данных (Bulk) логируются в минимальном размере, в отличии от Full recovery model.
Подробнее можно почитать тут:  http://databases.about.com/od/sqlserver/a/recoverymodels.htm 
К чему перечисление моделей восстановления? К тому, что по умолчанию SQL Server ставит Recovery Model = Full, что приводит к тому что команда SHRINKDATABASE не приводит к очистке лога.
Для того, что бы очистить лог, сначала надо сменить Recovery Model:

alter database db_name set recovery simple
Посмотреть какая у баз стоит Recovery model можно так:
select name,recovery_model_desc from sys.databases
Далее можно очищать лог:
DBCC SHRINKDATABASE (db_name)
 Есть другой способ очистить лог, если не хочется отключать Full recovery model. Нужно сделать Detach базы, удалить файл лога и снова приатачить базу, тогда создаться пустой лог-файл.

3 марта 2011 г.

Как запускать зашифрованный SSIS пакет из джоба

При создании SSIS пакета в BIDS в свойствах есть опция ProtectionLevel со следующими возможными значениями:
  1. DontSaveSensitive - не сохранять в пакете паролей (имеются в виду пароли от соединений к БД и другим источникам и получателям данных);
  2. EncryptSensitiveWithUserKey - зашифровывать пароли с помощью ключа пользователя, который основан на профайле пользователя)
  3. EncryptSensitiveWithPassword - зашифровывать пароли с помощью пароля, который вводится в свойствах в поле PackagePassword;
  4. EncryptAllWithPassword - шифровать все введенным паролем;
  5. EncryptAllWithUserKey - шифровать все с помощью ключа пользователя;
  6. ServerStorage - сохранить пакет в базе msdb и защитить его с помощью ролей базы данных.
По умолчанию стоит EncryptSensitveWithUserKey.
Подробнее можно почитать тут: http://msdn.microsoft.com/en-us/library/ms141747.aspx
Последний пункт ни когда не использовал, т.к. предпочитаю запускать пакеты прямо из файлов, мне так удобнее. Но видимо, если пойти путем сохранения пакета в БД, то проблема пароля снимается.
А проблема состоит в том, что при использовании UserKey для шифрования SQL Server Agent должен быть запущен из под того же пользователя, что и делал сам пакет. Когда на сервере работает один пользователь проблем с этим не возникает. 
В моей практике был случай, когда я все делал из под доменного пользователя, у меня было порядка 20 пакетов, в которых стояло EncryptSensitiveWithUserKey. В один день упал контроллер домена, всех пользователей на домене админы заводили заново, имена всем дали те же, но профайлы естественно были другими. Пришлось все пакеты открывать и заново вводить все пароли к БД и FTP-соединениям. Даже страшно себе представить, что бы было, если бы в пакетах была выбрана опция EncryptAllWithUserKey...
На новом проекте пакеты делаются одним пользователем, а SQL Server Agent запущен из под другого и поменять это никак нельзя. Поэтому я стал использовать опцию EncryptSensitiveWithPassword
Для того, что бы запустить зашифрованный паролем пакет из джоба необходимо сделать следующее:
  1. В редакторе шага джоба выбрать type = SQL Server Integration Services Package;
  2. Package source = File system;
  3. Package - указать путь к файлу;
  4. На вкладке Command line (при ее открытии редактор попросит ввести пароль, который был использован для шифрования в пакете) выбрать Edit the command line manually. Для редактирования откроется поле Command line и там после опции /DECRYPT надо ввести пароль, т.е. /DECRYPT password.
  5. Нажать OK для сохранения шага.
Подробнее об опциях командной строки при запуске SSIS-пакетов можно почитать тут: http://msdn.microsoft.com/en-us/library/ms162810.aspx .

2 марта 2011 г.

Как изменить значение Identity у таблицы в MS SQL Server

Для того что бы задать новое значение поля identity в таблице надо выполнить следующую функцию:
DBCC CHECKIDENT (<table_name>, reseed, <новое_значение>)

28 февраля 2011 г.

Миграция данных из PostgreSQL в MS SQL Server

Миграция данных из PostgreSQL 8.3 в SQL Server 2008 R2 Standard  Edition.
Сначала я попытался прилинковать PostgreSQL к SQL Server, используя оригинальный драйвер ODBC. Когда создавал соединение, все было хорошо, т.е. Test Connection проходил, но при попытке линка вываливалась ошибка. Я не стал особо копать, т.к. знаю, что ODBC - один из самых глючных способов линковки к SQL Server. Проблемы возникают даже когда к одному SQL Server линкуется другой SQL Server.
Далее я начал искать другие дрова. Первыми нашел вот это http://pgfoundry.org/frs/?group_id=1000085&release_id=539 , но не стал качать, т.к. смутила дата последнего релиза  - 17.04.2006.
Далее на сайте PostgreSQL я нашел список различных дров: http://www.postgresql.org/download/products/2. По описанию мне понравились вот эти PGNP, я пробовал, работает отлично, порадовало так же поддержка SSIS, но из-за платности, я от них отказался.
Далее мой выбор пал на продукт, под названием Npqsql, по сути это библиотека для .Net, бесплатная, на ней я и остановился, но для миграции данных потребовалось написать код на C#:
using System;
using System.Collections.Generic;
using System.Text;

using System.Configuration;
using System.IO;

using Npgsql;

namespace Zapuskatr
{
    class Program
    {
        static string COLS_DELIMITER = "|";
        static string ROW_DELIMITER = "\n";
        static string CNN_STRING = null;
        static string QUERY = null;
        static string PATH = null;

        static void Main(string[] args)
        {
            if (CNN_STRING == null)
            {
                Console.WriteLine("ERROR: Connection string is empty.");
                return;
            }

            NpgsqlConnection cnn = null;
            NpgsqlCommand cmd = null;
            NpgsqlDataReader reader = null;
            try
            {

                cnn = new NpgsqlConnection(CNN_STRING);
                cnn.Open();
                if (QUERY != null)
                {
                    cmd = new NpgsqlCommand(QUERY, cnn);
                    reader = cmd.ExecuteReader();
                    int columns = reader.FieldCount;

                    if (PATH == null)
                    {
                        while (reader.Read())
                        {
                            Console.Write(reader[0].ToString());
                            for (int i = 1; i < columns; i++)
                            {
                                Console.Write(COLS_
DELIMITER + reader[i].ToString());
                            }

                            Console.Write(ROW_DELIMITER);
                        }
                    }
                    else
                    {
                        StreamWriter sw = new StreamWriter(PATH, false);

                        while (reader.Read())
                        {
                            sw.Write(reader[0].ToString());
                            for (int i = 1; i < columns; i++)
                            {
                                sw.Write(COLS_
DELIMITER + reader[i].ToString());
                            }

                            sw.Write(ROW_DELIMITER);
                        }

                        sw.Flush();
                        sw.Close();
                    }

                    cmd.Dispose();
                }
                else
                    Console.WriteLine("Version: {0}", cnn.ServerVersion);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: {0}", ex.Message);
            }
            finally
            {
                cnn.Close();
            }

        }
    }
}

Консольная программа - если PATH не задан, то выводит в консоль. Если QUERY не задан, то выводит версию PostgreSQL. COLS_DELIMITER - разделитель колонок, ROW_DELIMITER - разделитель строк. Код сам определяет количество колонок в запросе и выводит их все.
Далее, основываясь на этом коде, я создавал CSV файлы и с помощью SSIS закачивал их в SQL Server.

18 февраля 2011 г.

Как поменять область видимости переменной в BIDS (SSIS)

Если у кого то, как и у меня стоит английский BIDS, то под областью видимости я понимаю свойство Scope, которое поменять стандартными средствами невозможно. И я совершенно не понимаю почему!!!

Ну да ладно. Для своего пакета SSIS я создал порядка 10 переменных и потом заметил, что все имеют область видимости только в одном элементе, а нужны были во многих. Единственный путь поменять область видимости - это удалить переменные и создать заново, прям как работа над ошибками в школе ;)

Естественно этот путь меня не впечатлил, поэтому я открыл код пакета в текстовом редакторе. В очередной раз ужаснувшись увиденному, я понял, что этот путь тоже не лучший. Поэтому пошел в Google. И нагуглил инструмент под названием BIDS Helper. Детально я в нем не разбирался, судя из увиденного возможностей довольно много. Единственное, чего хотелось, скорее поменять область видимости, как это сделать написано тут. Область видимости поменял, правда после его установки при наведении на перемнную фокуса ввода перестало появляться окошко свойств, но я думаю это фича, а не баг.

11 февраля 2011 г.

Экспорт из MySQL в CSV файл

SELECT *
INTO OUTFILE 'products.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM products

На Windows файл появиться в папке текущей БД.

Импорт в MySQL из дамп-файла

$ mysql -u username -p -h localhost data-base-name < data.sql

Подробнее тут.

Работа с логами джобов в SQL Server

Для более удобного анализа истории выполнения джобов, например для анализа времени выполнения, стандартный лог не очень подходит. Но все данные, которые видны в истории выполнения джоба хранятся в таблице msdb..sysjobhistory. Вот ее структура:
CREATE TABLE dbo.sysjobhistory(
    instance_id int IDENTITY(1,1) NOT NULL,
    job_id uniqueidentifier NOT NULL,
    step_id int NOT NULL,
    step_name sysname NOT NULL,
    sql_message_id int NOT NULL,
    sql_severity int NOT NULL,
    message nvarchar(4000) NULL,
    run_status int NOT NULL,
    run_date int NOT NULL,
    run_time int NOT NULL,
    run_duration int NOT NULL,
    operator_id_emailed int NOT NULL,
    operator_id_netsent int NOT NULL,
    operator_id_paged int NOT NULL,
    retries_attempted int NOT NULL,
    server sysname NOT NULL
)
Тут есть описание этой таблицы.
job_id определяется по таблице  msdb..sysjobs, например вот так:
SELECT * FROM msdb..sysjobs WHERE name like '%job%'
Детально со всеми полями не разбирался, назначение большинства понятно из названий. Меня интересовало поле run_duration. Поле имеет тип int, там хранится время выполнения шага (строки, в которых step_id = 0, относятся ко всему джобу, т.е. в такой строке в поле run_duration будет время выполнения всего джоба). Формат: hhmmss, поскольку тип int, нули слева не отображаются. Т.е. значение 709 - это 7 минут 9 сек, 34508 - 3 часа 45 минут 8 секунд.
Для преобразования этого формата в секунды я написал функцию:
-- Конвертация времени из формата HHMMSS типа int в секунды
create function fn_convert_intdt_to_sec ( @ts int )
returns int
as
begin
    if (@ts < 60) return @ts
   
    declare @sec int = @ts - (@ts/100)*100
    declare @min int = (@ts - (@ts/10000)*10000)/100
    declare @hr int = @ts/10000
   
    return @hr*3600 + @min*60 + @sec
end
В принципе если в передаваемом значении часы будут содержать более 2-х знаков, то тоже отработает.

8 февраля 2011 г.

Ошибка в SSIS "[SQL Server Destination [46]] Error: Unable to prepare the SSIS bulk insert for data insertion." при миграции данных из текстового файла в SQL Server

Исходные данные: Microsoft SQL Server Standard Edition 2008 R2 (64-bit) стоит на Microsoft Windows Server 2008 R2 Standard.
Копируются данные их текстового файла в таблицу. Для этого создается SSIS пакет с элементом Data Flow, в котором создается два элемента: Flat File Source и SQL Server Destination. При запуске пакета, еще перед началом считывания данных из текстового файла, пакет останавливается со следующими сообщениями об ошибке:
[SQL Server Destination [46]] Error: Unable to prepare the SSIS bulk insert for data insertion.
[SSIS.Pipeline] Error: component "SQL Server Destination" (46) failed the pre-execute phase and returned error code 0xC0202071.
После недолгого гуглинья я наткнулся на пост,  где описывается подобная проблема. Там пишут, что если SSIS-пакет выполняется не на той же машине, на которую указывает SQL Server Destination, то надо поменять его на OLE DB Destination. У меня все выполняется на одной машине. Тем не менее, я поменял SQL Server Destination на OLE DB Destination и все заработало.

4 февраля 2011 г.

Миграция данных из MySQL в MS SQL Server

Два сервера: 192.168.0.1 (MySQL Community Server 5.5.8) и 192.168.0.2 (SQL Server 2008 R2)
1. На сервере 192.168.0.1 необходимо создать пользователя:
CREATE USER 'user_name'@'%' IDENTIFIED BY 'password';
GRANT select ON db_name.* TO 'user_name'@'%';
'%' - обозначает, что этот пользователь может конектиться к серверу MySQL с любого хоста. Подробнее о создание пользователей в MySQL читайте здесь.
2. На сервер 192.168.0.2 необходимо установить коннектор для Windows.


Далее можно создавать пакет SSIS или сделать единоразовую загрузку.

Для единоразовой загрузки необходимо:
1. В Management Studio тыкаем правой кнопкой на базе, в меню выбираем Tasks -> Export Data...
2. В открывшемся окне выбираем Data Source -> .Net Framework Data Provider for MySQL
3. Заполняем поля:
Database, Server, Password, User Id
4. Далее настраиваем получатель данных: Server, Database
5. В следующем окне выбираем "Write a query to specify the data to transfer"
6. Далее вводим запрос для извлечения данных: SELECT * FROM table_name
7. В следующем окне вставляем имя таблицы в SQL Server и жмем в этом и следующем окне Next.

А теперь о проблемах.
В MySQL в таблице было примерно 2,2 млн. записей. Когда я писал запрос
SELECT * FROM table_name
то данные не копировались, если писал вот так:
SELECT * FROM table_name LIMIT 5
копировалось, как и должно было, 5 строк, но если я писал вот так:
SELECT * FROM table_name LIMIT 3000000
выдавало ошибку.
После долгих мытарств, я решил сохранить этот пакет как файл, получился файл с расширением dtsx, открыл его в текстовом редакторе и заменил LIMIT 5 на LIMIT 3000000, потом выполнил его и он, на удивление, все выполнил.

Настройка PHP в IIS 7

3 февраля 2011 г.

Изменение доменного имени сайта

Для того, что бы корректно (с точки зрания поисковых машин) перенести сайт с одного доменного имени на другое, нужно настроить переадреcацию с помощью кода перенаправления HTTP 301 (Moved Permanently). В заголовке ответа Location указывается, куда была перенесена страница.

В C# код выглядит вот так: 
string location = "new_name";
Response.Clear();
Response.StatusCode = 301;
Response.AddHeader("Location", location);
Response.End();
Код нужно вставить в Global.asax в метод  Application_BeginRequest.

Причем, если написать вот так:
Response.Headers["Location"] = location;
То будет возникать исключение: This operation requires IIS integrated pipeline mode

В своей статье Редирект 301 (Moved Permanently) в IIS 7 я более подробно описываю способы редиректа в IIS 7. 




28 января 2011 г.

Определение высоты документа для любого браузера

function getDocHeight() {
    var D = document;
    return Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );
}

Если высота документа меньше высоты видимой области окна, то будет возвращена высота видимой области окна.

Взято здесь.

27 января 2011 г.

Доступ к MySQL через SSH-туннель в .NET

Как то мне очень надо было реализовать такую возможность, вот нашел статью: Access MySQL Through SSH Tunnel in a Windows .NET Application, к сожалению ссылка перестала работать, поэтому пришлось поискать в своем старом коде.

Я его давно не запускал, но, думаю, он направит в нужном направлении. Для работы нужна библиотека: http://www.tamirgal.com/blog/page/SharpSSH.aspx , там можно качнуть ее в исходниках или в бинарниках. Ссылки в глаза не бросаются, поэтому даю тут ссылку на бинарник: SharpSSH-1.1.1.13.bin.zip

Далее привожу код консольного приложения, которое соединяется с MySQL через SSH-тунель:
 
using System;
using System.Collections.Generic;
using System.Text;

using Tamir.SharpSsh.jsch;
using MySql.Data.MySqlClient;

namespace TestSSHTunnel
{
    class Program
    {
        static void Main(string[] args)
        {
            Session session;
         MySqlConnection conn = null;

            try
      {
       //Create a new JSch instance
       JSch jsch = new JSch();//Create a new SSH session
                string host = "u196.ssh.masterhost.ru"; //url
       string user = "ssh_user"; //ssh username
       string pass = "ssh_pswd"; //ssh password
       int sshPort = 22; //ssh port
                int rPort = 3306;
                int lPort = 3306; 

                session = jsch.getSession(user, host, sshPort);
       session.setHost(host);
       session.setPassword(pass);
       UserInfo ui = new MyUserInfo();
       session.setUserInfo(ui);
       session.connect();
     
       // Set port forwarding on the opened session
                session.setPortForwardingL(lPort, "u196.mysql.masterhost.ru", rPort);
                
       if (session.isConnected())
       {
        try
        {
                        string dbhost = "localhost";
                        string dbuser = "db_user";
                        string dbpass = "db_pswd";
                        string dbdatabase = "db_name";
         string connStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false",
          dbhost, dbuser, dbpass, dbdatabase);
     
         // Create a MySql Connection
         conn = new MySqlConnection(connStr);
         conn.Open();
         conn.ChangeDatabase(dbdatabase);
        }
        catch (Exception ex)
        {
         Console.WriteLine(ex.Message);
         session.disconnect();
        }
        finally
        {
         conn.Close();
        }
       }
      }
      catch (Exception ex)
      {
       Console.WriteLine(ex.Message);
      }
        }
    }

    public class MyUserInfo : UserInfo
    {
        /// 
        /// Holds the user password
        /// 
        private String passwd;

        /// 
        /// Returns the user password
        /// 
        public String getPassword() { return passwd; }

        /// 
        /// Prompt the user for a Yes/No input
        /// 
        /// 
        /// 
        public bool promptYesNo(String str)
        {
            return true;
        }

        /// 
        /// Returns the user passphrase (passwd for the private key file)
        /// 
        /// 
        public String getPassphrase() { return null; }

        /// 
        /// Prompt the user for a passphrase (passwd for the private key file)
        /// 
        /// 
        /// 
        public bool promptPassphrase(String message) { return true; }
        
        /// 
        /// Prompt the user for a password
        /// 
        /// 
        /// 
        public bool promptPassword(String message) { return true; }

        /// 
        /// Shows a message to the user
        /// 
        /// 
        public void showMessage(String message) { }

    }
}

Еще тогда, когда мне нужно было решить эту проблему, я нашел библиотеку http://granados.sourceforge.net/ , но по каким-то причинам от нее отказался. Тут http://social.msdn.microsoft.com/Forums/en-US/e554ebc5-7b74-415f-8ac8-d5dc3dcaf1c5/looking-for-granados-ssh-example?forum=netfxnetcom вроде бы описывается как с ней работать.

Проблема с событием onload в объекте Image в браузере Opera

Наткнулся на проблему при использовании плагина для jQuery lightbox 0.5. В Opera 11.00 - при нажатии на ссылку, которая должна отобразить фотографию, открывался оверлей, но фотография не отображалась. Если закрыть оверлей и снова нажать на туже ссылку, то фотография отображалась нормально.
Начал копаться в коде lightbox. Выяснил, что проблема в том, что в функции _set_image_to_view() из файла jquery.lightbox-0.5.js устанавливается обработчик события onload на объект Image, внутри обработчика выполняется отображение фотографии:
objImagePreloader.onload = function () {
                $('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
                // Perfomance an effect in the image container resizing it
                _resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
                //    clear onLoad, IE behaves irratically with animated gifs otherwise
                objImagePreloader.onload = function () { };
            };
Но после загрузки фотографии обработчик onload не запускается.
Поскольку в других браузерах все работало отлично, понял, что проблема в Opera. Погуглив нашел несколько постов в форумах на эту тему:
Решения не нашел, поэтому сделал такую заплатку: в функцию  _set_image_to_view() из файла jquery.lightbox-0.5.js после строк:
            // Image preload process
            var objImagePreloader = new Image();
           
            objImagePreloader.onload = function () {
                $('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
                // Perfomance an effect in the image container resizing it
                _resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
                //    clear onLoad, IE behaves irratically with animated gifs otherwise
                objImagePreloader.onload = function () { };
            };

            objImagePreloader.src = settings.imageArray[settings.activeImage][0];

добавил:

            if (window.opera) {
                var ver = window.opera.version();
                if (ver == '11.00' || ver == '11.01' || ver == '7.50' || var == '7.54') {
                    ___pause(1000);
                    objImagePreloader.onload();
                }
            }

Функция  ___pause определена в файле jquery.lightbox-0.5.js. Значение задержки надо подобрать в зависимости от скорости загрузки фотографий. В общем 100% результат не гарантирован, т.к. скорость загрузки всегда разная.
Решение не очень красивое, но другого не придумал :)

21 января 2011 г.

SSRS 2008: Добавление параметров к отчету

Что бы добавить в отчет параметры, нужно открыть окно Report Data, для этого надо сначала левой кнопкой мышки тыкнуть в области редактирования отчета, а потом нажать Ctrl-Alt-D или через меню View -> Report Data.  Если фокус ввода имеет другое окно, например окно Proprties, то в меню View не будет Report Data и сочетание клавиш Ctr-Alt-D работать не будет.
Я раньше работал с SSRS 2005, в первый раз, когда стал делать отчет в SSRS 2008, я 10 минут искал, как добавить параметры - это жесть!!! Я был просто в шоке, как так можно было сделать интерфейс. В общем, Мелкомягкие жгут!

14 января 2011 г.

T-SQL: Размер таблиц в БД

Скрипт отображает следующие колонки:
  1. name - название таблицы;
  2. rows - количество строк в таблице;
  3. reserved - место, которое выделено под таблицу;
  4. data - место, которое занимают данные в таблице;
  5. index_size - место, которое занимают индексы таблицы
  6. unused - место, которое пока не используется
Все размеры в мегабайтах.

create table #t
(
    name varchar(500),
    rows bigint,
    reserved varchar(50),
    data varchar(50),
    index_size varchar(50),
    unused varchar(50)
)

declare @t_name varchar(500)
DECLARE t_cursor CURSOR
    FOR select name from sysobjects where xtype = 'U' order by name
OPEN t_cursor
FETCH NEXT FROM t_cursor INTO @t_name;

WHILE @@FETCH_STATUS = 0
BEGIN
    insert into #t exec sp_spaceused @t_name
    FETCH NEXT FROM t_cursor INTO @t_name;
END
CLOSE t_cursor;
DEALLOCATE t_cursor;

select name, rows, cast(left(reserved, len(reserved)-2) as bigint)/1024.0 reserved,
    cast(left(data, len(data)-2) as bigint)/1024.0 data, cast(left(index_size, len(index_size)-2) as bigint)/1024.0 index_size,
    cast(left(unused, len(unused)-2) as bigint)/1024.0 unused
from #t order by reserved desc

12 января 2011 г.

T-SQL: SELECT и EXEC

Иногда хочется манипулировать с данными, которые возвращает хранимая процедура, как с обычной таблицей, но вот так:
SELECT * FROM EXEC sp_temp
не работает.

Варианта 2:

1. Создать таблицу:
CREATE TABLE temp ( ... )
И потом выполнить INSERT:
INSERT INTO temp EXEC sp_temp
2. Воспользоваться  командой OPENROWSET:
SELECT * FROM OPENROWSET('SQLOLEDB','server_name';'user_name';'password','EXEC sp_temp') AS a
Здесь мне нужно было взять некоторые название таблиц с линкованного сервера и вставить их в таблицу, мне удобнее было воспользоваться OPENROWSET:
INSERT INTO _tables (name, server_id)
SELECT table_name, 1
FROM OPENROWSET('SQLOLEDB','server_name';'user_name';'password',
    'EXEC sp_tables_ex  @table_server = ''server_name'',  @table_catalog = ''db_name'',  @table_type = ''TABLE''') AS a
WHERE table_name LIKE '%daily_log%'
ORDER BY table_name

T-SQL: Получение списка таблиц с линкованного сервера

Используется хранимая процедура sp_tables_ex

Пример: 

EXEC sp_tables_ex  @table_server = 'server_name',  @table_catalog = 'db_name',  @table_type = 'TABLE'

В статье T-SQL: SELECT и EXEC можно почитать про то, как работать с данными, которая возвращает хранимая процедура с помощью команды SELECT.

23 декабря 2010 г.

SSAS 2008 R2 выключается при процессинге кубов

Стоит SQL Server Standard Edition 2008 R2(64-bit) на Microsoft Server 2008 R2 Standard. Кубы процесятся в джобе по-частям, сначала все измерения, потом все кубы. Иногда прямо на первом шаге джоба служба SSAS отключается, но не всегда. После включения службы все отлично процесится. После выключения, в файл SQLDUMPER_ERRORLOG.log записывается что то вроде этого:
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 37
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(17CC:141C) 12/21/10 05:57:08, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0228.mdmp
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(17CC:141C) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(17CC:141C) 12/21/10 05:57:12, ACTION,               msmdsrv.exe, Watson Invoke: No
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 36
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(BD4:1688) 12/21/10 05:57:12, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0229.mdmp
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(BD4:1688) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(BD4:1688) 12/21/10 05:57:13, ACTION,               msmdsrv.exe, Watson Invoke: No
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 36
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0230.mdmp
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(1018:1538) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(1018:1538) 12/21/10 05:57:13, ACTION,               msmdsrv.exe, Watson Invoke: No
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 36
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0231.mdmp
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(6D0:1608) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(6D0:1608) 12/21/10 05:57:13, ACTION,               msmdsrv.exe, Watson Invoke: No
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 36
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(1268:1558) 12/21/10 05:57:13, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0232.mdmp
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(1268:1558) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(1268:1558) 12/21/10 05:57:14, ACTION,               msmdsrv.exe, Watson Invoke: No
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 36
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0233.mdmp
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(1640:151C) 12/21/10 05:57:14, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(1640:151C) 12/21/10 05:57:14, ACTION,               msmdsrv.exe, Watson Invoke: No
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, AdjustTokenPrivileges () completed with status (00000514)
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Input parameters: 4 supplied
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 1: 1504
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 2: 0
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 3: 0:0
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Parameter 4: 0000000003165C40
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Parsed parameters:
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ProcessID = 1504
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ThreadId = 0
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     Flags = 0x0
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     MiniDumpFlags = 0x0
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     SqlInfoPtr = 0x0000000003165C40
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     DumpDir = <NULL>
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExceptionRecordPtr = 0x0000000000000000
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ContextPtr = 0x0000000000000000
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ExtraFile = <NULL>
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     InstanceName = <NULL>
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE,     ServiceName = <NULL>
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Threads processed: 36
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 11 not used
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 15 not used
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Callback type 7 not used
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, MiniDump completed: C:\DB\Log\SQLDmpr0234.mdmp
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'dbghelp.dll' : 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll'
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\dbghelp.dll' : '6.8:4.0'
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Location of module 'sqldumper.exe' : 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE'
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, File version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '2009.100:1600.1'
(1468:698) 12/21/10 05:57:15, ACTION, SQLDUMPER_UNKNOWN_APP.EXE, Product version of module 'C:\Program Files\Microsoft SQL Server\100\Shared\SQLDUMPER.EXE' : '10.50:1600.1'
(1468:698) 12/21/10 05:57:15, ACTION,               msmdsrv.exe, Watson Invoke: No

Поиск в Google по поводу этой ошибки выдает много ссылок, из которых видно, что такая проблема была и в SSAS 2005. Для SSAS 2005 решается путем установки SP2, для SSAS 2008 я фиксов не нашел.
Моя версия происходящего следующая - SQLDUMPER - это сборщик мусора, который чистит память. Когда перед процессингом куба память SSASа заполнена, то включается сборщик мусора и, по каким то причинам, рушиться. Бывают случаи, когда сервис не выключается перед процессингом, я думаю, это из-за того, что память не заполнена и сборщик мусора не запускается. У меня сервис выключался в основном в будни (кубы процессятся каждый день в 6 утра), начиная с утра вторника. Т.е. в выходные запросов к кубам нет, память не засоряется, в понедельник пользователи активно работают с кубами (они работают через Excel, т.е. в конечном итоге к кубам идет много разнообразных запросов), память засоряется и ее надо чистить. Если сервис выключить (или если он сам отключился) и потом включить, память освобождается и далее кубы процесятся нормально.
В ходе поисков решения, я нашел статью http://jesseorosz.wordpress.com/2007/07/27/msolap-service-crashes-once-a-day-windows-low-fragmentation-heap-vs-olap-heap/, в которой предлагается следующее решение -  переключить SSAS с OLAP-кучи на Windows-кучу, т.к. сборщик мусора SSASа работает не устойчиво. Для этого надо в файле C:\Program Files\Microsoft SQL Server\MSAS10_50.MSSQLSERVER\OLAP\Config\msmdsrv.ini в разделе <Memory> установить следующие значения: 
<MemoryHeapType>2</MemoryHeapType><HeapTypeForObjects>0</HeapTypeForObjects>
Мне не помогло, более того, у меня процесятся три куба и иногда сервис стал выключатся в процессе процессинга одного из кубов.
Переход на  SQL Server Enterprise Edition 2008 R2(64-bit) не решил проблему, видно сборщик мусора у них один.
Я решил проблему в лоб - создал задание, которое каждую ночь, перед процессингом перезапускает службу SSAS.

16 декабря 2010 г.

Как я линковал Oracle 11g к SQL Server 2008

Исходные данные такие: SQL Server Standard Edition 2008 R2(64-bit) стоит на Microsoft Server 2008 R2 Standard. К нему линкую Orcale 11g R2. Сразу скажу, получилось не с первого раза, было 4 попытки.Тому, кто работал 8 лет на SQL Server, а с Ораклом имел дело пару раз (это я про себя), разобраться было очень не просто. Вообще с моей точки зрания Оракл очень своеобразная СУБД, ну это дело привычки.

1. Необходимо скачать с сайта Оракла клиентское ПО: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html. Я качал вот это: Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)

2. Установить на винду, в установке выбрать второй пункт Administrative Tools (может как то по другому называется). Я переустанавливал 4 раза. В третий раз выбрал не второй пункт, а первый (Client), а потом поставил второй пункт, потом все снес и поставил 4-й раз второй пункт, это может быть существенно, т.к. заработало только после четвертой переустановки.

3. В папке D:\app\sergey.antonov\product\11.2.0\client_4\network\admin\sample взять файл tnsnames.ora, скопировать его в папку на уровень выше: D:\app\sergey.antonov\product\11.2.0\client_4\network\admin и прописать там TNS-алиас:
 ORA_SERVER =
   (DESCRIPTION =
      (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST =  192.168.0.1)(PORT = 1521))
       )
    (CONNECT_DATA =
          (SID = SOME_SID)
     )
   )

3.1. Можно сделать проверку соединения:
All Programs -> Oracle - OraClient11g_home4 -> Configuration and Migration Tools -> Net Manager
Там в дереве открываем:
Oracle Net Configuration -> Local -> Service Naming -> ORA_SERVER

Далее тыкаем в панели слева третью кнопку сверху. Это тест. Он отправляет запрос от пользователя scott с паролем tiger. Если он залочен, выведется соответсвующая инфа об ошибке. Но в окошке будет кнопка Change Login, тыкаем ее и меняем логин и пароль и снова проводим тест

3.2. Тест через SQL Plus (можно поселектить данные, что б понять, что есть доступ к таблицам). Start -> Run -> cmd
В консоли пишем: sqlplus <oracle_user>/<oracle_password>@ORA_SERVER
последний параметр - имя TNS
Далее можно выполнить запрос: select * from scheme.table;

4. Прилинковать сервер в SQL Server:
EXEC sp_addlinkedserver 'ORA_SERVER', 'Oracle', 'OraOLEDB.Oracle', 'ORA_SERVER'
EXEC sp_addlinkedsrvlogin 'ORA_SERVER', 'FALSE', NULL, '<oracle_user>', '<oracle_password>'

 В обоих процедурах первый параметр - это имя создаваемого линкованного сервера

В SQL Server Server Objects -> Linked Servers -> Providers -> ORaOLEDB.Oracle, правой кнопкой и в окне свойств должны быть чек-боксы в полях Dynamic parameter и Allow inprocess

Сначала при установке Allow inprocess при запросе к данным выдавал ошибку, что то типа какой то мегафаулт, крэш и все такое у провайдера ORaOLEDB.Oracle, а если галку снять, то выдавало Acces Denied (но акцес был не динаед, т.к. я проверял через SQL Plus и все работало).

4.1. Т.к. после первых трех переустановок клиентской части Оракла линкованный сервер не работал (причем если на нем нажать правой кнопкой и сделать Test Connection, то тест проходил успешно), я решил еще раз переустановить клиентскую часть, т.е. повторить все пункты с 2-3 и создать ODBC соединение.

All Programs -> Oracle - OraClient11g_home4 -> Configuration and Migration Tools -> Microsoft ODBC Administrator
(его можно и по другому вызвать, просто тут мне было удобнее)

В вкладке System DSN создаем запись:
В окне "Select driver ..." выбираем Oracle in OraClient11g_home4
Заполняем поля:
Data Source Name: ORA_SERVER
TNS Service Name: ORA_SERVER (выбираем из списка)
На вкладке Application я еще установил чек бокс Read-Only Connection (т.к. мне нужно было только читать)

Далее линкуем сервер:
EXEC sp_addlinkedserver @server = 'ORA_SERVER_ODBC', @srvproduct = '', @provider = 'MSDASQL', @datasrc = 'ORA_SERVER'
EXEC sp_addlinkedsrvlogin 'ORA_SERVER_ODBC', 'false', NULL, '<oracle_user>', '<oracle_password>'

 И после этого запросы стали выполняться, но выдавалась только одна строка, хотя точно известно, что их там больше. В чем проблема - не понятно. Мне говорили, что такая проблема была у людей даже при линковке в SQL Server другого SQL Server'а через ODBC, но как пофиксили не помнят.

Потом я решил прилинковать сервер, как в пункте 4, установить галки Dynamic parameter и Allow inprocess, и, о чудо, все заработало.

5. Выборка данных:
так не работает: select * from ORA_SERVER..scheme.table

Делал так:
1) EXEC('select * from scheme.table') AT ORA_SERVER
  для того, что б работало, надо на линкованом сервере кликнуть правой кнопкой и на вкладке Server Options установить в True поля RPC и RPC Out (может быть одно лишнее, но я не разбирался)
2) SELECT * FROM OPENQUERY(ORA_SERVER, 'select * from scheme.table')
3) SELECT * FROM OPENROWSET('OraOLEDB.Oracle', 'ORA_SERVER'; '<oracle_user>' ; '<oracle_password>', 'select * from scheme.table') AS a
что б работало так надо выполнить команды:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

ИТОГО:
Все вроде просто, но заработало далеко не сразу. Мое мнение, что проблема была в галке провайдера Allow inprocess (т.к. очень много постов на форумах с обсуждением данной проблемы указывали именно на нее), но по какой то причине (возможно из-за 64 битной винды) ораклячий провайдер не корректно работал при ее установке.
Возможно повилияло то, что в третий раз я сначала установил клиента оракла (первый пункт в инсталяшке), а потом админские проги (второй пунк в инсталяшке), когда я все опять удалил, он много оставил в папке D:\app\sergey.antonov\product\11.2.0\client_3\, больше чем в D:\app\sergey.antonov\product\11.2.0\client_2.
Был вариант настроть через провайдера MSDAORA (это майкрософтовский провайдер для Oracle), но у меня ни как не работала, на форумах писали, что надо скачать для 64 битной системы, но я не нашел где, а где то на майкрософтовском форуме увидел инфу, что он только для Oracle 8 и что надо использовать другой провайдер, хотя в других ветках на вопрос по поводу OraOLEDB.Oracle писали, что это не их продукт, используйте MSDAORA.

ССЫЛКИ ПО ТЕМЕ:
http://snippets.dzone.com/posts/show/3731 - про настройку линкованного сервера через ODBC, правда к DB2, но суть ясна
http://www.sql.ru/Forum/actualthread.aspx?bid=3&tid=6303&hl= - про аналог команды LIMIT, TOP в Оракле