четверг, 29 сентября 2011 г.

MSSQL : LDAP запрос.

Всем добрый день.
Рано или поздно вам возможно придется столкнуться с запросом к ActiveDirectory.
Собственно сам рецепт запроса прост:

Либо так:
  1. SELECT primaryGroupID,
  2.        primaryGroupToken,
  3.        employeeid,
  4.        sAMAccountName,
  5.        [name],
  6.        adspath,
  7.        objectGUID,
  8.        info
  9. FROM OPENQUERY (ADSI, 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''LDAP://DC=MYDOMAIN,DC=RU'' WHERE objectCategory=''Group'' ORDER BY samAccountname');


Либо так:
  1. SELECT primaryGroupID,
  2.        primaryGroupToken,
  3.        employeeid,
  4.        sAMAccountName,
  5.        [name],
  6.        adspath,
  7.        objectGUID,
  8.        info
  9. FROM OPENQUERY (ADSI, N'<LDAP://DC=MORTON,DC=RU>;(&(objectClass=User)(objectCategory=Person)(|(sAMAccountName=a*)(sAMAccountName=b*)(sAMAccountName=c*)));primaryGroupID, primaryGroupToken,employeeid, sAMAccountName, name, adspath, objectGUID, info');
  10.  
  11.  


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

  1.  
  2. declare @samAccountname varchar(64)
  3. declare @query varchar(4000)
  4. declare @rc int
  5.  
  6. if (object_id('tempdb..#usersgrps') is not null) drop table #usersgrps
  7.  
  8.         CREATE TABLE #usersgrps (
  9.             id INT IDENTITY,
  10.             primaryGroupID INT ,
  11.             primaryGroupToken INT ,
  12.             employeeid VARCHAR (15) ,
  13.             sAMAccountName VARCHAR (64) ,
  14.             username VARCHAR (1000),
  15.             adspath VARCHAR (1000),
  16.             isprocessed INT ,
  17.             sid VARBINARY (50),
  18.             info VARCHAR (200) ,
  19.             isgroup BIT
  20.         );
  21.  
  22. INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  23. SELECT TOP 900 primaryGroupID,
  24.                primaryGroupToken,
  25.                employeeid,
  26.                sAMAccountName,
  27.                [dbo].[f_string_ad_clear]([name]),
  28.                [dbo].[f_string_ad_clear](adspath),
  29.                0,
  30.                objectGUID,
  31.                [dbo].[f_string_ad_clear](info),
  32.                0
  33. FROM OPENQUERY(ADSI,
  34.         'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''LDAP://DC=MYDOMAIN,DC=RU'' WHERE objectCategory=''User'' ORDER BY samAccountname')
  35.  
  36. set @rc = @@rowcount
  37.  
  38. select @samAccountname = max(sAMAccountName)
  39. from #usersgrps
  40. where isgroup = 0
  41.  
  42. select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''User'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  43. print @query
  44. select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 0 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  45. print @query
  46.  
  47. while @rc > 0
  48.     begin
  49.         INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  50.         exec (@query )
  51.         set @rc = @@rowcount
  52.  
  53.         select @samAccountname = max(sAMAccountName)
  54.         from #usersgrps
  55.         where isgroup = 0
  56.  
  57.         select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''User'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  58.         print @query
  59.         select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 0 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  60.         print @query
  61.     end
  62.  
  63.  
  64.  
  65. INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  66. SELECT TOP 900 primaryGroupID,
  67.                primaryGroupToken,
  68.                employeeid,
  69.                sAMAccountName,
  70.                [dbo].[f_string_ad_clear]([name]),
  71.                [dbo].[f_string_ad_clear](adspath),
  72.                0,
  73.                objectGUID,
  74.                [dbo].[f_string_ad_clear](info),
  75.                1
  76. FROM OPENQUERY(ADSI,
  77.         'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''LDAP://DC=MYDOMAIN,DC=RU'' WHERE objectCategory=''Group'' ORDER BY samAccountname')
  78.  
  79. set @rc = @@rowcount
  80.  
  81. select @samAccountname = max(sAMAccountName)
  82. from #usersgrps
  83. where isgroup = 1
  84.  
  85. select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''Group'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  86. print @query
  87. select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 1 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  88. print @query
  89.  
  90. while @rc > 0
  91.     begin
  92.         INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  93.         exec (@query )
  94.         set @rc = @@rowcount
  95.  
  96.         select @samAccountname = max(sAMAccountName)
  97.         from #usersgrps
  98.         where isgroup = 1
  99.  
  100.         select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''Group'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  101.         print @query
  102.         select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 1 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  103.         print @query
  104.     end
  105.  
  106. select * from #usersgrps

среда, 24 августа 2011 г.

MSSQL : Hot keys SQL Server Management Studio

Еще одна вещь которая облегчает жизь, оригинал тут : http://msdn.microsoft.com/ru-ru/library/ms174205.aspx или http://msdn.microsoft.com/en-us/library/ms174205.aspx
тут нет никакой отсебятины, только копия полезной статьи.
Среда Среда SQL Server Management Studio предоставляет пользователям две схемы сочетаний клавиш. По умолчанию используется стандартная схема, при этом сочетания клавиш аналогичны применяемым в среде Microsoft Visual Studio. Вторая схема, называемая схемой SQL Server 2000, напоминает средства SQL Server 2000, в частности сочетания клавиш в программе Query Analyzer. Среда Среда SQL Server Management Studio поддерживает не все сочетания клавиш программы Query Analyzer. Чтобы изменить клавиатурную схему или добавить новые сочетания клавиш, выберите в меню Сервис пункт Параметры. Выберите предпочтительную клавиатурную схему на вкладке Среда страницы Клавиатура.
Сочетания клавиш для активации элементов меню
ДействиеСтандартная схемаСхема SQL Server 2000
Активировать строку меню среды Среда SQL Server Management StudioALTALT
Открыть меню компонента средстваALT + ДЕФИСALT + ДЕФИС
Отобразить контекстное менюSHIFT + F10SHIFT + F10
Отобразить диалоговое окно Создать файлCTRL + NНет эквивалента
Отобразить диалоговое окно Создать проект для создания нового проектаCTRL + SHIFT + NCTRL + SHIFT + N
Отобразить диалоговое окно Открыть файл для открытия существующего файлаCTRL + OCTRL + SHIFT + INS
Отобразить диалоговое окно Открыть проект для открытия существующего проектаCTRL + SHIFT + OНет эквивалента
Отобразить диалоговое окно Добавить новый элемент для добавления нового файла в текущий проектCTRL + SHIFT + AНет эквивалента
Отобразить диалоговое окно Добавить существующий элемент для добавления существующего файла в текущий проектALT + SHIFT + AНет эквивалента
Отобразить окно конструктора запросовCTRL + SHIFT + QCTRL + SHIFT + Q
Закрыть меню
или
диалоговое окно, отменив выполнение действия
ESCESC

Сочетания клавиш для управления окнами и панелью инструментов
ДействиеСтандартная схемаСхема SQL Server 2000
Закрыть текущее дочернее окно MDI-приложенияCTRL + F4CTRL + F4
ПечатьCTRL + PCTRL + P
ВыходALT + F4ALT + F4
Переключиться в полноэкранный режимSHIFT + ALT + ВВОДSHIFT + ALT + ВВОД
Закрыть окно текущего средстваSHIFT + ESCSHIFT + ESC
Перейти к следующему дочернему окну MDI-приложенияCTRL + TABCTRL + TAB
Перейти к предыдущему дочернему окну MDI-приложенияCTRL + SHIFT + TABCTRL + SHIFT + TAB
Активировать панель инструментов окна текущего средстваSHIFT + ALTНет эквивалента
Перейти к окну следующего средстваALT + F6ALT + F6
Перейти к окну, выбранному в предыдущий разSHIFT + ALT + F6SHIFT + ALT + F6
Открыть новое окно редактора запросовНет эквивалентаCTRL + O
Отобразить окно обозревателя объектовF8F8
Отобразить окно зарегистрированных серверовCTRL + ALT + GНет эквивалента
Отобразить окно обозревателя шаблоновCTRL + ALT + TCTRL + ALT + T
Отобразить окно обозревателя решенийCTRL + ALT + LCTRL + ALT + L
Отобразить окно сводкиF7F7
Отобразить окно свойствF4F4
Переключение между представлением списка сведений обозревателя объектов и областью свойств обозревателя объектов.F6Нет эквивалента
Управление разбивкой, которая разделяет представление списка сведений обозревателя объектов и область свойств обозревателя объектов, для настройки размера области отображения.TAB + СТРЕЛКА ВВЕРХ
или
TAB + СТРЕЛКА ВНИЗ
Нет эквивалента
Отобразить область элементовCTRL + ALT + XCTRL + ALT + X
Отобразить окно закладокCTRL + K, CTRL + WНет эквивалента
Отобразить окно браузераCTRL + ALT + RCTRL + ALT + R
Отобразить окно «Список ошибок» (только редактор Transact-SQL)CTRL + \, CTRL + ECTRL + \, CTRL + E

Сочетания клавиш для перемещения курсора
ДействиеСтандартная схемаСхема SQL Server 2000
Переместить курсор на одну позицию влевоСТРЕЛКА ВЛЕВОСТРЕЛКА ВЛЕВО
Переместить курсор на одну позицию вправоСТРЕЛКА ВПРАВОСТРЕЛКА ВПРАВО
Переместить курсор на одну позицию вверхСТРЕЛКА ВВЕРХСТРЕЛКА ВВЕРХ
Переместить курсор на одну позицию внизСТРЕЛКА ВНИЗСТРЕЛКА ВНИЗ
Переместить курсор в начало строкиHOMEHOME
Переместить курсор в конец строкиENDEND
Переместить курсор в начало документаCTRL + HOMECTRL + HOME
Переместить курсор в конец документаCTRL + ENDCTRL + END
Переместить курсор на один экран вверхPAGE UPPAGE UP
Переместить курсор на один экран внизPAGE DOWNPAGE DOWN
Переместить курсор на одно слово вправоCTRL + СТРЕЛКА ВПРАВОCTRL + СТРЕЛКА ВПРАВО
Переместить курсор на одно слово влевоCTRL + СТРЕЛКА ВЛЕВОCTRL + СТРЕЛКА ВЛЕВО

Сочетания клавиш для выделения текста
ДействиеСтандартная схемаСхема SQL Server 2000
Выделить текст от начала документа до курсораCTRL + SHIFT + HOMECTRL + SHIFT + HOME
Выделить текст от позиции курсора до конца документаCTRL + SHIFT + ENDCTRL + SHIFT + END
Выделить текст от начала текущей строки до курсораSHIFT + HOMESHIFT + HOME
Выделить текст от курсора до конца текущей строкиSHIFT + ENDSHIFT + END
Выделять текст по одной строке вниз, начиная от курсораSHIFT + СТРЕЛКА ВНИЗSHIFT + СТРЕЛКА ВНИЗ
Выделять текст по одной строке вверх, начиная от курсораSHIFT + ВВЕРХSHIFT + ВВЕРХ
Переместить курсор на одну строку вверх с расширением блока выделенного текстаSHIFT + ALT + СТРЕЛКА ВВЕРХSHIFT + ALT + СТРЕЛКА ВВЕРХ
Расширить блок выделенного текста на одну страницу вверхSHIFT + PAGE UPSHIFT + PAGE UP
Расширить блок выделенного текста на одну страницу внизSHIFT + PAGE DOWNSHIFT + PAGE DOWN
Выделить весь документCTRL + ACTRL + A
Выделить слово, на котором находится курсор,
или
ближайшее к курсору слово
CTRL + WCTRL + W
Выделить в редакторе блок текста от текущей до предыдущей позиций курсораCTRL + =CTRL + =
Расширить блок выделенного текста до верха текущего окнаCTRL + SHIFT + PAGE UPCTRL + SHIFT + PAGE UP
Переместить курсор в последнюю видимую на экране строку с расширением выделенного блока текстаCTRL + SHIFT + PAGE DOWNCTRL + SHIFT + PAGE DOWN
Расширить блок выделенного текста на одно слово вправоCTRL + SHIFT + СТРЕЛКА ВПРАВОCTRL + SHIFT + СТРЕЛКА ВПРАВО
Расширить блок выделенного текста на одно слово влевоCTRL + SHIFT + СТРЕЛКА ВЛЕВОCTRL + SHIFT + СТРЕЛКА ВЛЕВО
Переместить курсор на одно слово вправо с расширением блока выделенного текстаCTRL + SHIFT + ALT + СТРЕЛКА ВПРАВОCTRL + SHIFT + ALT + СТРЕЛКА ВПРАВО
Переместить курсор на одно слово влево с расширением блока выделенного текстаCTRL + SHIFT + ALT + СТРЕЛКА ВЛЕВОCTRL + SHIFT + ALT + СТРЕЛКА ВЛЕВО

Сочетания клавиш для закладок
ДействиеСтандартная схемаСхема SQL Server 2000
Установить закладку на текущей строке
или
удалить ее
CTRL + K, CTRL + KCTRL + F2
Перейти к следующей закладкеCTRL + K, CTRL + NF2
Перейти к предыдущей закладкеCTRL + K, CTRL + PSHIFT + F2
Очистить закладкиCTRL + K, CTRL + LCTRL + SHIFT + F2

Сочетания клавиш для управления деревьями
ДействиеСтандартная схемаСхема SQL Server 2000
Свернуть узлы дерева— (на цифровой клавишной панели)— (на цифровой клавишной панели)
Развернуть все узлы дерева* (на цифровой клавишной панели)* (на цифровой клавишной панели)
Прокрутить дерево вверхCTRL + СТРЕЛКА ВВЕРХCTRL + СТРЕЛКА ВВЕРХ
Прокрутить дерево внизCTRL + СТРЕЛКА ВНИЗCTRL + СТРЕЛКА ВНИЗ

Сочетания клавиш редактора кода
Отдельные редакторы кода могут поддерживать не все сочетания клавиш.
ДействиеСтандартная схемаСхема SQL Server 2000
Переключиться в полноэкранный режим
или
выйти из него
SHIFT + ALT + ВВОДSHIFT + ALT + ВВОД
Прокрутить текст вверх на одну строкуCTRL + СТРЕЛКА ВВЕРХCTRL + СТРЕЛКА ВВЕРХ
Прокрутить текст вниз на одну строкуCTRL + СТРЕЛКА ВНИЗCTRL + СТРЕЛКА ВНИЗ
Отменить последнее действие по изменению кодаCTRL + ZCTRL + Z
Восстановить отмененное действиеCTRL + SHIFT + Z
или
CTRL + Y
или
ALT + SHIFT + BACKSPACE
CTRL + SHIFT + Z
или
CTRL + Y
или
ALT + SHIFT + BACKSPACE
Вставить текст указанного файла в текущее окноНет эквивалентаCTRL + SHIFT + P
Сохранить выбранный элементCTRL + SCTRL + S
Сохранить всеCTRL + SHIFT + SCTRL + SHIFT + S
ЗакрытьCTRL + F4CTRL + F4
ПечатьCTRL + PCTRL + P
ВыходALT + F4ALT + F4
Удалить весь текст из текущего файлаCTRL + SHIFT + DELCTRL + SHIFT + DEL
Отобразить диалоговое окно Переход к строкеCTRL + GCTRL + G
Увеличить отступ перед строкойTABTAB
Уменьшить отступ перед строкойSHIFT + TABSHIFT + TAB
Преобразовать выделенный текст в верхний регистр.CTRL + SHIFT + UCTRL + SHIFT + U
Преобразовать выделенный текст в нижний регистрCTRL + SHIFT + LCTRL + SHIFT + L
Сделать выделенный текст примечаниемCTRL + K, CTRL + CCTRL + SHIFT + C
Снять комментарий с выделенного текстаCTRL + K, CTRL + UCTRL + SHIFT + R
Открыть новый запрос в контексте текущего соединенияCTRL + QCTRL + N
Открыть базу данных в обозревателе объектовALT + F8ALT + F8
Указать значения параметров шаблонаCTRL + SHIFT + MCTRL + SHIFT + M
Выполнить фрагмент кода, выделенный в редакторе запросов,
или
весь код, находящийся в редакторе запросов, если ничего не выделено
F5
или
CTRL + E
или
ALT + X
F5
или
CTRL + E
или
ALT + X
Выполнить синтаксический анализ фрагмента кода, выделенного в редакторе запросов,
или
всего кода, находящегося в редакторе запросов, если ничего не выделено
CTRL + F5CTRL + F5
Отобразить предполагаемый план выполненияCTRL + LCTRL + L
Отменить выполняемый запросALT + BREAKALT + BREAK
Включить действительный план выполнения в данные, выведенные запросомCTRL + MCTRL + K
Открыть диалоговое окно Параметр запросаНет эквивалентаCTRL + SHIFT + O
Вывести результаты в сеткуCTRL + DCTRL + D
Вывести результаты в текстовом форматеCTRL + TCTRL + T
Вывести результаты в файлCTRL + SHIFT + FCTRL + SHIFT + F
Отобразить
или
скрыть панель результатов выполнения запроса
CTRL + RCTRL + R
Переключение между панелями запроса и результатов выполнения запросаF6F6
Перейти к следующему активному окну в Management Studio CTRL + F6CTRL + F6
Скрыть все автоматическиALT + ВВОДНет эквивалента
ОкнаCTRL + WНет эквивалента
Открыть приложение Приложение SQL Server ProfilerCTRL + ALT + PCTRL + ALT + P

