DBCC CHECKIDENT на временной таблице, бросающей ошибку полномочий для неправильного пользователя

Нет, такого расширения нет. (Хотя было бы неплохо!) Обычный способ сделать это было бы сказать:

a :: RecordWithFunc
a = RecordWithFunc {
    func = \x y -> x + y
}

Или даже, в этом случае:

a :: RecordWithFunc
a = RecordWithFunc {
    func = (+)
}
7
задан Andy Lester 21 October 2008 в 02:08
поделиться

3 ответа

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

TRUNCATE #Table1

SET IDENTITY_INSERT #Table1 ON

INSERT INTO #Table1 (TableID) -- This is your primary key field
VALUES (@SequenceNumber - 1)

SET IDENTITY_INSERT #Table1 OFF

DELETE FROM #Table1

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

8
ответ дан 6 December 2019 в 12:56
поделиться

Вы записали:

"Вызывающая сторона должна владеть таблицей или быть членом фиксированной роли сервера системного администратора, зафиксированный db_owner".

Таким образом (если это не ошибка), согласно безупречной логике лейтенанта Columbo, каждое помещение должно быть ложью. Это означает, вызывающая сторона не владеет таблицей, даже если он создал ее.

На самом деле кажется, что все объекты, созданные в tempd, принадлежат dbo по умолчанию. Можно исследовать его, если Вы делаете следующее в Query Analyzer:

  1. Соединитесь со своей базой данных с помощью пользователя низкого разрешения.
  2. Выполнитесь: CREATE TABLE #NotMyTable (TestID int identity)
  3. Соединитесь с tempdb того же SQL Server как dbo
  4. Выполнитесь: SELECT user_name(uid) FROM sysobjects WHERE name LIKE '#NotMyTable%'

Вы будете видеть, что dbo является владельцем временной таблицы.

Так, каково могло быть решение?

(Предисловие: Мне не нравится такое управление, но интеллектуальный стимул управляет мной... ;-))

Так, Вы могли записать другую хранимую процедуру, которая обновляет UID в sysobjects tempdb к значению Вашего пользователя (дрожь!). Я протестировал его только в Query Analyzer. После Обновления я мог выполнить Вашу команду DBCC CHECKIDENT.

3
ответ дан 6 December 2019 в 12:56
поделиться

Альтернативное решение выполнения УСЕЧЕННОГО и команд CHECKIDENT состояло бы в том, чтобы просто отбросить и воссоздать Вашу временную таблицу. Например.

DROP TABLE #Table1

CREATE TABLE #Table1
(
   ....
)

Это не может быть наиболее эффективным решением все же.

1
ответ дан 6 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: