Биты и байты.

Биты и байты.

понедельник, 8 декабря 2014 г.

Кому план? Cвежий план, берем из кэша не стесняемся)

Как всегда возник вопрос где взять план..
1.Метод, взять план из кэша

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
where text like '%Текст%'

Сохранить XML план с расширением .sqlplan 
и открыть через SSMS

2.Метод, посмотреть через SSMS
Для начала включить опцию Актуальный план
Затем запустить выполнение инструкции, план появится в отдельной вкладке
3.Метод, используя опцию SHOWPLAN
SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

  • SHOWPLAN_TEXT отображает приблизительный план без реального запуска инструкции
  • SHOWPLAN_ALL – Отображает приблизительный план со стоимостными оценками без реального запуска инструкции
  • SHOWPLAN_XML - Displays an XML based estimated execution plan with cost estimations, without executing the query. This is equivalent to the "Display Estimated Execution Plan..." option in SQL Server Management Studio.
  • STATISTICS PROFILE – Выполняет запрос и отображает реальный текстовый план.
  • STATISTICS XML – Выполняет запрос и отображает актуальный план. Эквивалент  опции "Include Actual Execution Plan" в SSMS.

вторник, 2 декабря 2014 г.

Процедура запущена или нет вот в чем вопрос...


Как узнать запущена ли процедура, для этого достаточно использовать встроенные блокировки SQL Server

