Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Смена типа с int на bigint. / 25 сообщений из 28, страница 1 из 2
29.08.2018, 20:38
    #39695217
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Пытаюсь исправить ошибки проэктировщиков базы.

С констрейнами просто, что делать со schema binding? Там прорва функций и view чудовишного размера.

Код: sql
1.
2.
3.
4.
5.
-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"



Ткните меня в FAQ если я проглядел?
...
Рейтинг: 0 / 0
29.08.2018, 21:23
    #39695227
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
LepsikС констрейнами просто, что делать со schema binding?Убивать объекты, менять таблицы, создавать объекты заново.
Либо альтерить объекты без schemabinding, потом обратно.

Можно попробовать грязный хак (лично не пробовал):
Перезапустить сервер в single user mode и соедениться через DAC - появится возможность модификации данных в системных таблицах.

Информация о привязке к схеме хранится в столбце status (набор флагов) таблицы sys.sysschobjs.

В единой транзакции изменить status нужных объектов, альтерить таблицы, восстанавить status.
...
Рейтинг: 0 / 0
29.08.2018, 21:25
    #39695230
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
LepsikПытаюсь исправить ошибки проэктировщиков базы.

С констрейнами просто, что делать со schema binding? Там прорва функций и view чудовишного размера.

Код: sql
1.
2.
3.
4.
5.
-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"




Ткните меня в FAQ если я проглядел?

1.Экспортируете проект в ssdt
2. Меняете тип поля
3. Генерите скрипт деплоя.
...
Рейтинг: 0 / 0
29.08.2018, 21:27
    #39695231
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
invmLepsikС констрейнами просто, что делать со schema binding?Убивать объекты, менять таблицы, создавать объекты заново.
Либо альтерить объекты без schemabinding, потом обратно.

Можно попробовать грязный хак (лично не пробовал):
Перезапустить сервер в single user mode и соедениться через DAC - появится возможность модификации данных в системных таблицах.

Информация о привязке к схеме хранится в столбце status (набор флагов) таблицы sys.sysschobjs.

В единой транзакции изменить status нужных объектов, альтерить таблицы, восстанавить status.

Ага и вьюхи имеют тип int у полей.
...
Рейтинг: 0 / 0
29.08.2018, 21:41
    #39695235
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
msLexАга и вьюхи имеют тип int у полей.Ничего не мешает перед восстановлением статуса выполнить sp_refreshsqlmodule
...
Рейтинг: 0 / 0
29.08.2018, 22:23
    #39695240
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
invmМожно попробовать грязный хак (лично не пробовал):
Перезапустить сервер в single user mode и соедениться через DAC - появится возможность модификации данных в системных таблицах.

Информация о привязке к схеме хранится в столбце status (набор флагов) таблицы sys.sysschobjs.

В единой транзакции изменить status нужных объектов, альтерить таблицы, восстанавить status.
ИМХО быстрее пересоздать, чем такой ужас :-) Это же быстро.
...
Рейтинг: 0 / 0
30.08.2018, 11:09
    #39695399
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
alexeyvgИМХО быстрее пересоздать, чем такой ужас :-) Это же быстро.
если есть материализованные представления (агрегаты), может очень сильно затянуться.

ps хотя в этом случае "грязный хак" в лучшем случае не сработает, а в худшем поломает базу.
...
Рейтинг: 0 / 0
30.08.2018, 12:11
    #39695452
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
При таком раскладе может проще новую базу создать и туда все постепенно перелить?
...
Рейтинг: 0 / 0
30.08.2018, 12:53
    #39695482
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Какая исходная задача?
...
Рейтинг: 0 / 0
30.08.2018, 19:13
    #39695792
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Общее решение такое.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
CREATE TABLE #fvplist(id int not null identity primary key, name sysname);   -- save list of modifyed functions
GO
CREATE PROCEDURE ViewRemoveSchemaBinding @ViewName sysname
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)
    DECLARE @typeobj varchar(8) = (select type from sys.objects WHERE name=@ViewName)
    DECLARE @nametypeobj  sysname = 
    (
        SELECT CASE WHEN @typeobj = 'P' THEN 'PROCEDURE'
                    WHEN @typeobj = 'V' THEN 'VIEW'
                    WHEN @typeobj IN ('FN', 'IF', 'FT', 'TF') THEN 'FUNCTION' END
    )
    SELECT @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName));
    SET @PositionShemaBinding = CHARINDEX('WITH SCHEMABINDING', @Command)

    IF NOT @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS PRESENT... Let's remove it !
        SET @Command = STUFF(@Command, CHARINDEX('WITH SCHEMABINDING', @Command), LEN('WITH SCHEMABINDING'), '/*$$$*/');
        SET @Command = REPLACE(@Command, 'CREATE ' + @nametypeobj, 'ALTER ' + @nametypeobj);

        EXECUTE sp_executesql @Command
        INSERT INTO #fvplist (name) VALUES (@ViewName);
    END
