Как я могу получить столбцы / таблицы, которые использует запрос во время выполнения MySQL?

#mysql #.net #powershell

#mysql #.net #powershell

Вопрос:

У меня есть программа, которая позволяет пользователям запускать пользовательские запросы к нескольким базам данных. Программа использует .net connector для MySQL, который создает объекты connection, command и DataAdapter.

Цель состоит в том, чтобы получить все таблицы / столбцы, к которым обращается запрос. Я знаю, что мог бы проанализировать запрос, чтобы получить их, но подумал, что должен быть более простой способ с использованием соединителя.

Мне также было бы интересно решение, которое использует какой-либо запрос? Объяснение этого не делает.

Пример: Table1

col1 col2 col3 col4
тест1 tes2 test3 test4

Запрос:

 Select col1 as 'name', col2 as 'first' from Table1;
 

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

Настройка соединителя (Powershell):

 $ConnectionString = "server="   $MySQLHost   ";port=$Mysqlport;uid="   $Mysqluser   ";pwd="   $Mysqlpass   ";database="   $Database   ";allow zero datetime=true;"

[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
$Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$Connection.ConnectionString = $ConnectionString
$Connection.Open()        
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
$command.CommandTimeout = 7200;       
$DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
$DataSet = New-Object System.Data.DataSet
$RecordCount = $dataAdapter.FillAsync($dataSet, "data")
$results = $DataSet.Tables[0]
 

Комментарии:

1. Вам нужен план выполнения , но я не уверен, как получить его из кода, хотя EXPLAIN это может помочь.

2. EXPLAIN whatever; из клиентского кода возвращается результирующий набор, как и любой другой запрос.

3. Спасибо за предложение здесь. EXPLAIN предоставляет мне таблицы, к которым осуществляется доступ, но не столбцы.

Ответ №1:

Какие столбцы используются в следующих запросах?

 SELECT COUNT(*) FROM mytable WHERE userid = 123;

SELECT col1   col2 AS myalias FROM mytable

SELECT CURDATE();

SELECT a, b, c FROM table1
UNION
SELECT x, y, z FROM table2;

SELECT EXISTS ( SELECT * FROM mytable WHERE user_id = 123);

WITH RECURSIVE cte ( ... ) SELECT * FROM cte;
 

Вы поняли идею. SQL — это мощный язык, с множеством случаев, которые затрудняют сопоставление исходного столбца и таблицы с каждым столбцом результирующего набора.

Комментарии:

1. Очень верно, но даже с этими запросами движок делает перекрестные ссылки на них, чтобы убедиться, что они существуют. Я полагал, что эта информация будет храниться в некоторых метаданных. Похоже, что синтаксический анализ запроса может быть правильным решением, таким образом, я могу учитывать эти типы операторов.

2. Это делается внутри, но я не знаю ни одной системы, которая предоставляет метаданные клиенту.