powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как поймать в триггере создание временной таблицы?
26 сообщений из 26, показаны все 2 страниц
как поймать в триггере создание временной таблицы?
    #40108816
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день,

требуется перенести несколько баз данных из SQL Server 2019 on-premise в облако google, в Fully Managed Database Service.
проблема в том, что default collation и баз данных, и сервера - UTF8.

google разрешает создать БД с default collation UTF8, но невозможно создать instance c UTF8.
получается, что collation пользовательской БД и tempdb разные.
и тогда возникает проблема:
при создании временной таблицы, все varchar поля в collation БД [tempdb] (например SQL_Latin1_General_CP1_CI_AS).
а все таблицы обычно БД в UTF8.
при сравнение полей в разных collation, возникает ошибка.

что можно сделать?
  • изменить t-sql код нереально, ибо свыше 250K строк кода, много динамического SQL.
  • поменять collation БД невозможно, потому что все строки имеют тип varchar, в стоках есть не-ASCII символы, например иероглифы. немного, меньше 1%, но есть.
  • пробовал поменять все varchar на Nvarchar, это тоже оказалось невозможно: это изменение вызывает ошибки на клиентских программах и ETL.
  • использовать виртуальные машины с установленным MS SQL Server on-premise, вместо Fully Managed Database Service, нельзя.

но:
DDL триггер (и на tempdb, и на пользовательской БД) не ловит создание временных таблиц.
на системых таблицах создать триггер невозможно.

какие ещё могут быть варианты?
спасибо.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108822
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, народ, ищет приключений на собственную задницу.


PS. Tempdb должна создаваться по образу и подобию Model.
https://docs.microsoft.com/ru-ru/sql/relational-databases/databases/model-database?view=sql-server-ver15
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108829
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,

Если этот сервис поддерживает Contained Database, можно воспользоваться тем, что поля # таблиц для таких баз создаются с ее (базы) дефолтным коллейтом.

https://docs.microsoft.com/en-us/sql/relational-databases/databases/contained-database-collations?view=sql-server-ver15
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108835
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Во, народ, ищет приключений на собственную задницу.
это не народ ищет, это IT гиганты завлекают в облака технически безграмотных управленцев.
а те уже выкручивают руки нам.
aleks222

PS. Tempdb должна создаваться по образу и подобию Model.
https://docs.microsoft.com/ru-ru/sql/relational-databases/databases/model-database?view=sql-server-ver15
попробовал изменить collation of DB [model].
невозможно.
Код: sql
1.
ALTER DATABASE model COLLATE Latin1_General_100_CI_AI_SC_UTF8 ;  


error: Cannot alter the database 'model' because it is a system database.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108836
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

в облаке откуда model... В облаке такое г-цо, что и не снилось в кошмаре девопса. Там collation сервера невозможно выбрать, он дефолтный америкосовский.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108837
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,

авторIT гиганты завлекают в облака технически безграмотных управленцев

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

если это вопрос уже решенный, то очень плохо, если нет - то надо поставить в известность кого следует, что вы не готовы переносить workflow в облако ввиду технических ограничений облака.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108839
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
aleks222,

в облаке откуда model... В облаке такое г-цо, что и не снилось в кошмаре девопса. Там collation сервера невозможно выбрать, он дефолтный америкосовский.


1. в google облаке (Fully Managed Database Service) есть все системные БД: master, tempdb, model, msdb.
но многие возможность по изменению не поддерживаются.

2. collation сервера выбрать можно.
но список возможных collations не включает в себя UTF8.
google консультанты утверждают, что в будущем добавят и UTF8 тоже. когда точно - не говорят.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108842
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
aleks222
Во, народ, ищет приключений на собственную задницу.
это не народ ищет, это IT гиганты завлекают в облака технически безграмотных управленцев.
а те уже выкручивают руки нам.
aleks222

PS. Tempdb должна создаваться по образу и подобию Model.
https://docs.microsoft.com/ru-ru/sql/relational-databases/databases/model-database?view=sql-server-ver15
попробовал изменить collation of DB [model].
невозможно.
Код: sql
1.
ALTER DATABASE model COLLATE Latin1_General_100_CI_AI_SC_UTF8 ;  


error: Cannot alter the database 'model' because it is a system database.


Ты там админ или так?

