Автор Тема: Рефакторинг в SQL  (Прочитано 14809 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Рефакторинг в SQL
« : Апрель 13, 2012, 03:37:57 pm »
Раз уж пошла такая пьянка (про SQL)...

Рефакторинг, наверное, даже слишком громко сказано (alexus сразу начнет говорить "ибо нефиг")....
Просто. Была колонка CHAR(100). Стало мало. Надо сделать CHAR(255). Речь, естественно, не только о модификации таблицы, но и о модификации всяких триггеров и хранимых процедур. Их не очень много, но искать их (имеющих отношение к данной таблице) и в них нужное крайне трудоемко (по сравнению с традиционными статически типизированными языками). Что нужно делать, чтобы такие простые вещи не требовали столько усилий?

P.S. Применительно к M$ SQL. Я знаю, что в интербейзе было что-то типа typedef'ов. Не знаю насколько они полезны там, но в M$ SQL они тоже есть и они абсолютно бесполезны (для описанной проблемы).
P.S.S. Считаю SQL (как язык) полным говном. Не хотелось бы выплескивать негатив, но SQL мне кажется крайне неудачным языком для чего-либо кроме SELECT.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #1 : Апрель 13, 2012, 03:46:08 pm »
А триггеры и хранимые процедуры - это SQL?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #2 : Апрель 13, 2012, 03:51:44 pm »
А триггеры и хранимые процедуры - это SQL?

Я знаю, что у разных СУБД свои "языки хранимых процедур", но тем не менее, они пытаются выглядеть похожими на обычный SQL. Не вижу смысла здесь что-то противопоставлять (если только ты не считаешь это важным для решение сабжевой проблемы).

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Рефакторинг в SQL
« Ответ #3 : Апрель 13, 2012, 04:45:36 pm »
Я напрямую с СУБД не работаю, потому про рефакторинг ничего не скажу.
1С всю реструктуризацию при внесении изменений делает автоматически, там это возможно т.к. приложение абстрагировано от уровня таблиц. Тоже выход в принципе, если вы готовы пожертвовать гибкостью немного  ;)

А SQL да дрянь... даже SELECT...

Нужен очень хороший конструктор запросов, чтобы с ним без напряга работать  :)
Либо его чуток императивным сделать. Кто-нибудь использовал LINQ? Вроде там нечто такое сделали.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #4 : Апрель 13, 2012, 04:55:05 pm »
Я напрямую с СУБД не работаю, потому про рефакторинг ничего не скажу.
1С всю реструктуризацию при внесении изменений делает автоматически, там это возможно т.к. приложение абстрагировано от уровня таблиц. Тоже выход в принципе, если вы готовы пожертвовать гибкостью немного  ;)

Т.е., общий ответ - ORM?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Рефакторинг в SQL
« Ответ #5 : Апрель 13, 2012, 05:00:52 pm »
О! Вот как оказывается архитектура 1С называется  ;D
Не знал, что этому подходу есть название.

Ну примерно так... да.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #6 : Апрель 13, 2012, 05:34:59 pm »
Раз уж пошла такая пьянка (про SQL)...

Рефакторинг, наверное, даже слишком громко сказано (alexus сразу начнет говорить "ибо нефиг")....
Просто. Была колонка CHAR(100). Стало мало. Надо сделать CHAR(255). Речь, естественно, не только о модификации таблицы, но и о модификации всяких триггеров и хранимых процедур. Их не очень много, но искать их (имеющих отношение к данной таблице) и в них нужное крайне трудоемко (по сравнению с традиционными статически типизированными языками). Что нужно делать, чтобы такие простые вещи не требовали столько усилий?

P.S. Применительно к M$ SQL. Я знаю, что в интербейзе было что-то типа typedef'ов. Не знаю насколько они полезны там, но в M$ SQL они тоже есть и они абсолютно бесполезны (для описанной проблемы).
P.S.S. Считаю SQL (как язык) полным говном. Не хотелось бы выплескивать негатив, но SQL мне кажется крайне неудачным языком для чего-либо кроме SELECT.
А зачем модифицировать триггеры и хранимые процедуру при изменении ширины колонки? Это ж как надо извратиться при написании тригера, чтобы в нем явно фигурировал размер колонки. Неужели имеет место?

