Некоторые ограничения My Sql
1. Схема и база данных суть одна сущность.
По умолчанию существует information_schema and mysql.
Здесь надо правильно определиться (к обсуждению).
Пока так:
Будем выделять для
Докс Вижена? отдельную схему `DV` (в настоящий момент она имеет название test)
Схема `stopgap` служит для моделирования объектов, присутствующих в MS SQL и не имеющих аналогов в Mysql
2. Не существует табличных функций
В схеме `stopgap` табличные функции реализуются двумя методами
- 1 Созданием одноименной с табличной функцией таблицей с априори заполненной вычисленными значениями
пример dvfn_link_translate_type
- 2 Созданием одноименной с табличной функцией таблицей, в которой введено поле spid, которая
заполняется идентификатором текущей коннекции. Обращение к табличной функции заменяется выполнением ее тела
с записью последнего селекта в таблицу where spid=connection_id(). После этого эти строки могут использоваться
в теле процедуры, только к клаусе where надо добавить предложение and spid=connection_id()
либо рассмотреть использование таблиц в собственной схеме пользователя.
3. Все объявления (DECLARE ...) должны быть перемещены в начало.
4. SELECT @var = ... должен быть заменен на SET @var = ( SELECT ...
Причем, если существует список, то он должен быть разведен по каждой переменной
т.е. SELECT @var1 =, @var2 = ... заменяется на SET @var1 = ( SELECT ...) SET @var2 = ( SELECT ...)
5. Не существует временных таблиц @tbl_name and #tbl_name. Временная таблица живет в рамках текущей коннекции
и ее имя не отличается от имени любой постоянной таблицы
6. Отсутствует оператор BREAK, поэтому циклы типа while 1=1 исключить.
7. В формальных параметрах процедуры исключить присвоения типа = null, ='', =0, =1
8. Исключить использование служебных слов в переменных с @ типа
@count,@default,@desc,@order,@level,@max,@string,@type,@value,@data,@date,@sql etc
9. RETURN в процедурах запрещено использовать. Поэтому обработку ошибок производить с использованием handler типа
DECLARE cond_name CONDITION FOR 1329; # Объявляем кондишен для ошибки 1329, нечего выдать
DECLARE EXIT HANDLER FOR cond_name SELECT NULL as f1, NULL as f2, ...; # Если возникла ошибка прицепленная к кондишену isnotlogin – возвращаем 1
если процедура выдает resultset
SELECT f1, f2, ...
10. Не существует движка transact SQL. Только сам SQL.
11. Парсер, который существует не проверяет код на наличие или отсутствие.
12. Не существует полноценной, как в MS SQL системной поддержки из процедур и функций.
Полное отсутствие функций типа ISNUMERIC(),OBJECTID(), или uuid() вместо newid(), или
несоответствие количества аргументов ISNULL( 1 arg only )
Требуется гибкая замена или переписывание на основе функций
Требуется написание процедур типа sp_configure с заменой или имитацией под MS SQL
Пересмотр применения bcp (bulk copy program)
13. Неукоснительное соблюдение блока BEGIN... END при создании процедуры и функции
14. Использование alias в предложениях DELETE ... дает ошибку (думаю, что это бага)
15. Неукоснительное соблюдение верхнего региства в служебных словах. В проекте найдено As 31 раз.
А также пробелы между именами и скобками типа [ имя ]
16. Использование LOCK and UNLOCK (они же BEGIN TRANS... COMMIT TRANS) ложится на storage server
так как LOCK запрещен в теле хранимой процедуры
17. Неукоснительное соблюдение порядка формальных и фактических параметров.
Также запрещено использование предложений типа par = value в списке
18. Отсутствует возможность создавать свой тип данных.
19. Нет типа sql_variant
Моделируется nvarchar(2000) и созданием дополнительной колонки `sql_var_type` CHAR(36) DEFAULT 'CHAR(36)'
несущей информацию о типе с дальнейшим применение функции CAST()
SET @tp=(select `sql_var_type` from `test`.`dvtest` where `num`=2);
SET @cmd= CONCAT('SET @vald = (select CAST(`
Selected Value?` AS ', @tp,') from `test`.`dvtest` where `num`=2)');
PREPARE stmt FROM @cmd ;
EXECUTE stmt;
- - @val уже содержит значение заданного типа
INSERT INTO `test`.`dvtest`( `
Selected Value?`,`sql_var_type`) SELECT @vald,@tp;
20. Нет типа uniqueidentifier
Моделируется nvarchar(36) DEFAULT 'newid()'
21. Поскольку DEFAULT могут быть только константами, то применение функции newid() должно быть явным.
22. Отсутствие полностью доработанных средств разработки. Пункт достаточно существенный, потому что удлиняет время разработки
23. Другая реализация многоязыковой поддержки и кодировок содержимого файла. Приходится все конвертировать в ucs8.
Отсутствуют @@langid и прочее, что мы можем видеть в master.dbo.syslanguages
24. Job Schedule. Собственные средства выполнения ХП по расписанию отсутствуют в Mysql.
Необходимо использовать системные средства поддержки выполнения рабт по расписанию (типа at or cron).
При этом возникает задача интеграции работы сервера БД с системой, в рамках которой должен быть создан
API управления задачами, их шагами выполнения и расписания из контекста ХП: sp_delete_job, ...
SET @Job Name? = 'dvjob_' + DATABASE() + '_{DA86FABF-4DD7–4A86-B6FF-C58C24D12DE2}';
CALL `stopgap`.`sp_delete_job` ( @Job Name? );
В версии 5.0 нет. В версии 5.1 и выше есть и называются CREATE EVENT... ON SCHEDULE ...
Надо только включить SET GLOBAL event_scheduler = ON; его(show processlist\G).
select * from `information_schema`.`events`; Системная таблица остается пустой.
DROP TABLE IF EXISTS `dbo`.`articles`;
CREATE TABLE `dbo`.`articles` (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT null,
FULLTEXT (title,body)
) ENGINE =
My ISAM?;
— DROP EVENT IF EXISTS fff;
CREATE DEFINER = CURRENT_USER EVENT `dbo`.`fffffff`
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
DO
INSERT INTO `dbo`.`articles`(title) SELECT 'new line';
Здесь мы видим отличную реализацию выполнения работ по расписанию на основе специального типа триггера
событий по расписанию. Причем событие становится объектом базы данных, что позволяет избавиться от тяжелых
системных процедур по управлению очередью работ, которые существуют в MSSQL.
25. Полнотекстовый поиск
My Sql поддерживает полнотекстовый поиск при помощи создания индекса типа FULLTEXT
и только на ENGINE =
My ISAM? и только CHAR, VARCHAR, TEXT.
Inno DB? поддерживает transaction,
row-level locking and FK. Возможно смешивание работы таблиц для разных движков, но как
практически разработать схему БД в гетерогенной среде разных движков никто не знает.
Смотри select * from `information_schema`.`engines`;
Конструкция поиска MATCH(...,...,....)... AGAINST('literal')
types of search:
- boolean search
- natural languages search (IN NATURAL LANGUAGES MODE)
- natural languages with query expantion search (IN NATURAL LANGUAGES MODE WITH QUERY EXPANSION)
- with query expantion search (WITH QUERY EXPANSION)
пример
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE =
My ISAM?;
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);
PS:
Разработан класс Any Sql Exec? со стандартными методами open(), Change Database(), Execute Non Query(), Execute Reader(), Execute Scalar() for Mysql, Oracle, Postgre. В рамках этого класса существует конвертор MS SQL скриптов в прототипы Mysql скриптов, которые можно достаточно быстро превратить в работающие скрипты (но уже при помощи рук).
65
Вода с Землею, Медь, Могильная доска, …
Песок в часах, что Время завело,
Но красота в паденьи струй песка
Живет, как будто всех сильней, что отцвело.
Медовое дыханье юных дней
Живет в часах, как шорох разрушенья
Тех скал иль врат стальных любви моей,
Что время присудило на лишенье.
И что за вздор? Увы, ты драгоценность свыше
Обратно ляжешь в черный бархатный футляр,
Лишь красота твоя достойна выжить
Через любви души осенний экземпляр.
Но след моих чернил не совершит здесь чуда
Моей любви в песке Времен быть ярче изумруда.