Сочетания клавиш для работы с текстом в редакторе кода
ДействиеСтандартная схемаСхема SQL Server 2000
Вставить символ переноса строкиВВОД
или
SHIFT + ВВОД
ВВОД
или
SHIFT + ВВОД
Поменять местами два символа, расположенные слева и справа от курсора (неприменимо в редакторе SQL)CTRL + TНет эквивалента
Удалить символ, расположенный справа от курсораDELETEDELETE
Удалить символ, расположенный слева от курсораBACKSPACE
или
SHIFT + BACKSPACE
BACKSPACE
или
SHIFT + BACKSPACE
Вставить в текст последовательность пробелов, длина которой указана в настройках редактораTABTAB
Вставить в текст пустую строку выше курсораCTRL + ВВОДCTRL + ВВОД
Вставить в текст пустую строку ниже курсораCTRL + SHIFT + ВВОДCTRL + SHIFT + ВВОД
Преобразовать выделенный текст в нижний регистрCTRL + SHIFT + LCTRL + SHIFT + L
Преобразовать выделенный текст в верхний регистрCTRL + SHIFT + UCTRL + SHIFT + U
Переключение между режимами вставки и замены текстаINSERTINSERT
Переместить выделенные строки к левой позиции табуляцииSHIFT + TABSHIFT + TAB
Удалить слово, расположенное справа от курсораCTRL + DELETECTRL + DELETE
Удалить слово, расположенное слева от курсораCTRL + BACKSPACECTRL + BACKSPACE
Поменять местами слова, расположенные слева и справа от курсора (неприменимо в редакторе SQL)CTRL + SHIFT + TCTRL + SHIFT + T

Сочетания клавиш отладчика Transact-SQL
ДействиеStandardSQL Server 2000
Начать
или
продолжить отладку
ALT + F5Нет эквивалента
Остановить отладкуSHIFT + F5Нет эквивалента
Шаг с заходомF11Нет эквивалента
Шаг с обходомF10Нет эквивалента
Шаг с выходомSHIFT + F11Нет эквивалента
Реализация команды Выполнить до курсораCTRL + F10Нет эквивалента
Отобразить диалоговое окно Контрольное значениеQuickWatch.CTRL + ALT + QНет эквивалента
Переключить точку остановаF9Нет эквивалента
Удалить все точки остановаCTRL + SHIFT + F9Нет эквивалента
Отобразить окно Точки остановаCTRL + ALT + BНет эквивалента
Приостановить всеCTRL + ALT + BREAKНет эквивалента
Отобразить окно Просмотр значений 1CTRL + ALT + W, 1Нет эквивалента
Отобразить окно Просмотр значений 2CTRL + ALT + W, 2Нет эквивалента
Отобразить окно Просмотр значений 3CTRL + ALT + W, 3Нет эквивалента
Отобразить окно Просмотр значений 4CTRL + ALT + W, 4Нет эквивалента
Отобразить окно Автоматические значенияCTRL + ALT + V, AНет эквивалента
Отобразить окно Локальные значенияCTRL + ALT + V, LНет эквивалента
Отобразить окно ИнтерпретацияCTRL + ALT + IНет эквивалента
Отобразить окно Стек вызоваCTRL + ALT + CНет эквивалента
Отобразить окно ПотокиCTRL + ALT + HНет эквивалента