END
GO

CREATE PROCEDURE ViewAddSchemaBinding @ViewName sysname
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)
    DECLARE @ObjectName VARCHAR(MAX)
    DECLARE @typeobj varchar(8) = (select type from sys.objects WHERE name=@ViewName)
    DECLARE @nametypeobj  sysname = 
    (
        SELECT CASE WHEN @typeobj = 'P' THEN 'PROCEDURE'
                    WHEN @typeobj = 'V' THEN 'VIEW'
                    WHEN @typeobj IN ('FN', 'IF', 'FT') THEN 'FUNCTION' END
    )

    SELECT  @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName)),
            @ObjectName = OBJECT_NAME(OBJECT_ID(@ViewName));

    SET @PositionShemaBinding = PATINDEX('%WITH SCHEMABINDING%', @Command)

    IF @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS NOT PRESENT... Let's add it !
        SET @Command = STUFF(@Command, CHARINDEX('/*$$$*/', @Command), LEN('/*$$$*/'), ' WITH SCHEMABINDING ');
        SET @Command = REPLACE(@Command, 'CREATE ' + @nametypeobj, 'ALTER ' + @nametypeobj);

        EXECUTE sp_executesql @Command
        DELETE FROM #fvplist WHERE name = @ViewName;
    END
END
GO
PRINT '1. remove schema binding'
EXEC ViewRemoveSchemaBinding 'fn_group_device_reports_int'
EXEC ViewRemoveSchemaBinding 'fn_doc_usage_sum_byuserdate'
EXEC ViewRemoveSchemaBinding 'fn_all_usage_bydate'
EXEC ViewRemoveSchemaBinding 'doc_detail_col_all'

GO
PRINT '2. drop relations'
ALTER TABLE printjob_details DROP CONSTRAINT pk_printjob_details
GO
ALTER TABLE printjob_details DROP CONSTRAINT fk_printjob_details
GO
ALTER TABLE printjob_details ALTER COLUMN job_id bigint NOT NULL
GO
.....
PRINT '3. restore relations'
---------------------------------------------------------------------------------------------
ALTER TABLE job ADD CONSTRAINT pk_job PRIMARY KEY ( job_id )
GO
.....
PRINT '4. restore schema binding'
SET NOCOUNT ON
DECLARE @fvpName sysname
DECLARE fvpName CURSOR LOCAL FOR SELECT name FROM #fvplist ORDER BY id DESC
OPEN fvpName
FETCH NEXT FROM fvpName INTO @fvpName
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ViewAddSchemaBinding @fvpName
    FETCH NEXT FROM fvpName INTO @fvpName
END
Close fvpName
DeAllocate fvpName
GO
DROP PROCEDURE ViewAddSchemaBinding;
GO
DROP PROCEDURE ViewRemoveSchemaBinding;
GO
...
Рейтинг: 0 / 0
31.08.2018, 11:23
    #39696064
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Lepsik,

У вас там сколько строк?

Создавайте рядом вторую колонку. Порциями копируйте в неё данные. Потом поменяйте имя с первой.

Это если 100 млн строк на высоконагруженной базе, которую вы не хотите останавливать.
...
Рейтинг: 0 / 0
31.08.2018, 11:25
    #39696066
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
a_voroninLepsik,

У вас там сколько строк?

Создавайте рядом вторую колонку. Порциями копируйте в неё данные. Потом поменяйте имя с первой.

Это если 100 млн строк на высоконагруженной базе, которую вы не хотите останавливать.\
а с identity что делать?
...
Рейтинг: 0 / 0
31.08.2018, 12:18
    #39696140
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
TaPaKа с identity что делать?На сиквенс заменить.
...
Рейтинг: 0 / 0
31.08.2018, 16:18
    #39696325
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
a_voroninLepsik,

У вас там сколько строк?
Это если 100 млн строк на высоконагруженной базе, которую вы не хотите останавливать.

Вы всегда делаете upgrade софта не останавливая серверов ?
Даже на биржах для этого окна находят.

А так у нас таки да - миллиарды транзакций.
...
Рейтинг: 0 / 0
31.08.2018, 16:47
    #39696353
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Lepsik,

можно и без остановки, зависит от потребностей.
...
Рейтинг: 0 / 0
31.08.2018, 16:48
    #39696356
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Lepsik,

