Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Информационный Канал Subscribe.Ru


#131<<  #132

СОДЕРЖАНИЕ

1.СОВЕТЫ
1.1.SQL транзакции и ASP
1.2.Безопасность Microsoft SQL Server 2000 (ПРОДОЛЖЕНИЕ)
2.ССЫЛКИ НА СТАТЬИ
2.1.Отечественные статьи
2.2.Новые технические статьи Microsoft
2.3.Англоязычные статьи
3.ПОЛЕЗНОСТИ
3.1.ОБНОВЛЕНИЕ: Презентация "Безопасность Microsoft SQL Server 2000"
4.ФОРУМ SQL.RU
4.1.Самые популярные темы недели
4.2.Вопросы остались без ответа

СОВЕТЫ

SQL транзакции и ASP

Автор: Вадим Ковальчученко

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

Аналогично, если данные в таблице - это результаты вычислений, зависящих от значений в других таблицах, то, изменяя данные в таблицах-аргументах, необходимо поменять значения и в результирующей таблице.

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

[Содержание]

Понятие транзакции

Для себя я определяю транзакцию как несколько SQL-запросов, которые сервер должен выполнить последовательно, при этом все запросы должны быть выполнены успешно. Если хотя бы один из запросов не будет выполнен, база данных останется без изменений.

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

[Содержание]

Способы начала транзакции

Для клиентских приложений, работающих с SQL-сервером напрямую, начать транзакцию несложно. Устанавливая соединение, приложение выполняет команду BEGIN TRAN и выполняет все необходимые запросы. В конце блока команд приложение посылает команду COMMIT TRAN, и если все запросы и вычисления были выполнены успешно, то транзакция фиксируется.

Однако для интернет-приложений, работающих с SQL-сервером через web-сервер, ситуация сложнее. По умолчанию каждый запрос выполняется как отдельная единичная транзакция, которая начинается и тут же завершается. Кроме того, web-приложение не может послать SQL-серверу ничего, кроме непосредственно SQL-запроса (SELECT, INSERT, UPDATE и т.д.). Что же делать? Как реализовать логику приложения и в то же время иметь возможность возврата к предыдущему состоянию?

ADO (ActiveX Document Object) предоставляет два способа начать транзакцию внутри исполняемого скрипта ASP.

Первый способ - это объявить в начале скрипта директиву

<%@ TRANSACTION=Required %>

В этом случае ВСЕ выражения скрипта рассматриваются в теле единичной транзакции. Вроде бы это то, что нам нужно. Однако отследить, какое же действие вызвало нарушение транзакции, здесь чрезвычайно трудно. Все, что можно сделать, это только определить процедуру сообщения для пользователя, которая обрабатывает скрипт при появлении события фиксирования или отката транзакции (OnTransactionCommit и OnTransactionAbort соответственно).

Второй способ - объявить начало транзакции непосредственно в скрипте, перехватить коды ошибок выполнения транзакций и на основе их значений определить необходимость фиксирования или отката.

ASP-код:

     <%
     ' Transaction
     ' Prepare Transaction Statements
      ' Statement1
       stmt_1 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_1)

      ' Statement2
       stmt_2 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_2)

      ' Statement3
       stmt_3 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_3)

      ' Statement4
       stmt_4 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_4)

      ' Statement5
       stmt_5 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_5)


      ' Start transaction
      X=cn.BeginTrans
       On Error Resume Next
       cn.Execute (stmt_1)
       if Not (Cint(Err.Number) = 0)
   then Success1=False else Success1=True

       On Error Resume Next
       cn.Execute (stmt_2)
       if Not (Cint(Err.Number) = 0)
   then Success2=False else Success2=True

       On Error Resume Next
       cn.Execute (stmt_3)
       if Not (Cint(Err.Number) = 0)
   then Success3=False else Success3=True

       On Error Resume Next
       cn.Execute (stmt_4)
       if Not (Cint(Err.Number) = 0)
   then Success4=False else Success4=True

       On Error Resume Next
       cn.Execute (stmt_5)
       if Not (Cint(Err.Number) = 0)
   then Success5=False else Success5=True

      On Error GoTo 0
     '  trc("Success1="&Success1)
     '  trc("Success2="&Success2)
     '  trc("Success3="&Success3)
     '  trc("Success4="&Success4)
     '  trc("Success5="&Success5)

     ' Commit Transaction
      If Cbool ((Success1=True) AND (Success2=True) AND (Success3=True)
                                AND (Success4=True) AND (Success5=True) ) then
        cn.CommitTrans
        bool_Trans = True
      Else
        cn.RollBackTrans
        bool_Trans = False
      End if
     ' End transaction
     %>

