0

У меня есть таблица dnn_Files с заданной пользователем папки функция столбца:Изменить определяемые пользователем функции тела используется столбец таблицы в Sql сервере

CREATE TABLE [dnn_Files](
    ... 
    [Folder] AS ([GetFileFolderFunc]([FolderID])), 
    ... 
... 

база данных была создана с помощью установки DotNetNuke и был использован. Значит, это не пусто.

Моя истинная цель состоит в том, чтобы добавить к базе данных «dnn_» в базу данных (исходная база данных имеет пустой классификатор).

Чтобы архивировать, что я переименовал все таблицы dnn, удаленные хранимые процедуры, пользовательские функции (кроме GetFileFolderFunc - его нельзя удалить, поскольку на него ссылаются dnn_Files), просматривать и воссоздавать его с помощью подходящего классификатора объектов.

После этого я получаю стол, как описано выше. Таблица имеет правильный квалификатор, а GetFileFolderFunc - нет. Поскольку таблицы были переименованы, GetFileFolderFunc теперь ссылается на несуществующую таблицу. Соответствующий двойник с квалификатором (dnn_GetFileFolderFunc) находится в базе данных.

Итак, я хочу, чтобы dnn_Files использовали новую функцию dnn_GetFileFolderFunc.

Когда я пытаюсь изменить столбец «Папка» (путем изменения спецификации вычисляемого столбца с помощью конструктора студийной среды Sql), он не работает с ошибкой «Сохранение изменений не разрешено. Изменения, которые вы внесли, требуют, чтобы dnn_Files был капельницей и заново создан. .. ". Поскольку dnn_Files имеет много отношений, он не может быть изменен. Кажется логичным.

Затем я пытаюсь изменить тело GetFileFolderFunc, чтобы использовать таблицы с новым классификатором объектов, но не повезло. Ошибка: «Не может ALTER» dbo.GetFileFolderFunc », потому что на нее ссылается объект« dnn_Files ».

Есть ли какие-либо обходные пути для первого или второго ограничения?

версия Sql сервер: 11.0.2100.60

+1

Попробуйте выполнить ALTER, используя команду SQL alter вместо использования интерфейса SSMS. –

+0

Если нет, вам может потребоваться отбросить/создать и повторно заполнить данные в dnn_Files. ВСЕГДА возьмите резервную копию ПОЛНОГО БД, прежде чем пробовать такие вещи. –

+0

@ L_7337, спасибо. Я написал для этого ответ. –

ответ

3
ALTER TABLE dbo.dnn_Files DROP COLUMN Folder; 
GO 
ALTER TABLE dbo.dnn_Files ADD Folder AS ([dbo].[dnn_GetFileFolderFunc]([FolderID])); 

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

0
  1. Script «dbo.GetFileFolderFunc», как создать на новой вкладке. Измените имя функции и запустите скрипт.
  2. Измените таблицу dnn_files, чтобы ссылаться на новую функцию.
  3. Изменить оригинальную функцию.
  4. Измените таблицу dnn_files, чтобы ссылаться на исходную функцию, которая была изменена.
  5. Оставьте новую функцию, на которую больше ничего не ссылается.
1

L_7337 был прав, это просто вопрос использования SSMS-интерфейса.

Sql изменяющие:

ALTER TABLE dbo.dnn_Files DROP COLUMN Folder; 
GO 
ALTER TABLE dbo.dnn_Files ADD Folder AS ([dbo].[dnn_GetFileFolderFunc]([FolderID])); 

работает отлично. Большое спасибо!

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

Я сделал трюк через bacpac. После распаковки (bacpac - всего лишь zip) я изменил model.xml.Связанная часть здесь:

<Element Type="SqlComputedColumn" Name="[dbo].[dnn_Files].[Folder]"> 
    <Property Name="ExpressionScript"> 
    <Value><![CDATA[([dbo].[dnn_GetFileFolderFunc]([FolderID]))]]></Value> 
    </Property> 
    <Relationship Name="ExpressionDependencies"> 
    <Entry> 
     <References Name="[dbo].[dnn_GetFileFolderFunc]" /> 
    </Entry> 
    <Entry> 
     <References Name="[dbo].[dnn_Files].[FolderID]" /> 
    </Entry> 
    </Relationship> 
</Element> 

Затем почтовая назад и использовать DacChkSum.exe для расчета контрольной суммы.

>dacchksum /InputFilename:database.bacpac 
Model checksum 
Stored: :[5745242756E4D7CAD12C913058A1078BC1A5FA5A069C7CC0CF417719F2A64196] 
Calculated:[A2B39E19E2219E05B3B4F8DC95A1B764B7A91ABBA9C70D18EAA4247B76120BB0] 

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

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

+0

Спасибо за подсказку в DacChkSum. Контрольная сумма представляется SHA256 (с использованием 'System.Security.Cryptography.SHA256CryptoServiceProvider'). –

 Смежные вопросы

  • Нет связанных вопросов^_^