Полное говно - это, видимо, про TRANSACT-SQL  :)

DIzer

  • Гость
Re: Рефакторинг в SQL
« Ответ #7 : Апрель 13, 2012, 05:42:09 pm »
Vlad - обычно в том случае, когда есть подозрение на то, что будут изменятся поля (типы, размеры)  - используются домены (DOMAIN) - еще 10 лет назад  любая уважающая себя sql СУБД - поддерживала работу с ними... ВСЕ изменения шли с помощью одного  запроса вида ALTER DOMAIN DNAME SET....

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #8 : Апрель 13, 2012, 05:53:49 pm »
А зачем модифицировать триггеры и хранимые процедуру при изменении ширины колонки? Это ж как надо извратиться при написании тригера, чтобы в нем явно фигурировал размер колонки. Неужели имеет место?

Дык, об чем и речь. Как? Например, как завести переменную (куда временно будет складываться что-то) размером с размер колонки? Никто бы не писал "DECLARE @var CHAR(100)" если бы можно было сослаться на тип колонки.

Полное говно - это, видимо, про TRANSACT-SQL  :)

Да, видимо.

DIzer

  • Гость
Re: Рефакторинг в SQL
« Ответ #9 : Апрель 13, 2012, 05:55:52 pm »
ЧУШЬ  ;) :D

DIzer

  • Гость
Re: Рефакторинг в SQL
« Ответ #10 : Апрель 13, 2012, 05:59:31 pm »
На вопрос конкретно  как - ответ в руководстве по диалекту SQL соответствующей СУБД -  в разделах DDL (язык определения данных - для синтаксиса определения домена, и его изменения) Разумеется таблицы ДОЛЖНЫ быть созданы с использование доменов а не базовых типов...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #11 : Апрель 13, 2012, 05:59:43 pm »
Vlad - обычно в том случае, когда есть подозрение на то, что будут изменятся поля (типы, размеры)  - используются домены (DOMAIN) - еще 10 лет назад  любая уважающая себя sql СУБД - поддерживала работу с ними... ВСЕ изменения шли с помощью одного  запроса вида ALTER DOMAIN DNAME SET....

Видимо MS SQL не относится к "уважающим себя" :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #12 : Апрель 13, 2012, 06:02:37 pm »
На вопрос конкретно  как - ответ в руководстве по диалекту SQL соответствующей СУБД -  в разделах DDL (язык определения данных - для синтаксиса определения домена, и его изменения)

Я ж говорю - не работает оно. Помню было у нас так поле объявлено через DDL - огребли больше, чем если бы ручками надо было искать CHAR(100). Подробностей сейчас не помню, но это было что-то из серии хардкорного ковыряния в системных таблицах и пересоздания всех хранимых процедур, в которых эта херня исользовалась. С тех пор было решено этой штукой не пользоваться никогда :)

DIzer

  • Гость
Re: Рефакторинг в SQL
« Ответ #13 : Апрель 13, 2012, 06:06:12 pm »
Значит просто не поддерживает концепцию ... сочувствую  :) - в следующей версии авось добавится - и Билли в  очередной  раз сдерет свое бабло...  пользователям других СУБД - радостно гоготать, показывая пальцем...  не несчастливцев ;D
« Последнее редактирование: Апрель 13, 2012, 06:09:48 pm от DIzer »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Рефакторинг в SQL
« Ответ #14 : Апрель 13, 2012, 06:08:15 pm »
На вопрос конкретно  как - ответ в руководстве по диалекту SQL соответствующей СУБД -  в разделах DDL (язык определения данных - для синтаксиса определения домена, и его изменения) Разумеется таблицы ДОЛЖНЫ быть созданы с использование доменов а не базовых типов...

Есть подозрение, что мы говорим о разных вещах, поэтому давайте конкретизирую:
Итак, MS SQL2005 и выше. Как объявить колонку в таблице, чтобы потом безболезненно ее расширять? Как ссылаться на тип этой колонки в хранимых процедурах и триггерах? Как, собственно, потому менять этот тип? Сразу оговорюсь, что пересоздание (ручное) всех процедур/триггеров не катит - нет полного контроля над базой (юзера могут сами туда чего-то добавлять/менять).