Metrika

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, <новое_значение>)