Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Имя БД в VIEW при Union  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
Добрый день!
Подскажите есть ли такая возможность, чтобы при создании БД в новом 2020 году VIEW [dbo].[Seriynik_last6Year] перескочила бы сама автоматом на 20,19,18,17,16,15 соответственно? Сейчас я это делаю через процедуру, которая меняет скрипт и далее ALTER VIEW. Возможно ли вообще обойтись без ALTER VIEW?
ALTER VIEW [dbo].[Seriynik_last6Year]
AS
SELECT * from dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2018.dbo.Seriynik with (NOLOCK) 
union all
SELECT * from DB_2017.dbo.Seriynik with (NOLOCK) 
union all
SELECT * from DB_2016.dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2015.dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2014.dbo.Seriynik with (NOLOCK)
--[dbo].[Seriynik_last6Year] в DB_2019
26 фев 19, 15:02    [21819814]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
через синонимы не пробовали?
26 фев 19, 15:09    [21819823]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Konst_One
через синонимы не пробовали?

ну будет drop + create synonym
26 фев 19, 15:14    [21819830]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
так может это легче ТС будет
26 фев 19, 15:17    [21819834]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
Konst_One,
А перескок синонима на год вверх? Тоже процедура?
26 фев 19, 15:19    [21819836]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
хоть скриптом в джобе, хоть вызовом ХП. это вам решать
26 фев 19, 15:21    [21819837]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SELECT * from dbo.Seriynik with (NOLOCK)
SELECT * from DB_2018.dbo.Seriynik with (NOLOCK) 
WHERE YEAR(GETDATE()) - 6 <= 2018
union all
SELECT * from DB_2017.dbo.Seriynik with (NOLOCK) 
WHERE YEAR(GETDATE()) - 6 <= 2017
union all
SELECT * from DB_2016.dbo.Seriynik with (NOLOCK)
WHERE YEAR(GETDATE()) - 6 <= 2016
union all
SELECT * from DB_2015.dbo.Seriynik with (NOLOCK)
WHERE YEAR(GETDATE()) - 6 <= 2015
union all
SELECT * from DB_2014.dbo.Seriynik with (NOLOCK)
WHERE YEAR(GETDATE()) - 6 <= 2014

можно как-то так если все базы и объекты уже есть "вперёд"
26 фев 19, 15:22    [21819841]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
LightN,

но правильней, имхо, сделать регламент раз в год который сгенерирует новые объекты и новое представление
26 фев 19, 15:23    [21819843]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
TaPaK,
SELECT * from dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2018.dbo.Seriynik with (NOLOCK) 
WHERE right(db_name(),4)-6 <= 2018
union all
SELECT * from DB_2017.dbo.Seriynik with (NOLOCK) 
WHERE right(db_name(),4)-6 <= 2017
union all
SELECT * from DB_2016.dbo.Seriynik with (NOLOCK)
WHERE right(db_name(),4)-6 <= 2016
union all
SELECT * from DB_2015.dbo.Seriynik with (NOLOCK)
WHERE right(db_name(),4)-6 <= 2015
union all
SELECT * from DB_2014.dbo.Seriynik with (NOLOCK)
WHERE right(db_name(),4)-6 <= 2014

... так м.б. ...
26 фев 19, 15:45    [21819873]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
LightN
TaPaK,
SELECT * from dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2018.dbo.Seriynik with (NOLOCK) 
WHERE right(db_name(),4)-6 <= 2018
union all
SELECT * from DB_2017.dbo.Seriynik with (NOLOCK) 
WHERE right(db_name(),4)-6 <= 2017
union all
SELECT * from DB_2016.dbo.Seriynik with (NOLOCK)
WHERE right(db_name(),4)-6 <= 2016
union all
SELECT * from DB_2015.dbo.Seriynik with (NOLOCK)
WHERE right(db_name(),4)-6 <= 2015
union all
SELECT * from DB_2014.dbo.Seriynik with (NOLOCK)
WHERE right(db_name(),4)-6 <= 2014

... так м.б. ...




добить еще штук 5 запросов на будущие 5 лет, создав пустые вью, потом менять.
26 фев 19, 15:49    [21819877]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
LightN
TaPaK,
SELECT * from dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2018.dbo.Seriynik with (NOLOCK) 
WHERE right(db_name(),4)-6 <= 2018
....

... так м.б. ...


Феерично...
26 фев 19, 15:52    [21819884]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
aleks222
Member

Откуда:
Сообщений: 956
LightN
Возможно ли вообще обойтись без ALTER VIEW?

1. Можно - не делайте дохера баз - делайте одну.
2. Можно - сделайте N баз с фиксированными именами и циклически заменяйте самую старую. Год можно и в базе хранить.

3. Надо вам зачесть документацию о "partitioned views"
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-2017#partitioned-views
26 фев 19, 16:20    [21819907]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
TaPaK,
Ну, да, а YEAR(GETDATE()) - 6 <= 2017 не прокатит если зайти в DB_2017, например ...
26 фев 19, 16:24    [21819910]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
как перестать смеятся и начать работать....

SELECT * from dbo.Seriynik with (NOLOCK)
union all
SELECT * from DB_2018.dbo.Seriynik with (NOLOCK) 


LightN
TaPaK,
Ну, да, а YEAR(GETDATE()) - 6 <= 2017 не прокатит если зайти в DB_2017, например ...
26 фев 19, 16:27    [21819913]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
aleks222
LightN
Возможно ли вообще обойтись без ALTER VIEW?

1. Можно - не делайте дохера баз - делайте одну.
2. Можно - сделайте N баз с фиксированными именами и циклически заменяйте самую старую. Год можно и в базе хранить.
3. Надо вам зачесть документацию о "partitioned views"
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-2017#partitioned-views
Согласен полностью с п.2, эту бы идею поиметь лет так 18 тому назад ... С нуля так, конечно, бы и сделал.
А год, храню в БД: right(db_name(),4) = fYearBD(), где fYearBD() обращение к полю с годом.
26 фев 19, 16:36    [21819922]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
LightN
aleks222
2. Можно - сделайте N баз с фиксированными именами и циклически заменяйте самую старую. Год можно и в базе хранить.
Согласен полностью с п.2, эту бы идею поиметь лет так 18 тому назад ... С нуля так, конечно, бы и сделал.
Это ведь тоже ручные действия; непонятно, чем тогда не нравится автоматическое изменение вьюхи в джобе.
27 фев 19, 09:27    [21820197]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
alexeyvg,
Да, тоже ручные.
Идеальный вариант - найти способ получить VIEW-код ОДИНАКОВЫЙ ДЛЯ ВСЕХ БД и ничего не менять и не править. Если попросили, например, добавить во VIEW какое-нибудь поле, то мы добавляем его во VIEW последнего года, и тот же самый код в БД других лет, просто меняя USE. Т.о. если код VIEW стоит в DB_2018, то он смотрит в DB_2017 ... , а если его же поставить в DB_2017 то он уже смотрит в DB_2016 ... и т.д. соответственно.
В моем проекте таких VIEW, которые смотрят на предыдущий год, на предыдущие 2 года, ... 6 лет > 100 штук :(
Ну если ничего нельзя придумать хитрого, тогда только остается "изменение вьюхи в джобе" и "сделать регламент раз в год" и каждый раз когда потребуются изменения в течении года.

Всем спасибо.
27 фев 19, 11:48    [21820326]     Ответить | Цитировать Сообщить модератору
 Re: Имя БД в VIEW при Union  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7757
Создайте database trigger на базе model на событие создания таблицы, в которой храните годовые данные. В этом триггере выполните динамический запрос по изменению представления, которое хранится в общей базе. При создании в новой базе новой таблицы для очередных годовых наборов автоматически будет внесено исправление представления.
27 фев 19, 13:17    [21820473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить