Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Создание таблицы, если она не существует

Автор вопроса: Ralph ShillingtonОтветов: 4

Учитывая следующее:

if object_id('MyTable') is null create table MyTable( myColumn int )

Разве не возможно, чтобы два отдельных вызывающих объекта могли оценить object_id('MyTable') как null и, таким образом, оба попытались создать таблицу.

Очевидно, что один из двух вызывающих объектов в этом сценарии потерпит неудачу, но в идеале ни один вызывающий объект не должен сбой, скорее один должен заблокировать, а другой должен создать таблицу, тогда заблокированный вызывающий объект увидит object_id('MyTable') как ненулевой и продолжит работу.

К чему я могу применить эксклюзивную блокировку, чтобы я не блокировал больше, чем это абсолютно необходимо?

sqlsql-servertsqltransactionssql-server-2005

Ответы

Ответ 1 · рейтинг 2 · CaffGeek

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

Ответ 2 · рейтинг 1 · Remus Rusanu

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

Я рекомендую вам использовать блокировку приложения в рамках сеанса, полученную в начале процедуры установки/обновления, см. sp_getapplock.

Ответ 3 · shahkalpeshp

Я не думаю, что вам стоит беспокоиться об этом.

Операторы DDL не выполняются в рамках транзакции. Кроме того, 2-й вызывающий объект потерпит неудачу, если таблица уже была создана вызовом от 1-го вызывающего объекта.

Ответ 4 · HLGEM

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы