powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как поймать в триггере создание временной таблицы?
25 сообщений из 26, страница 1 из 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
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как поймать в триггере создание временной таблицы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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