powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Смена типа с int на bigint.
25 сообщений из 28, страница 1 из 2
Смена типа с int на bigint.
    #39695217
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 если я проглядел?
...
Рейтинг: 0 / 0
Смена типа с int на bigint.
    #39695227
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikС констрейнами просто, что делать со schema binding?Убивать объекты, менять таблицы, создавать объекты заново.
Либо альтерить объекты без schemabinding, потом обратно.

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

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

В единой транзакции изменить status нужных объектов, альтерить таблицы, восстанавить status.
...
Рейтинг: 0 / 0
Смена типа с int на bigint.
    #39695230
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Смена типа с int на bigint.
    #39695231
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmLepsikС констрейнами просто, что делать со schema binding?Убивать объекты, менять таблицы, создавать объекты заново.
Либо альтерить объекты без schemabinding, потом обратно.

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

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

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

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

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

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

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

Код: 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
Смена типа с int на bigint.
    #39696064
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik,

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

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

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

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

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

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

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

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

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

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

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

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

Amazon, Walmart,... легко
...
Рейтинг: 0 / 0
Смена типа с int на bigint.
    #39696453
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Смена типа с int на bigint.
    #39696731
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik,

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

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


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