Сочетания клавиш для технологии Microsoft IntelliSense
ДействиеСтандартная схемаСхема SQL Server 2000
Показать список элементовCTRL + ПРОБЕЛ
или
CTRL + J
CTRL + J
Дополнить словоALT + ВПРАВОALT + ВПРАВО
Сведения о параметрахCTRL + SHIFT + ПРОБЕЛНет эквивалента
Обновление локального кэшаCTRL + SHIFT + RНет эквивалента
Перейти между синтаксическими парамиCTRL + ]Нет эквивалента

Сочетания клавиш для окна документов и браузера
ДействиеСтандартная схемаСхема SQL Server 2000
Переключиться в полноэкранный режим
или
выйти из него
SHIFT + ALT + ВВОДSHIFT + ALT + ВВОД
Перейти к следующей панели представления документа с разделенными панелямиF6F6
Перейти к предыдущему документу в редакторе
или
конструкторе
CTRL + SHIFT + F6 CTRL + SHIFT + TABCTRL + SHIFT + F6 CTRL + SHIFT + TAB
Перейти к предыдущей панели документа в представлении с разделенными панелямиSHIFT + F6SHIFT + F6
Отобразить окно браузераCTRL + ALT + RCTRL + ALT + R
Отобразить предыдущую страницу в журнале просмотра страницALT + ВЛЕВОALT + ВЛЕВО
Отобразить следующую страницу в журнале просмотра страницALT + ВПРАВОALT + ВПРАВО

Сочетания клавиш обозревателя решений
ДействиеСтандартная схемаСхема SQL Server 2000
Отобразить окно обозревателя решенийCTRL + ALT + LCTRL + ALT + L
Отобразить диалоговое окно Создать файлCTRL + NCTRL + SHIFT + INS
Отобразить диалоговое окно Создать проект для создания нового проектаCTRL + SHIFT + NCTRL + SHIFT + N
Отобразить диалоговое окно Открыть файл для открытия существующего файлаCTRL + OНет эквивалента

Сочетания клавиш для работы со справкой и электронной документацией
ДействиеСтандартная схемаСхема SQL Server 2000
СправкаF1F1
Справка по разделу «Инструкции»CTRL + F1CTRL + F1
Выбрать в электронной документации вкладку «Оглавление»CTRL + ALT + F1CTRL + ALT + F1
Выбрать в электронной документации вкладку «Указатель»CTRL + ALT + F2CTRL + ALT + F2
Открыть в справочной системе окно поискаCTRL + ALT + F3CTRL + ALT + F3
Динамическая справкаCTRL + ALT + F4CTRL + ALT + F4
Избранные разделы справкиCTRL + ALT + FCTRL + ALT + F

Сочетания клавиш для поиска
ДействиеСтандартная схемаСхема SQL Server 2000
Отобразить диалоговое окно НайтиCTRL + FCTRL + F
Отобразить диалоговое окно ЗаменитьCTRL + HCTRL + H
Начать последовательный поиск. Введите последовательность символов, которую нужно найти,
или
нажмите CTRL + I для поиска тех же символов, что и в предыдущий раз.
CTRL + ICTRL + B
Найти следующее вхождение искомой последовательности символов в текстF3F3
Найти предыдущее вхождение искомого текстаSHIFT + F3SHIFT + F3
Найти следующее вхождение выделенного текстаCTRL + F3CTRL + F3
Найти предыдущее вхождение выделенного текстаCTRL + SHIFT + F3CTRL + SHIFT + F3
Отобразить диалоговое окно Заменить в файлахCTRL + SHIFT + HCTRL + SHIFT + H
Изменить направление поиска с уточнением критериев, чтобы он выполнялся от конца файла к началуCTRL + SHIFT + ICTRL + SHIFT + I
Установить
или
снять флажок Искать вверх в диалоговом окне Найти и заменить
ALT + F3, BALT + F3, B
Остановить выполнение операции Найти в файлахALT + F3, SALT + F3, S
Установить
или
снять флажок Искать слово в диалоговом окне Найти и заменить
ALT + F3, WALT + F3, W
Установить
или
снять флажок Шаблон в диалоговом окне Найти и заменить.
ALT + F3, PALT + F3, P

Сочетания клавиш для вырезания и вставки текста
ДействиеСтандартная схемаСхема SQL Server 2000
Вырезать (удалить выделенный элемент и поместить его в буфер обмена)CTRL + X
или
SHIFT + DELETE
CTRL + X
или
SHIFT + DELETE
Скопировать данные в буфер обменаCTRL + C
или
CTRL + INSERT
CTRL + C
или
CTRL + INSERT
Вставить данные из буфера обмена в позицию вставкиCTRL + V
или
SHIFT + INSERT
CTRL + V
или
SHIFT + INSERT

Сочетания клавиш средства просмотра журналов
ДействиеСтандартная схемаСхема SQL Server 2000
ОбновитьF5F5
Переключаться между панелями Выбор журналов и Сведения журналаF6F6
Перейти на панель Сведения журналаALT + SALT + S
Загрузить новый журналCTRL + SHIFT + LCTRL + SHIFT + L
Экспортировать журналCTRL + SHIFT + ECTRL + SHIFT + E
Отфильтровать журналCTRL + SHIFT + FCTRL + SHIFT + F
Поиск в журналеCTRL + SHIFT + SCTRL + SHIFT + S

Сочетания клавиш монитора активности
ДействиеСтандартная схемаСхема SQL Server 2000
ОбновитьF5F5
Отфильтровать отображаемые монитором сведенияCTRL + SHIFT + FCTRL + SHIFT + F

Сочетания клавиш монитора репликации
ДействиеСтандартная схемаСхема SQL Server 2000
ОбновитьF5F5
Открыть окно сведений из сеткиВВОДВВОД

Сочетания клавиш средства просмотра конфликтов репликации
ДействиеСтандартная схемаСхема SQL Server 2000
Определить фильтрF6F6
Применить фильтрF7F7
Показать все столбцыF8F8

пятница, 22 июля 2011 г.

MSSQL : Оптимизация запросов - убираем корреляцию в запросах.

Собственно нашел давно картинку, которая очень помогает в решении задач по оптимизации.
Например когда надо проверить (не)существование значений в другой таблице по заданным параметрам.

Самый простой вариант НЕ ПРАВИЛЬНЫХ запросов выглядит следующим образом
Вывести строки из t1, на которые есть ссылки в таблице t2
select * from t1
where exists(select * from t2 where t2.t1id = t1.id)

или на оборот,
select * from t1
where not exists(select * from t2 where t2.t1id = t1.id)


некоторые программисты начали пытаться ускорить код следующиими вариантами
select * from t1
where exists(select top 1 1 from t2 where t2.t1id = t1.id)

или на оборот,
select * from t1
where not exists(select top 1 1 from t2 where t2.t1id = t1.id)


Честно говоря я понимаю что есть ситуации когда без таких конструкций не обойтись, и в моей практике такое тоже встречалось. Но все же лучше пользоваться "умножения" таблиц
Получение строк, на которые есть ссылки в подчиненной таблице
select distinct t1.*
from t1
inner join t2 on t2.t1id = t1.id

И получение строк, на которые нет ссылок в подчиненной таблице
select distinct t1.*
from t1
left join t2 on t2.t1id = t1.id
where t2.id is null


Вобщем пользуйтесь на здоровье, и избегайте не нужной работы серверов

MSSQL : Оптимизация запросов - убираем TOP 1

Иногда бывает необходимо получить только некие "верхние" записи из подчиненной таблицы
Кто-то делает так:
select *
, (select top 1 t2.id from t2 where t1Id = t1.id)
, (select top 1 t2.someData from t2 where t1Id = t1.id)
from t1


Чем плох такой вариант? А плох он следующим.
Мы ориентируемся на некое "верхнее" значение, которое может не относиться в нужной нам последовательности в итоге.
Кроме этого, у нас может возникнуть ситуация когда вызовы "верхнего" значения будут относиться к разным строкам таблицы.
Что тогда будете делать?
Поэтому я предлагаю использовать агрегирующий подзапрос

select *
from t1
inner join (select max(id) id, t1Id from t2 group by t1Id) T2i on t1.id = T2i.t1Id
inner join t2 on t2.id = T2i.id

В большинстве своем мы получим более лучший план запроса, эффективность во времени, предсказуемость (точность) результата.

вторник, 5 июля 2011 г.

MSSQL : Уровни изоляции в MS SQL - READ UNCOMMITTED

READ UNCOMMITTED
Уровень изоляции READ UNCOMMITTED позволяет читать данные, измененные другими транзакциями, но еще не зафиксированными. Транзакции, запущенные с таким уровнем изоляции, не блокируют строки/объекты с которыми оперируют. Чтение в таком режиме также носит название "грязное чтение".
Так как READ UNCOMMITTED не блокирует доступ к своим объектам и может работать с заблокированными объектами, то может возникнуть ситуация, когда данные будут то появляться, то исчезать.

Откроем теперь 3 окна запроса
в 1-м окне введем:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED
GO
BEGIN TRANSACTION

select * from t1

update t1
set textdata = 'thread 1'

select * from t1
GO
во 2-м окне
SET TRANSACTION ISOLATION LEVEL READ COMMITED
GO
BEGIN TRANSACTION

select * from t1

update t1
set textdata = 'thread 2'

select * from t1

COMMIT TRANSACTION
GO

в 3-м окне:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED
GO
BEGIN TRANSACTION

select * from t1

update t1
set textdata = 'thread 3'

select * from t1

COMMIT TRANSACTION
GO
Запустите первый пакет, потом 2-й и 3-й.
Мы увидим, что если в 1-м пакете не закрыта транзакция, то 2-й и 3-й пакеты будут ожидать закрытия, но ожидать они будут в разных точках.
2-й пакет будет ожидать чтения (1-й select)
3-й пакет будет ожидать записи/обновления

MSSQL : Уровни изоляции в MS SQL - READ COMMITTED

Все существует 5 уровней изоляции транзакций
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SNAPSHOT
SERIALIZABLE

READ COMMITTED
В режиме READ COMMITTED инструкции sql запроса будут читать только те данные, которые были зафиксированы предыдущими/параллельными транзакциями. Если же на читаемы данные была наложена блокировка, то текущий пакет инструкций будет ожидать высвобождения ресурса. Например, есть два пакета инструкций, запущенных одновременно, рассмотрим пример, в Microsoft SQL Manegment Studio откроем 2 окна запроса, в первом запустите следующий код
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT * FROM t1

UPDATE t1
SET textdata = 'Thread_1'
WHERE row = 1

-- !!!Важно!!! - не фиксируем транзакцию
GO
во втором запускаем аналогичный код
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT * FROM t1

UPDATE t1
SET textdata = 'Thread_2'
WHERE row = 1

SELECT * FROM t1

COMMIT TRANSACTION
GO
В результате, если запустить 1-й код а следом запустить 2-й, мы получим во 2-м коде ожидание завершения транзакции в первом окне.
Добавьте в первое окно следующую строку:
COMMIT TRANSACTION

И исполните только ее. Переключившись во 2-е окно мы увидим результат выполнения 2-го пакета , две выборки до изменения и после внесения изменений в таблицу t1.
Принцип работы этих пакетов можно отобразить на временной оси.


момент времени123456
запрос 1начало транзакциивнесение измененийфиксация изменений
запрос 1начало транзакцииожидание запроса 1внесение измененийфиксация транзакции

Базы Данных

Думаю придтся начать "цикл" статей по моему основному профилю - базы данных.
Причина - надоело постоянно искать ответы на уже не однократно заданные мною вопросы.
С одной стороны это будет handbook за моим авторством, с другой - BookOnLine, третей - перевод понравившихся статей.
Да!!! Я не люблю редмоновского гиганта, но в большинстве своем работаю именно с ним, таковы реалии.

среда, 2 марта 2011 г.

История дня по итогам голосования за 26 января 2011 от Анекдоты из России - Anekdot.ru

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

И вот перед четвёртой и последней пересдачей (за ней как правило следует отчисление) в кабинет к преподу заходит папаша этого студента и кладёт ему на стол ключи от чудного произведения отечественного автопрома 15-й модели со словами:

- Если он сдаст, то она твоя!

Препод некоторое время смотрит на папашу, потом из нагрудного кармана достает ключи от BMW Х-5 и кладёт на стол рядом с его ключами со словами:

- ЕСЛИ твой сын сдаст, то она твоя!