У меня есть вопрос, касающийся части документации по временным таблицам, которую я недавно прочитал в TechNet . Четвертый абзац раздела « Временные таблицы » на этой странице гласит:
Если временная таблица создается с именованным ограничением и временная таблица создается в рамках определенной пользователем транзакции, только один пользователь за раз может выполнить инструкцию, которая создает временную таблицу. Например, если хранимая процедура создает временную таблицу с ограничением именованного первичного ключа, хранимая процедура не может выполняться одновременно несколькими пользователями.
Я работаю в среде, где мы широко используем несколько хранимых процедур, использующих индексированные временные таблицы, и у нас никогда не возникало проблем, когда пользователям приходится ждать завершения одного выполнения до начала следующего. Я надеюсь, что так будет и впредь, но я обеспокоен тем, что это может стать проблемой, если это предостережение не будет правильно понято.
В частности, мне неясно по следующим пунктам:
- Это относится только к глобальным временным таблицам или к локальным? Кажется странным, что таблица, которая не видна вне сеанса (как в последнем случае), помешала бы одновременному выполнению другого сеанса.
- Что квалифицируется как «именованное ограничение»? Разве все ограничения не имеют имен (даже если они генерируются системой)? Это относится к ограничениям с пользовательским псевдонимом? Это кажется мне плохой формулировкой.
- «Несколько пользователей» на самом деле означает несколько сеансов? Эти процедуры вызываются через наше приложение с использованием одной учетной записи службы, поэтому 99,9% обращений к нашим сценариям совершаются в БД с помощью этой единственной учетной записи (и я не беспокоюсь о случайных вызовах, которые администратор может сделать на сервере). Если служебная учетная запись может запускать sproc одновременно в нескольких сеансах, тогда эта проблема для меня не имеет значения.
источник
Ответы:
Я думаю об этом, потому что у вас не может быть повторяющихся имен
tempdb.sys.key_constraints
. Вот что находится в этом представлении метаданных на одном из моих серверов:Все нечетные имена, заканчивающиеся на,
_6E...
были автоматически сгенерированы SQL Server. Они не называются ограничениями, потому что я не дал им явно имя при их создании. SQL Server генерирует имя ограничения за кулисами, что теоретически позволяет избежать конфликтов имен.Если я попытаюсь создать следующую таблицу в двух разных сессиях:
Тот, который запускается вторым, выдает ошибку:
Еще раз проверяем вид:
Если я попытаюсь создать следующую таблицу за две сессии, это не проблема:
Вот представление метаданных:
Просто чтобы ответить на ваши вопросы напрямую: часть, которую вы цитировали, применяется как к локальным, так и к глобальным временным таблицам, именованное ограничение - это то, в котором вы сознательно даете ему имя, а несколько пользователей означают несколько сеансов.
источник
Это относится к локальным временным таблицам.
Разница между именованными и безымянными ограничениями заключается в следующем:
Разрешение ограничения имени системы делает крайне маловероятным, что произойдет столкновение. В этом примере, если вы откроете два окна в SSMS, вы сможете создавать
#t1
в обоих, но не в#t2
.Глобальные временные таблицы являются общими для всех пользователей, поэтому вы должны обрабатывать их по-разному. Они не «уничтожаются» до тех пор, пока с их помощью не будет завершен последний сеанс, поэтому вам нужно убедиться, что когда пользователи обращаются к ним, они могут получить доступ только к своим данным. Иногда это делается с помощью SPID, а иногда - с помощью хеш-значения. Это зависит от того, как используется глобальная временная таблица.
Обычно для глобальных временных таблиц хранимые процедуры проверяют, существуют ли они, а затем создают их, только если они
OBJECT_ID()
естьNULL
.Несколько пользователей означает несколько сеансов. Логин не имеет к этому никакого отношения. Если Джордж бежит,
sp_something @i = 1
а Джина бежитsp_something @i = 2
, не имеет значения, если они оба вошли в систему какUser1
, у них будут разные SPID.источник