Приведенный выше код я записал в Code Template своего любимого редактора HomeSite, вставляю его в код приложения и модифицирую как нужно.

[Содержание]

Анализ кода

Рассмотрим код транзакции по частям.

1. Подготовка.

 ' Prepare Transaction Statements
      ' Statement1
       stmt_1 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_1)

      ' Statement2
       stmt_2 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_2)

      ' Statement3
       stmt_3 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_3)

      ' Statement4
       stmt_4 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_4)

      ' Statement5
       stmt_5 = " SELECT field1, field2 " &_
                            " FROM table AS alias " &_
                            " WHERE field1 = field2 "
       'trc(stmt_5)

В начале мы подготавливаем все SQL-запросы, которые будут участвовать в транзакции. Если какой-то запрос формируется на основе значений, которые будут получены в результате выполнения предыдущих запросов, то его придется включить в тело транзакции. Я помещаю SQL-запросы до транзакции, так как их проще оттрассировать, пока еще ничего не началось. Кстати, о трассировке. Под запросом расположен вызов моей простенькой функции для распечатки ее аргументов. В данном случае аргументом будет текст запроса. Определение функции записано в function.asp (подключаемом модуле).


Function trc(var)
 Response.Write "<p><em>var=" & var & "</em></p>"
End function

2. Начало транзакции.


 X=cn.BeginTrans

Это и есть точка начала транзакции, где cn - имя объекта (типа ADODB.Connection).

3. Выполнение запросов

Это непосредственное выполнение запросов в теле транзакции.


       On Error Resume Next
       cn.Execute (stmt_1)
       if Not (Cint(Err.Number) = 0) then Success1=False else Success1=True

       On Error Resume Next
       cn.Execute (stmt_2)
       if Not (Cint(Err.Number) = 0) then Success2=False else Success2=True

       On Error Resume Next
       cn.Execute (stmt_3)
       if Not (Cint(Err.Number) = 0) then Success3=False else Success3=True

       On Error Resume Next
       cn.Execute (stmt_4)
       if Not (Cint(Err.Number) = 0) then Success4=False else Success4=True

       On Error Resume Next
       cn.Execute (stmt_5)
       if Not (Cint(Err.Number) = 0) then Success5=False else Success5=True

      On Error GoTo 0

Перед тем как выполнять запрос, я устанавливаю режим обработки ошибок с помощью выражения On Error Resume Next. Во время отлаживания скрипта можно было бы обойтись и без него, но ведь скрипт будет работать в реальном приложении, поэтому негоже (и даже недопустимо!) показывать пользователю SQL-ошибки.

Команда cn.Execute (stmt_1) пытается исполнить запрос. Здесь cn - это идентификатор объекта типа ADODB.Connection, Execute - метод (команда), исполняющая запрос, stmt_1 - строковая переменная, содержащая тело запроса.

Далее я оцениваю успешность выполнения запроса. Глобальная переменная Err.Number содержит код ошибки. Выполняю ее приведение к целому типу и сравниваю с нулем. Если код ошибки НЕ равен нулю, запрос НЕ был выполнен, тогда флаг ошибки с номером запроса становится равным FALSE, иначе TRUE.

Обратите внимание, что для правильной обработки ошибки необходимо выполнять выражение On Error Resume Next перед каждым вызовом метода Execute.

В конце выполнения транзакции я отключаю обработку ошибок, выполняя выражение On Error GoTo 0.

По не вполне понятным для меня причинам, если попытаться оценить код ошибки на РАВЕНСТВО с нулем, код перестает работать и флаги выставляются в значение FALSE, вне зависимости от правильности выполнения запроса.

4. Первичная трассировка.


     '  trc("Success1="&Success1)
     '  trc("Success2="&Success2)
     '  trc("Success3="&Success3)
     '  trc("Success4="&Success4)
     '  trc("Success5="&Success5)

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

5. Завершение транзакции.


      If Cbool ((Success1=True) AND (Success2=True) AND (Success3=True)
                                AND (Success4=True) AND (Success5=True) ) then
        cn.CommitTrans
        bool_Trans = True
      Else
        cn.RollBackTrans
        bool_Trans = False
      End if
     ' End transaction

С помощью логического оператора AND я определяю, все ли флаги выполнения запросов установлены в значение TRUE. Если все - транзакцию можно фиксировать командой(методом) CommitTrans, а также выставить общий флаг успешного завершения транзакции - bool_Trans = True. В противном случае транзакция откатывается при помощи метода RollBackTrans, а флаг выставляется в значение bool_Trans = False.

Флаг выставляется для того, чтобы позже выдать сообщение об ошибке в контексте web-страницы. Можно будет, конечно, СНОВА оценить все флаги запросов, но зачем делать дополнительные вычисления?

[Содержание]

Отладка кода

Получив сообщение об откате транзакции, я раскомментирую блок первичной трассировки флагов запросов и выполняю код снова:


      trc("Success1="&Success1)
       trc("Success2="&Success2)
       trc("Success3="&Success3)
       trc("Success4="&Success4)
       trc("Success5="&Success5)

Так становится ясно, какой запрос не получается выполнить. Допустим, что флаг Success3 = FALSE.

Перехожу к строке запроса N3 и раскомментирую трассировку:

trc(stmt_3)

Полученную строку копирую в браузере и вставляю в SQL Query Analizer, который сразу выдает информацию о характере ошибки (Syntax Error, несоответствующие права доступа и т.д.).

Добившись выполнения запроса в Query Analizer, переношу запрос в скрипт, заменив константы на переменные, и пробую выполнить транзакцию снова. Если флаг ошибки тот же, перехожу к строке выполнения запроса:

 On Error Resume Next
       cn.Execute (stmt_3)
       if Not (Cint(Err.Number) = 0) then Success3=False else Success3=True

Вставляю

 On Error GoTo 0

перед

 cn.Execute (stmt_3)

отключая тем самым режим обработки ошибок. В браузере появляются код и описание ASP- и SQL-ошибки (неправильное использование объекта Сonnection, отсутствие прав на изменение объектов базы данных и т.д.). Добившись выполнения запроса, комментирую трассировки и команду завершения обработки ошибок и снова пытаюсь выполнить транзакцию. Если получена новая ошибка, повторяю процесс отладки снова.

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

[Содержание]

Преимущества метода

По сравнению с методом объявления директивы @ TRANSACTION, явное объявление транзакции обладает двумя не оспоримыми преимуществами - легкостью отладки именно SQL-запросов и возможностью тестировать web-приложение в реальной базе данных без фиксирования изменений. Ничто ведь не мешает НЕ фиксировать транзакцию ВООБЩЕ, а просто откатывать ее во всех случаях и выставлять флаги завершения. Можно даже получать результаты запросов на вставку (удаление) данных, НЕ фиксируя их фактически. Для этого достаточно выполнить соответствующий запрос на выборку данных ДО отката транзакции.

[Содержание]

Альтернативы

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

Что делать тем, кто не имеет доступа на SQL-сервер с обработкой транзакций? Посочувствуем им, жизнь их сильно затруднена. Создать полноценное устойчивое приложение без транзакций чрезвычайно сложно.

Что делать тем, кто пишет на PHP? Не знаю. Насколько мне известно, PHP не имеет синтаксиса и методов для явного или неявного объявления транзакций. Переходите на ASP.

Автор готов принять все возмущенные отклики и рецензии на эту статью по адресу http://lord.o2.kz/message.asp

