#sql-server #database-design
#sql-сервер #база данных-дизайн
Вопрос:
У меня есть требование, которое требует дизайна таблицы, где необходимо поддерживать файлы, загруженные для любых приложений. Есть ли простой способ добиться этого без какого-либо триггера / Sproc?
ID AppName FileName fileorder
1 abc file1 1
2 abc file2 2
3 abc file1 3
4 xyz test1 1 - start a fresh
5 xyz test2 2
6 abc file3 4 - resume from previous value of 'abc'
7 xyz test3 3 - resume from previous value of 'xyz'
8 grt file1 1 - start a fresh
Ответ №1:
Нет, вы ничего не можете написать в CREATE TABLE, которая автоматически заполнит fileorder
столбец таким образом. Единственный способ, которым вы можете это сделать, — это использовать некоторое пользовательское кодирование.
Я не знаю, по какой причине вы хотите создать подобный столбец в своей таблице, но по большинству причин, которые я могу придумать, вам, вероятно, лучше вообще не сохранять это значение в своей таблице и либо вычислять его во время запроса, либо создавать ПРЕДСТАВЛЕНИЕ, включающее вычисление этого столбца.
Комментарии:
1. Спасибо за ответ. Основная причина этого требования заключается в том, что, когда мы загружаем файлы в SFTP, мы не хотим, чтобы там были дубликаты файлов, поскольку это приведет к замене. Я знаю, что мы можем добавить временную метку при их загрузке, но мы пытаемся получить какой-то номер заказа, который они загрузили. Изначально мы думали сделать это на самом Java layer, однако у нас есть два параллельных пути для генерации одинаковых имен файлов, и поэтому мы думаем о сохранении в базе данных согласованности. Абстракция представления может сработать для нас. Проверим это. Еще раз спасибо
2. Да, если это для создания файлов, то вам лучше добавить этот столбец в ПРЕДСТАВЛЕНИЕ, вместо того, чтобы пытаться сохранить его в таблице.
Ответ №2:
Вместо записи значения fileorder в таблицу вам было бы лучше написать запрос для чтения таблицы, которая выглядит следующим образом:
SELECT ID, AppName, FileName, ROW_NUMBER() OVER(PARTITION BY AppName ORDER BY ID) AS fileorder
FROM YOUR_TABLE -- Whatever your table name is
WHERE AppName in ('abc','xyz','grt') -- Any relevant WHERE clause
ORDER BY ID;
К сожалению, вы не можете использовать оконные функции в вычисляемом столбце, что было бы единственным способом за пределами хранимой процедуры или триггера сделать это.
Комментарии:
1. Как упоминал Таб Аллеман, вы могли бы использовать этот запрос выше, чтобы заполнить определение представления, которое дало бы вам нужные результаты.
2. Спасибо, Чад, за быстрый ответ. Я думал о вычисляемом столбце, но опять же, это не сильно поможет, как вы предложили. Возможно, я могу использовать View