авторА так у нас таки да - миллиарды транзакций.
ога, все два млрд, за всю жизнь...
...
Рейтинг: 0 / 0
31.08.2018, 17:02
    #39696363
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
LepsikВы всегда делаете upgrade софта не останавливая серверов ?
Даже на биржах для этого окна находят.Это же зависит от бизнеса.
Понятно, что на бирже не будут делать апгрейд без остановки сервиса, но есть бизнесы, для которых перерыв недопустим.
У меня за много лет работы были разные варианты.
Понятно, для задачи ТС можно найти кучу решений как с остановкой, так и без остановки, разной степени трудоёмкости и требований к ресурсам, всё таки поле в базе поменять, как говорится, "не бином ньютона"
...
Рейтинг: 0 / 0
31.08.2018, 18:29
    #39696421
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
TaPaKLepsik,

авторА так у нас таки да - миллиарды транзакций.
ога, все два млрд, за всю жизнь...

Amazon, Walmart,... легко
...
Рейтинг: 0 / 0
31.08.2018, 19:36
    #39696453
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Lepsik,
Смешно я занималя обратной задачей в MySQL bigint --> int

чтобы урезать размер DB
- на 30% кстати урезал (мог бы и больше - но не дали апрува кое где smallint поставтить)

было 3 скритпа
1 Drop FK
2 Alter Table
3 Restore FK

генерил сам - что обнаружилось в MySQL
В Alter table надо сувать всем меняем столбцы в 1 Alter Table
был случай когда 8-10 столбцов в одной таблице менялось - соотвесвтенно усокрение в раз 8 было
а в SQL Server я потом искал - не нашел такого - чьтобы в 1 стейменте можно было так
извратиться наверно можно Select * into from - в временную таблицу и потом назад - но тут надо думать

запускалось разово - в окно - часа 2-3 точно работало.
...
Рейтинг: 0 / 0
01.09.2018, 23:53
    #39696731
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Lepsik,

Не знаю, что там у вас за сервак, но на нашем апгрейд c datetime2(3) на (7) шёл сутки. В таблице 12 млрд. Длина записи 50 байт примерно.
Это так, для референса.
...
Рейтинг: 0 / 0
02.09.2018, 19:37
    #39696891
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
GlebanskiLepsik,
Не знаю, что там у вас за сервак, но на нашем апгрейд c datetime2(3) на (7) шёл сутки. В таблице 12 млрд. Длина записи 50 байт примерно.
Это так, для референса.
Видимо вы себе можете позволить сутки простоя...
Но для других выход есть:
a_voroninСоздавайте рядом вторую колонку. Порциями копируйте в неё данные. Потом поменяйте имя с первой.
...
Рейтинг: 0 / 0
03.09.2018, 10:56
    #39697062
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Владимир ЗатуливетерНо для других выход есть:
a_voroninСоздавайте рядом вторую колонку. Порциями копируйте в неё данные. Потом поменяйте имя с первой.
MSы конечно дураки, раз все изменения проводят через временную таблицу, это ж сколько операций - SELECT INTO, DROP, sp_rename, CONSTRAINTS/INDEXES. То ли дело ALTER TABLE DROP COLUMN...
...
Рейтинг: 0 / 0
03.09.2018, 11:36
    #39697082
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Руслан ДамировичMSы конечно дураки, раз все изменения проводят через временную таблицу, это ж сколько операций - SELECT INTO, DROP, sp_rename, CONSTRAINTS/INDEXES. То ли дело ALTER TABLE DROP COLUMN...А вы в курсе, что ALTER TABLE DROP COLUMN данные не затрагивает?
А вы посмотрели какой скрипт генерирует студия на удаление столбца?
...
Рейтинг: 0 / 0
03.09.2018, 11:54
    #39697091
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
Владимир ЗатуливетерВидимо вы себе можете позволить сутки простоя...
Но для других выход есть:
a_voroninСоздавайте рядом вторую колонку. Порциями копируйте в неё данные. Потом поменяйте имя с первой.
:) Ну вот так устроился, в выхи никто в базу не лезет. А входное барахло в очереди подождет.

ТС, думаю, и так справится. Просто "for completeness" совета, надо бы тогда еще на новую колонку индекс повесить. А то, если порциями копировать, как он узнает, что уже проапдейчено и не NULL? Можно конечно и "на бумажке" записывать или даже мини-фреймворк сделать.
...
Рейтинг: 0 / 0
03.09.2018, 16:04
    #39697258
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Смена типа с int на bigint.
invmА вы в курсе, что ALTER TABLE DROP COLUMN данные не затрагивает?
Полезу-ка я почитаю справку, раз уж такое дело - похоже я что-то упустил.
P.S. Вот прям только колонки не удалял, да и каждый ген не смотрел, но когда смотрел / формировал - всегда формировался скрипт через вторую таблицу с переименованием.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Смена типа с int на bigint. / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]