С уважением,
Вадим Ковальчученко.

Вадим Ковальчученко - автор ненаписанных и нигде не опубликованных работ по связкам SQL-ASP-PHP. Работает консультантом информационных систем консалтинговой компании Deloitte & Touche в Алма-Ате. Его портфолио web-мастера и разработчика находится по адресу http://lord.o2.kz

[Содержание]

Безопасность Microsoft SQL Server 2000 (ПРОДОЛЖЕНИЕ)

По материалам статьи Richard Waymire и Ben Thomas: Microsoft SQL Server 2000 Security

1.    Введение
2.    Новшества безопасности SQL Server 2000
2.1. Безопасная инсталляция
2.2. Установка Microsoft SQL Server 2000 Desktop Engine
2.3. Уровень безопасности C2
2.4. Kerberos и делегирование в среде Windows 2000

2.5. Аудит безопасности

Как уже отмечалось выше в этой статье, сертификация по уровню безопасности C2 подразумевает наличие у SQL Server 2000 встроенной, развитой системы аудита, которая состоит из нескольких компонент, описанных ниже. Совместно, эти компоненты позволяют отслеживать попытки применения любых прав в рамках SQL Server 2000.

[Содержание]

2.5.1. SQL trace

SQL trace - это серверные компоненты обеспечения аудита. Аудит был добавлен к аналогичному механизму SQL Server 7.0, предоставляющему информацию об эффективности SQL Server. Информация об эффективности по прежнему доступна, но в SQL Server 2000 этот интерфейс был полностью пересмотрен. Все соответствующие хранимые процедуры SQL Server 7.0 были изменены.
Сообщения аудита безопасности обслуживаются на уровне реляционного ядра или движка базы данных SQL Server, с уведомлением механизма трассировки (SQL trace). При запущенном механизме трассировки, происходит фиксация имеющихся сообщений в соответствующий файл трассировки.
Для получения дополнительной информации о новых хранимых процедурах, используемых для аудита безопасности, о запуске трассировки и включении режима C2 - см. SQL Server 2000 Books Online.

[Содержание]

2.5.2. SQL Profiler

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

[Содержание]

2.5.3. Режим аудита C2

Режим аудита C2 предопределяет набор отслеживаемых событий (все события безопасности), которые фиксируют данные (всё, что несёт информацию об этих событиях), и другие установленные параметры настройки. Каждый из возможных режимов описан в SQL Server Books Online.

[Содержание]

2.6. Исключение SQLAgentCmdExec Proxy Account

В SQL Server 2000 учетная записи SQLAgentCmdExec не создаётся, в отличие от SQL Server 7.0 и более ранних версий, где эта учётная запись применялась для заданий по расписанию SQL Server Agent, запускаемых из контекста безопасности логина, не имеющего привилегий системного администратора, для получения доступа к ресурсам Windows. Это была локальная учетная запись пользователя Windows NT 4.0 и Windows 2000, созданная при установке SQL Server.
По умолчанию, для не системных администраторов, способность обращаться к внешним, по отношению к SQL Server, ресурсам заблокирована. Однако, в SQL Server 2000 можно предоставить такому логину возможность работы с внешними ресурсами через контекст безопасности представительской учётной записи пользователя домена. Это позволит логинам, не являющимися членами серверной роли системных администраторов, обращаться к ресурсам сети, причём преимущественно по отношению к локальным ресурсам компьютера, на котором установлен SQL Server.

[Содержание]

2.7. Расширение набора серверных ролей

В SQL Server 2000 был расширен набор фиксированных серверных ролей. Для получения более полной информации о фиксированных серверных ролях, см. раздел "Предопределенные роли", который будет ниже в этой статье.

[Содержание]

2.7.1. Bulkadmin

BulkAdmin - это новая роль SQL Server 2000. Логины, включенные в эту роль, могут выполнять команду BULK INSERT. Пользователи, являющиеся членами этой группы, будут иметь возможность загружать данные из любого файла в сети и с любого компьютера, находясь в контексте безопасности учетной записи запускающей сервис MSSQLServer. Следует очень ответственно относиться к включению логинов в эту серверную роль. Для того, что бы члены этой роли могли выполнить команду BULK INSERT в какую-либо таблицу, им требуется иметь право на INSERT для этой таблицы. Членство в этой фиксированной серверной роли предоставляет права только на исполнение инструкции BULK INSERT и на обращение к файлам в течении исполнения команды.

[Содержание]

2.7.2. Securityadmin

Роль SecurityAdmin даёт право на изменение паролей логинов в режиме аутентификации SQL Server Authentication. Исключение из этого составляют только пароли членов фиксированной серверной роли sysadmin, которые не могут быть сброшены.

[Содержание]

2.7.3. Serveradmin

Роль ServerAdmin была расширена для обеспечения возможности управления серверными сообщениями. Членство в этой роли позволяет теперь логину исполнять хранимые процедуры: sp_addmessage, sp_dropmessage и sp_altermessage.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

[Содержание]

ССЫЛКИ НА СТАТЬИ

Отечественные статьи

Основные концепции и подходы при создании контекстно-поисковых систем на основе реляционных баз данных
Когда передо мной поставили задачу разработки поисковой системы, то мне пришлось изобретать велосипед. Эта статья имеет цель избавить Вас от необходимости изобретать велосипед и позволит Вам сконцентрироваться на расширении и совершенствовании предложенного мной механизма. Я не претендую на роль первоисточника и не утверждаю, что предложенный мною подход является самым оптимальным, но позже я исследовал несколько бесплатных пакетов, обеспечивающих сервис контекстного поиска, и могу Вам с уверенностью сказать, что в основной своей массе они используют этот же подход...
TreeView и база данных
Часто возникает задача отображения древовидной структуры. К примеру, для отображения структуры предприятия, генеалогического дерева и др. Для этой цели как нельзя лучше подходит компонент TreeView, размещенный на закладке Win32...

[Содержание]

Новые технические статьи Microsoft

PRB: SQL Server Only Uses Two GB of Memory Even Though the AWE Option is Enabled
PRB: SQL Server Books Online Incorrectly States the Type of Result Set for @@CPU_BUSY, @@IO_BUSY and @@IDLE Functions Is Milliseconds Instead of Ticks
PRB: SQL Server Agent Job Fails with Error Message "...Driver's SQLSetConnectAttr failed..."
PRB: SQL Server 7.0 Setup Fails When ODBC Components on Your System Need Updating
PRB: ODBC Connection Failed: SQLState: '08001' DBMSSOCN
PRB: LIKE Predicates Are Not Remoted to SQL Server 7.0 After You Install SQL Server 2000 Service Pack 3
PRB: IIS Lock Down Tool May Break RDA or Replication That Uses Anonymous Authentication
PRB: "Incorrect Syntax Near" Error When You Run the DBCC CHECKCONSTRAINTS Statement
Overview of the SQL 2000 Critical Update Wizard
MS01-041: Malformed RPC Request Can Cause Service Problems
Microsoft Network Security Hotfix Checker (Hfnetchk.exe) Tool Is Available
INFO: Using MSDE 2000 With SQL Server CE RDA and Replication
INFO: SQL Server CE Performance Tips and Efficient Memory Handling
INF: Troubleshooting SQL Server 2000 Log Shipping "Out of Sync" Errors
INF: Readme.txt for SQL Server 7.0 Service Pack 2
INF: How to Obtain the Latest SQL Server 2000 Service Pack
INF: Frequently Asked Questions - SQL Server 2000 - Setup
INF: "DBCC TRACEON (208)" Messages in the Error Log When Using MSQuery
HOWTO: Delete a SQL Server CE Database in an Application
HOW TO: Troubleshoot a SQL Server Desktop Engine 2000 Installation and Upgrade
HOW TO: Plan SQL Server CE Security for Mobile Devices in IIS and SQL Server 2000 Windows CE Edition
HOW TO: Manually Remove SQL Server 2000 Default, Named, or Virtual Instance
How to Upgrade an Internet Information Services Server After Applying SQL Server 2000 Service Pack 3
FIX: SQL Server Replication Synchronization to DB2 Subscriber Fails with Numeric Data Type
FIX: SQL Server ODBC Driver Does Not Report Canceled Query
FIX: SQL Enterprise Manager Restore to Point in Time Does Not Stop at Requested Time and the Database is Left in a Loading State
FIX: DTS Package Created on Uplevel (2.5/2.6) MDAC May Fail on Computer with Downlevel (2.1) MDAC
FIX: Create Index Fails on SQL Server 7.0 When Trace Flag 1118 is Enabled
FIX: Concurrency Enhancements for the Tempdb Database
BUG: Stored Procedures Do Not Accurately Report Failed Notifications
BUG: SQL Desktop Edition: Shared Memory Fails to Connect After You Install MDAC 2.6
BUG: DBCC CHECKCONSTRAINTS Fails with Error Message 170

[Содержание]

Англоязычные статьи

Logins, Users, and Roles - Getting Started
Andy Warren
Adding Logins, Users, and Roles using SQL-DMO. A few weeks ago we had a request in our DMO discussion form for some help with adding logins and users to a database using DMO. I posted the code sample below as part of that answer. But that discussion really brought two good (though perhaps obvious) points - you have to know how SQL works to use DMO effectively, and I think you need to consider which is the right tool - DMO, T-SQL, or Enterprise Manager. In this article I'd like to talk for a few minutes about how logins and users work, then move into a discussion of which tool might be best for adding logins and user
Y2K Strikes Again!
Steve Jones
For me at least. I'm sure the rest of you are ok, but I got bitten by a bug just this morning that I hadn't seen or expected since just after the Y2K fiasco. It's a software bug, one totally introduced by me, but one which I have run with for the over a year without noticing.
What will C# Look Like in SQL Server?
graz
Articles abound on the Internet about the .NET Common Language Runtime (CLR) being incorporated into the next version of SQL Server codenamed "Yukon". My assumption is that we'll be able to write stored procedures, user-defined functions and possibly database level classes in languages such as C#, Visual Basic.NET, Perl, COBOL, Python, Ruby, J# (JScript?) and any other language that compiles to the Microsoft Intermediate Language (MSIL). What does this mean to you? This article is my rampant speculation about what this might look like.
Cry about... SQL Server Troubleshooting
Andrew Brian Cryer
Microsoft provide very good documentation with SQL Server. It is therefore strongly recommended that the provided documentation is always consulted first in the event of an error arising.
Cry about... SQL Server How To ...
Andrew Brian Cryer
Microsoft provide good documentation with SQL Server, this is often a good source of information
Joining tables in SQL queries
Ron Plew and Ryan Stephens
Having the capability to select data from multiple tables is one of SQL's most powerful features. Without this capability, the entire relational database concept would not be feasible. Single-table queries are sometimes quite informative, but in the real world, the most practical queries are those whose data is acquired from multiple tables within the database
Implementing full text search with T-SQL stored procedures
Eli Leiba
Enabling full text search in T-SQL is not as popular as doing it with the Enterprise Manager. Nonetheless, it can be useful in certain situations. Here are the steps to implement FTS in T-SQL.
Saving Space To Increase Performance
Neil Boyle
It's easy to become complacent about saving disk space when hard disk sizes keep growing and disk prices keep on dropping, but saving a few bytes here and there can help improve SQL Server performance considerably.
A Lookup Strategy Defined
David Sumlin
Most databases designs nowadays seem to have at least a few if not many lookup or reference tables. (I'll use these two terms interchangeably) These tables are those small tables that you maintain your list of States, or CustomerTypes or JobStatus or any number of valid domain values used to maintain data integrity within your application. These reference tables usually have simple 2 -4 columns with the naming convention usually following along the lines of ID, Value, and Description, and maybe Active. (e.g. CustomerTypeID, CustomerTypeValue, CustomerTypeDesc, CustomerTypeActive) I have seen database designs that have hundreds of these reference tables.
Securing SQL Server 2000
Note: For information on protecting your server against the Slammer worm, visit the Finding and Fixing Slammer Vulnerabilities page.

[Содержание]

ПОЛЕЗНОСТИ

ОБНОВЛЕНИЕ: Презентация "Безопасность Microsoft SQL Server 2000"

Обновлена презентация доклада Дмитрия Артемова на конференции Microsoft: Платформа 2003

Безопасность Microsoft SQL Server 2000 (ZIP - 730K.)

[Содержание]

ФОРУМ SQL.RU

Самые популярные темы недели

Междумордие
Кто на чем пишет клиентов под SQL Server?
Ваше мнение об упражнениях SELECT на http://sql.ipps.ru
Есть тулза для разработчиков MS SQL (и не только), оцените.
I Съезд регионального отделения пользователей SQL.RU г. Красноярск
Нужен совет в выборе девайса для резервного копирования.
Семинар в Питере.
ADO & SQL Server , блокировка записей
sysprocesses
Нужно мнение о временных хранимых процедурах!
о многопроцессорных системах
Какой SET изменяет порядок группировки 'WITH ROLLUP'
Подойдет ли такой комп в качестве SQL-Сервера ?
Расскажите как работать с временными таблицами?
SQL2000+Delphi+ADO
как пользователю дать доступ...
SQL Mail
Что-то типа макроподстановки в Select
Запросец.
Временные таблицы.
Не могу сделать UPDATE из курсора
Как повесить хранимую процедуру на поле таблицы?
Как завалить сервер?
ПОДСКАЖИТЕ ПРОСТОЙ СПОСОБ СИНХРОНИЗАЦИИ СТРУКТУР СТАРОЙ И НОВОЙ БАЗ
Replication - уникальное поле (1С-трабл)
UNIX и SQL
Я знаю, что так не бывает, но произошло . Спасайте.
Что быстрее CASE или умножение и вычитаение при выполнении запроса
Система доступа к базам SQL2000 для клиента
Hint в запросе и warning при выполнении
IMPLICIT_TRANSACTIONS ON. Откуда вторая транзакция?
Вопрос про параметры процедуры
100 млн строк, это много или мало
Репликация - регулярно ошибка 9004 - помогите!!!!
Как экспортировать таблицу из SQL в Excel с помощью Query Analyzer?
про @@spid
Молодого переклинило...
работа с хранимыми процедурами
Log shipping and Standart Edition
Подскажите, как лучше делать код модульным
Как заставить ХП читать из таблицы 'usr.t1' а не 'dbo.t1' ???
Джентльмены, SQL Mail: SQL Server не видит почтовый профиль!
Параметрический SQL запрос
Лог собственных транзакций
Как бы извратиться?
Установка Cluster Active/Active
Не могу сконнектить юзеров
самопроизвольный разрыв connectа с SQL
Shrink DataBase
Ковычки в ковычках
merge-синхронизация через модем
ПОДСКАЖИТЕ СТРУКТУРУ ИНТЕРНАЦИОНАЛЬНОЙ БАЗЫ АДРЕСОВ

[Содержание]

Вопросы остались без ответа

Какой SET вкл./откл. заглавные буквы в названиях обьектов
NetIQ SQL MAnagement Suite
Запрос для суммирования из двух таблиц
Сокращение времени отказа в регистрации SQL сервера
SQl Server 2000 выдает ошибку при установке
Какой sql используется в DTS Package? (MS SQL Server 7.0)
Вывод картинки из базы
формат вывода результата запроса
как получить Server Authentication Certificate ?
Можно ли как-нито подконектится из 6.5 к дбфу?
MS SQL -> MySQL ошибки при переносе больших полей с текстом
не могу создать DSN
Диаграмма запуска Job'ов
SQL Server Reporting Services
конвертация базы
как получить Output параметер из StorageProcedure FOR XML RAW?
На чем клиент
на тему написания sp на C# и др.языках .Net
MSSQL 6.5 SP5a IPX без Novell Server

[Содержание]

#131<<  #132

Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру Гладченко на адрес: mssqlhelp@pisem.net

sql.ru Описание рассылки

МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное