Skip to content
This repository was archived by the owner on Aug 28, 2024. It is now read-only.

Commit f75110d

Browse files
committed
Added create_synonym_db() procedure, which takes a source database name, and synonym name, and then creates a new database synonym with views pointing to all the tables within the source database.
Useful for adding an "i_s" or "p_s" synonym for the "information_schema" or "performance_schema" databases for example.
1 parent 05ac54c commit f75110d

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

procedures/create_synonym_db.sql

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Procedure: create_synonym_db()
3+
*
4+
* Parameters
5+
* in_db_name: The database you would like to create a synonym for.
6+
* in_synonym: The synonym you would like to create.
7+
*
8+
* Versions: 5.5+
9+
*/
10+
11+
DROP PROCEDURE IF EXISTS create_synonym_db;
12+
13+
DELIMITER $$
14+
15+
CREATE PROCEDURE create_synonym_db(IN in_db_name VARCHAR(64), IN in_synonym VARCHAR(64))
16+
SQL SECURITY INVOKER
17+
COMMENT 'Parameters: in_db_name (VARCHAR(64)), in_synonym (VARCHAR(64))'
18+
BEGIN
19+
DECLARE v_done bool DEFAULT FALSE;
20+
DECLARE v_db_name_check VARCHAR(64);
21+
DECLARE v_db_err_msg TEXT;
22+
DECLARE v_table VARCHAR(64);
23+
24+
DECLARE db_doesnt_exist CONDITION FOR SQLSTATE '42000';
25+
DECLARE db_name_exists CONDITION FOR SQLSTATE 'HY000';
26+
27+
DECLARE c_table_names CURSOR FOR
28+
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = in_db_name;
29+
30+
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
31+
32+
/* Check if the source database exists */
33+
SELECT SCHEMA_NAME INTO v_db_name_check
34+
FROM INFORMATION_SCHEMA.SCHEMATA
35+
WHERE SCHEMA_NAME = in_db_name;
36+
37+
IF v_db_name_check IS NULL THEN
38+
SET v_db_err_msg = CONCAT('Unknown database ', in_db_name);
39+
SIGNAL SQLSTATE 'HY000'
40+
SET MESSAGE_TEXT = v_db_err_msg;
41+
END IF;
42+
43+
/* Check if a database of the synonym name already exists */
44+
SELECT SCHEMA_NAME INTO v_db_name_check
45+
FROM INFORMATION_SCHEMA.SCHEMATA
46+
WHERE SCHEMA_NAME = in_synonym;
47+
48+
IF v_db_name_check = in_synonym THEN
49+
SET v_db_err_msg = CONCAT('Can\'t create database ', in_synonym, '; database exists');
50+
SIGNAL SQLSTATE 'HY000'
51+
SET MESSAGE_TEXT = v_db_err_msg;
52+
END IF;
53+
54+
/* All good, create the database and views */
55+
SET @create_db_stmt := CONCAT('CREATE DATABASE ', in_synonym);
56+
PREPARE create_db_stmt FROM @create_db_stmt;
57+
EXECUTE create_db_stmt;
58+
DEALLOCATE PREPARE create_db_stmt;
59+
60+
SET v_done = FALSE;
61+
OPEN c_table_names;
62+
c_table_names: LOOP
63+
FETCH c_table_names INTO v_table;
64+
IF v_done THEN
65+
LEAVE c_table_names;
66+
END IF;
67+
68+
SET @create_view_stmt = CONCAT('CREATE SQL SECURITY INVOKER VIEW ', in_synonym, '.', v_table, ' AS SELECT * FROM ', in_db_name, '.', v_table);
69+
PREPARE create_view_stmt FROM @create_view_stmt;
70+
EXECUTE create_view_stmt;
71+
DEALLOCATE PREPARE create_view_stmt;
72+
END LOOP;
73+
CLOSE c_table_names;
74+
75+
END$$
76+
77+
DELIMITER ;

0 commit comments

Comments
 (0)