ALTER PROCEDURE usp_ProcessCustomers
AS
BEGIN
    BEGIN TRANSACTION

    declare @Lock int
    EXEC @Lock = sp_getapplock @Resource = 'ProcessCustomers',
                               @LockMode = 'Exclusive'
    IF (@Lock < 0-- already locked by another process
       RETURN;

-- Do processing here
-- Do processing here

    EXEC sp_releaseapplock @Resource = 'ProcessCustomers'

    COMMIT TRANSACTION
END

Блокировки приложений

Допустим необходимо обеспечить последовательный доступ  к запуску произвольного SQL кода. Например когда работают например несколько экземпляров приложений запускающих один и тот SQL и  мы не хотим чтобы он выполнялся параллельно.
Для таких целей  у SQL сервера есть набор процедур sp_getapplock (устанавливает блокировку) и sp_releaseapplock (снимает блокировку)
стим следующий код в 2 разных сессиях.
И результаты двух сессий
Как видно сообщения во второй сессии появились после того как отработала первая сессия.

пятница, 10 октября 2014 г.

Полезные скрипты для сервера отчетов SSRS.

В качестве предыстории если кто не в теме, общая схема работы SSRS в собственном режиме выглядит так.
Подробное описание режимов работы  можно посмотреть тут

Вся необходимая информация для запуска сервера отчетов содержится в файле конфигурации  RsReportServer.config 
Дополнительную информацию о конфигурации сервера отчетов можно посмотреть процедурой  exec dbo.GetAllConfigurationInfo
запустив ее в базе ReportServer  
Итак поехали тут самые полезные скрипты

1. Посмотреть папки и доступ

SELECT  CASE RSCatalog.TYPE
          WHEN 1 THEN 'Folder'
          ELSE 'Report'
        END AS [Type] ,
        RSCatalog.Path ,
        RSCatalog.Name AS Report ,
        Users.UserName ,
        Roles.RoleName
FROM    [dbo].[Catalog] RSCatalog
        INNER JOIN [dbo].[PolicyUserRole] PolicyUserRole ON RSCatalog.PolicyID = PolicyUserRole.PolicyID
        INNER JOIN [dbo].[Roles] Roles ON PolicyUserRole.RoleID = Roles.RoleID
        INNER JOIN [dbo].[Users] Users ON PolicyUserRole.UserID = Users.UserID
WHERE   RSCatalog.TYPE IN ( 1, 2 )
ORDER BY RSCatalog.Path ,
        RSCatalog.Name ,
        Users.UserName

 

четверг, 9 октября 2014 г.

Послал не того или не туда послал?


ОТЗЫВ ПИСЕМ В OUTLOOK 2010

В том случае, если вы решили воспользоваться функцией отзыва писем в Outlook 2010, сделайте следующее:
1.  Найдите письмо в папке Отправленные (Sent Items).
2.  Откройте письмо и откройте мерю Файл (File).
3.  В появившемся меню выберите пункт Info, а в нем выберите:
Отозвать или послать письмо повторно -> Отозвать (Resend or Recall -> Recall This Message)
4.  Откроется окно настройки отзыва писем:
5.  Здесь мы можем выбрать нужно ли нам удалить непрочитанные копии отправленного письма (delete unread copies of the this message), либо удалить непрочитанные копии и заменить их новым письмом (delete unread copies and replace  with a new message). Если вы выберете второй пункт,  откроется исходное письмо и вам будет предложено отредактировать его и послать заново.
6.  Нижний чекбокс определяет получать или нет информацию о статусе отзыва для каждого из получателей.
7.  Нажав кнопку Ok, вы отправите запрос на отзыв письма.
Через некоторое время, в том случае если вы настроили получение информации о статусе отозванного сообщения, вы получите письма с информацией об успешном/неуспешном отзыве отправленного письма.
Вот так выглядит сообщение об успешно отозванном письме:
Вот письмо о невозможности отозвать e-mail:

вторник, 7 октября 2014 г.

Единый вход в облака с SAML.

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

Одной из таких технологий единого доступа является SAML это язык разметки (Security Assertion Markup Language), основанный на языке XML.
Эта технология разработана для обмена данными об аутентификации и авторизации.
Очень хорошее видео  по знакомству с  SAML  .  (Подробно о средствах идентификации в корпоративных сетях)
Подробный документ с описанием тут.

Язык SAML построен на следующих существующих протоколах:
•             XML - Подавляющее большинство утверждений SAML представляется в виде совокупности XML-тегов
•             XML Schema - Все утверждения SAML описаны используя XML-схемы
•             XML Signature - SAML использует цифровую подпись(основанную на стандарте XMLDSig) для аутентификации и защиты сообщений
•             XML Encryption - SAML 2.0 предоставляет возможность использования шифрованных идентификаторов, шифрованных атрибутов и шифрованных утверждений, используя XML Encryption
•             HTTP - SAML использует протокол HTTP в качестве транспортного протокола
•             SOAP - SAML использует SOAP 1.1
Структура SAML

На рисунке показана взаимосвязь между базовыми понятиями SAML:

Профиль SAML - конкретное описание сценария, использующего комбинацию выбранных утверждений, протоколов и привязок.
Привязка SAML определяет как запросы и ответы отображаются в стандартные сообщения или коммуникационные протоколы. Одной из важных привязок языка является SOAP-привязка.
Протокол SAML описывает как конкретные элементы SAML инкапсулируются в запросы и ответы,а также правила обработки сущностей SAML.
Утверждения SAML
Утверждения  SAML — это высказывания службы идентификации (identity authority) о конечном пользователе — человеке или компьютере. Подобно Active Directory, служба идентификации является доверительным источником заключений об аутентификации и авторизации. Во многих организациях Active Directory используется как служба идентификации, содержащая параметры безопасности многочисленных приложений. Утверждение — это ответ на запрос типа "Может ли Джон Смит получить доступ к серверу отдела кадров?"
Существуют три вида утверждений: авторизации, аутентификации и атрибута. Каждое из них содержит набор общих элементов: предмет, условие и аутентификационное высказывание ("Таблица элементов").

пятница, 19 сентября 2014 г.

Быстрый доступ к данным 1С

Когда срочно нужны данные из 1С, а программиста 1С под рукой нет, поможет старый добрый SQL запрос.
Так как структура базы сама по себе хитрая (таблицы и поля имеют служебные названия  а-ля  _Document324 , _Reference1961   и  _Field32634)  желательно сначала получить структуру базы,  самый простой способ  с помощью обработки  с Инфостарта, запускать нужно из под тонкого клиента.

P.S Тоже самое можно получить  встроенной функцией  ПолучитьСтруктуруХраненияБазыДанных(,Истина)


Определенную сложность доставляют перечисления, т.к для них не хранится название элемента. См. ниже

Можно получить названия SSIS пакетом  используя этот код в отдельную таблицу,  взято с хабра

  CREATE TABLE [dbo].[tbl1CEnums](
    [EnumName] [nvarchar](1024) NULL,
    [EnumValue] [nvarchar](2014) NULL,
    [EnumOrder] [int] NULL
) ON [PRIMARY]

Затем  связать эту таблицу с перечислением

четверг, 11 сентября 2014 г.

Sharepoint изнутри.


Как выглядит  SharePoint со стороны БД?  Ну как то так..
Для человека который первый раз залез под капот тут не все так очевидно как хотелось бы, поэтому попробуем немного разобраться в этом вопросе.
Предупреждение: Любые изменения в SharePoint через СУБД могут нарушить структуру базы и привести к тому что ваш SharePoint перестанет работать.
Все операции выполняются на свой страх и риск, поэтому перед тем как выполнять в боевой базе необходимо детально проверить скрипты на тестовой.

Если немного приглядеться  можно выделить основные таблицы SharePoint и связи между ними

AllLists
Таблица которая содержит списки (библиотеки) для каждого сайта.
ОСНОВНАЯ таблица содержит мета информацию о каждом элементе в списке.
Содержит информацию обо всех документах (и всех элементах списка) для каждой библиотеки и списка.
DocStreams
Содержит сами документы в BLOB поле Content varbinary (max).
NameValuePair
Индексируемые поля для списков.
AllUserDataJunctions
Содержит множественный выбор значений полей.
ContentTypes 
Содержит описание используемых типов
Features 
 Содержит информацию об активированных дополнениях для каждой коллекции сайтов или сайта.
 Содержит информацию о  всех коллекциях сайтов в базе.
 Содержит информацию о сайтах (webs) в каждой коллекции сайта.
 Содержит информацию о пользователях.
Groups
 Содержит информацию о группах пользователей в каждой коллекции сайтов.
Roles
 Содержит роли (уровни доступа) для каждого сайта.
 Содержит информацию о членах групп.
RoleAssignment
 Содержит информацию обо всех пользователях или группах SharePoint которые присвоены ролям.
SchedSubscriptions
 Содержит информацию обо всех настроенных подписках по расписанию
ImmedSubscriptions
 Таблица содержащая информацию обо всех непосредственных подписках.

1.  Информацию о списках Sharepoint  можно получить из таблицы AllLists
SELECT 
       List.tp_SiteId,
       List.tp_WebId,
       List.tp_ID ,   --идентификатор списка
       tp_BaseType ,  --тип списка: Generic List: 0, Document Library: 1, Discussion Board:3, Survey:4,Issue:5
       tp_ServerTemplate, --ex:100-Generic list,101-Document library,102-Survey,103-Links list,104-Announcements list,105-Contacts list,106-Events list, 107-Tasks list,108-Discussion board,109-Picture library
       list.tp_Title , --название списка
       list.tp_Fields ,  --описание полей в библиотеке
       list.tp_ContentTypes  --описание типов в библиотеке
  FROM alllists LIST WHERE lower(LIST.tp_Title) LIKE  N'%входящие%2011%' and (list.[tp_DeleteTransactionId] = 0x )

Поля tp_Fields, tp_ContentTypes  хранятся в сжатом двоичном виде, чтобы распаковать их достаточно использовать функцию ниже


private static string getXmlFromTpFields(byte[] tpFields)
        {
            using (var memoryStream = new MemoryStream(tpFields))
            {
                // пропускаем первые 14 байтов
                for (var index = 0; index <= 13; index++)
                    memoryStream.ReadByte();

                var deflateStream = new DeflateStream(memoryStream, CompressionMode.Decompress);

                using (var destination = new MemoryStream())
                {
                    deflateStream.CopyTo(destination);

                    var streamReader = new StreamReader(destination);
                    destination.Position = 0;
                    return streamReader.ReadToEnd();
                }
            }
        }

четверг, 4 сентября 2014 г.

Навигация в отчетах SSRS.

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

воскресенье, 24 августа 2014 г.

Асинхронные темы в SQL с Service Broker.

Когда нет времени ждать выполнения задачи в дело вступает асинхронное программирование.
Представим что нужно выполнить 5 задач , если мы запустим их в SQL они будут выполняться последовательно, после запуска задачи процесс будет ждать завершения
и только после этого начнется следующая задача.
С помощью компонента Service Broker можно выносить выполнение задач во внешние приложения используя обмен сообщениями и управлением очередями сообщений.
Приложение может быть на другой машине таким образом настраивается масштабируемость  без изменения работы логики основного приложения.
Если внешняя служба не доступна Service Broker будет помещать сообщения в очередь на отправку и возобновит работу когда  служба будет  доступна, без ущерба работы основного приложения, таким образом Service Broker гарантирует доставку сообщений.


Когда лучше использовать Service Broker
  • Асинхронные триггеры
  • Надежная обработка запросов
  • Надежный сбор данных
  • Распределенная серверная обработка для клиентских приложений
  • Консолидация данных для клиентских приложений
  • Широкомасштабная пакетная обработка
1.Включение Service Broker

1.Проверить состояние компонента Service Broker
SELECT name, is_broker_enabled
FROM sys.databases

2.Включить компонент Service Broker
ALTER DATABASE SERVICE_BROKER SET ENABLE_BROKER with rollback immediate
--отключить компонент
alter database SERVICE_BROKER set disable_broker with rollback immediate
--задать  новый идентификатор Service Broker, удаляет все диалоги, необходимо заново пересоздать маршруты с новым идентификатором
alter database SERVICE_BROKER set new_broker

3. Включить безопасное взаимодействие
--Главный ключ базы данных — это симметричный ключ, который применяется для защиты закрытых ключей сертификатов
--и асимметричный ключей, которые есть в базе данных.
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='dswfdsdgfdg3241df'
--посмотреть список ключей
select * from sys.symmetric_keys

About