создание таблицы, если она не существует - PullRequest
2 голосов
/ 05 октября 2009

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 05 октября 2009

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

1 голос
/ 05 октября 2009

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

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

0 голосов
/ 05 октября 2009

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

0 голосов
/ 05 октября 2009

Не думаю, вы должны беспокоиться об этом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...