works:programmer:db-mysql:create-view

Создать вьюшку

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW [IF NOT EXISTS] view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

Где ALGORITHM это алгоритм хранения вьюшки.

  • Для MERGE текст оператора, который ссылается на представление, и определение представления объединяются таким образом, что части определения представления заменяют соответствующие части оператора.
  • Для TEMPTABLE результаты представления извлекаются во временную таблицу, которая затем используется для выполнения инструкции.
  • Для UNDEFINED MySQL выбирает, какой алгоритм использовать. Если возможно, он предпочитает MERGE вместо TEMPTABLE, потому что MERGE обычно более эффективен и потому что представление не может быть обновляемым, если используется временная таблица.
  • Если предложение ALGORITHM отсутствует, алгоритм по умолчанию определяется значением флага derived_merge системной переменной optimizer_switch.

Где DEFINER определяет кто создал вьюшку

  • Где user это имя пользователя
  • Где CURRENT_USER текущий пользователь
  • Где role это имя роли
  • Где CURRENT_ROLE роль текущего пользователя

Где SQL SECURITY это доступ чтения вьюшки

  • DEFINER читать от definer, позволяет читать вьюшку от имени того кто создал вьюшку, игнорируя права того кто делал SELECT
  • INVOKER читать от запускающего, позволяет читать вьюшку с правами того пользователя который делает SELECT

column_list список колонок выводимых из вьюшки, необходим для лучшей оптимизации

WITH * CHECK OPTION, тип данных, так-же требуется для оптимизации.

CREATE OR REPLACE
	ALGORITHM = MERGE
	DEFINER = CURRENT_USER
	SQL SECURITY INVOKER
	VIEW `alchemy_by_days` (`date`,`earth`,`air`,`water`,`fire`,`life`,`shadow`)
	AS
	SELECT
		DATE(FROM_UNIXTIME(ep.`timestamp`)) AS `date`,
		SUM(IF(ep.type = "earth", ep.price, 0)) AS `earth`,
		SUM(IF(ep.type = "air", ep.price, 0)) AS `air`,
		SUM(IF(ep.type = "water", ep.price, 0)) AS `water`,
		SUM(IF(ep.type = "fire", ep.price, 0)) AS `fire`,
		SUM(IF(ep.type = "life", ep.price, 0)) AS `life`,
		SUM(IF(ep.type = "shadow", ep.price, 0)) AS `shadow`
		FROM  `etheral-prices` ep
		GROUP BY ep.`timestamp`
		ORDER BY ep.`timestamp` DESC;
works/programmer/db-mysql/create-view.txt · Last modified: 2022/10/07 10:04 by Chugreev Eugene