1. Бякапим.
2. Восстанавливаем как xModel.
3. Делаем усе, шо хотим.
4. Бякапим.
5. Восстанавливаем Model.

ЗЫ. Сломаем нахер это облако.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108845
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

я админ, все права у меня.
это же не on-prem. это облако. подобные хаки наглухо закрыты.
на попытку забекапить [model], получают ошибку:
Код: html
1.
The server principal "sqlserver" is not able to access the database "model" under the current security context.


(дело не в доступе, это облако не разрешает).
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108847
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
aleks222,

я админ, все права у меня.
это же не on-prem. это облако. подобные хаки наглухо закрыты.
на попытку забекапить [model], получают ошибку:
Код: html
1.
The server principal "sqlserver" is not able to access the database "model" under the current security context.


(дело не в доступе, это облако не разрешает).


Это не права sysadmin.

ЗЫ. Шо значит "хаки"? Model для того и дана народу.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108848
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

увы.
sysadmin role не существует в google облаке.

линк :
SQL Server features unavailable for Cloud SQL:
The sysadmin role and system stored procedures that require it
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108888
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
это не народ ищет, это IT гиганты завлекают в облака технически безграмотных управленцев.
а те уже выкручивают руки нам.
Ага, управленцы безграмотные, а технари, которые закодили необходимость иметь для каждой своей гениальной проги свой сервер со своим коллейшеном, грамотные? :-)
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108890
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
что можно сделать?
  • изменить t-sql код нереально, ибо свыше 250K строк кода, много динамического SQL.
Вполне реально, работы на неделю, или меньше.Всё таки там не 250к строк создания временных таблиц, наверное.
В сотне команд создания временной таблицы написать после каждого строкового поля collate database_default не так уж сложно.
Зато код будет правильный.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108927
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

согласен, доработать вполне реально, но требует времени на подготовку и утверждения требования collation в правилах разработки. О чем необходимо доложить руководству, как я рекомендовал ранее.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108940
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
valv
это не народ ищет, это IT гиганты завлекают в облака технически безграмотных управленцев.
а те уже выкручивают руки нам.
Ага, управленцы безграмотные, а технари, которые закодили необходимость иметь для каждой своей гениальной проги свой сервер со своим коллейшеном, грамотные? :-)

новый коллейшн UTF8 это одна из самых важных новых фич в SQL Server 2019.
для тех, кто работает со строками на разных языках и системах записи (алфавитах, иероглифах) - это долгожданная возможность уйти от кошмара nvarchar; это архиважно для VLDB.

так что да, это грамотное и разумное решение. уверен, UTF8 коллейшн станет промышленным стандартом. Microsoft молодцы.

а вот гугль - подлые твари.
в документации они декларирует поддержку UTF8 для Fully Managed Database Service.
как мы могли предположить, что на уровне БД UTF8 есть, а на уровне сервера нет?
в документации об этом ни слова. во время консультаций - ни слова.
с моей точки зрения, это просто невероятная наглость и подлость гугля.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108964
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
какие ещё могут быть варианты?
Если нет пересечения по именам после #, то отказаться от временных таблиц и валить всё в основную базу. Для уменьшения влияния на бекап перенести все настоящие таблицы в другии партиции/файлгруппы, чтобы можно было бекапить отдельно. Выловить все символы # и добавить для таких таблиц drop table в конце области видимости. Ещё можно заменить все # на @, добавить create table и ловить проблемы со статистиками и планами. Хотя и первый совет из области скорее вредных.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108972
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, если код работы со временными таблицами написан исключительно монопольно, и/или пользователи ходят под одним логином, то такой метод не подойдёт без разделения данных в этих "временных" таблицах.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108986
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tunknown
valv
какие ещё могут быть варианты?
Если нет пересечения по именам после #, то отказаться от временных таблиц и валить всё в основную базу. Для уменьшения влияния на бекап перенести все настоящие таблицы в другии партиции/файлгруппы, чтобы можно было бекапить отдельно. Выловить все символы # и добавить для таких таблиц drop table в конце области видимости. Ещё можно заменить все # на @, добавить create table и ловить проблемы со статистиками и планами. Хотя и первый совет из области скорее вредных.

Кстати да. M$ опубликовала вот такой интересный документ:
https://docs.microsoft.com/ru-ru/sql/relational-databases/in-memory-oltp/faster-temp-table-and-table-variable-by-using-memory-optimization?view=sql-server-ver15
Тот же самый подход можно использовать и в данном случае.
Но придется выловить все Create table # и Select into # во всём тексте.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40108987
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tunknown
Конечно, если код работы со временными таблицами написан исключительно монопольно, и/или пользователи ходят под одним логином, то такой метод не подойдёт без разделения данных в этих "временных" таблицах.

Решение есть, см. ниже... Гм... выше.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40109023
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
tunknown
Конечно, если код работы со временными таблицами написан исключительно монопольно, и/или пользователи ходят под одним логином, то такой метод не подойдёт без разделения данных в этих "временных" таблицах.

Решение есть, см. ниже... Гм... выше.


См. правее или левее
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40109101
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
alexeyvgАга, управленцы безграмотные, а технари, которые закодили необходимость иметь для каждой своей гениальной проги свой сервер со своим коллейшеном, грамотные? :-)
новый коллейшн UTF8 это одна из самых важных новых фич в SQL Server 2019.В данном случае косяк не в выборе коллейшена.
Код должен быть такой, что базу с любым коллешеном (которого ещё не было во время разработки), можно было восстановить на сервер с другим коллейшеном (которого тоже ещё не было во время разработки). Сделать это очень просто, нагуглить эти старые рекомендации можно за минуту, так было принято писать и лет 30 назад, ничего не поменялось. Проблема тут, конечно, в том, что разработчики ввиду отсутствия опыта не знали, что нужно гуглить, пока не столкнулись с проблемой :-)
tunknown
valv
какие ещё могут быть варианты?
Если нет пересечения по именам после #, то отказаться от временных таблиц и валить всё в основную базу. Для уменьшения влияния на бекап перенести все настоящие таблицы в другии партиции/файлгруппы, чтобы можно было бекапить отдельно. Выловить все символы # и добавить для таких таблиц drop table в конце области видимости. Ещё можно заменить все # на @, добавить create table и ловить проблемы со статистиками и планами.
Боже.
tunknown
Хотя и первый совет из области скорее вредных.
Уфф, отлегло, думал, вы серьёзно :-)
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40109151
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
В данном случае косяк не в выборе коллейшена.
Код должен быть такой, что базу с любым коллешеном (которого ещё не было во время разработки), можно было восстановить на сервер с другим коллейшеном (которого тоже ещё не было во время разработки). Сделать это очень просто, нагуглить эти старые рекомендации можно за минуту, так было принято писать и лет 30 назад, ничего не поменялось. Проблема тут, конечно, в том, что разработчики ввиду отсутствия опыта не знали, что нужно гуглить, пока не столкнулись с проблемой :-)

Это как, интересно?
Всегда создавать темповые таблицы с указанием COLLATE полей и исключить Select into как факт?
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40109165
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
alexeyvg
В данном случае косяк не в выборе коллейшена.
Код должен быть такой, что базу с любым коллешеном (которого ещё не было во время разработки), можно было восстановить на сервер с другим коллейшеном (которого тоже ещё не было во время разработки). Сделать это очень просто, нагуглить эти старые рекомендации можно за минуту, так было принято писать и лет 30 назад, ничего не поменялось. Проблема тут, конечно, в том, что разработчики ввиду отсутствия опыта не знали, что нужно гуглить, пока не столкнулись с проблемой :-)

Это как, интересно?
Всегда создавать темповые таблицы с указанием COLLATE полей и исключить Select into как факт?


select * into фсе делает правильно.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40109193
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

in-memory имеет узкую применимость из-за ограничений.
...
Рейтинг: 0 / 0
как поймать в триггере создание временной таблицы?
    #40109434
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Это как, интересно?
Всегда создавать темповые таблицы с указанием COLLATE полей и исключить Select into как факт?
SELECT INTO всё делает правильно, там ничего менять не надо.
А если делать CREATE TABLE, то нужно для каждого строкового поля указывать COLLATE DATABASE DEFAULT

Это же элементарные вещи.
Неужели для разработки системы "с 250к строк кода" компания не смогла себе позволить хотя бы одного специалиста по сиквелу?
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как поймать в триггере создание временной таблицы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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