Динамическое создание базы данных и источника данных в ColdFusion

Я пытаюсь создать базу данных и источник данных динамически из пользовательского ввода.

Я не уверен, что возможно или нет создать базу данных с использованием тега cfquery без использования источника данных.

Для создания источника данных

<cfscript>
    adminObj = createObject("component","cfide.adminapi.administrator");
    adminObj.login("admin password");  
    myObj = createObject("component","cfide.adminapi.datasource");
    myObj.setMSSQL(driver="MSSQLServer",
        name="datasourceName", host = "127.0.0.1", port = "1433",
        database = "database", username = "userName", password="password", login_timeout = "30",
        timeout = "20", interval = 7, buffer = "64000", blob_buffer = "64000", setStringParameterAsUnicode = "false",
        description = "", pooling = true, maxpooledstatements = 1000, enableMaxConnections = "true",
        maxConnections = "300", enable_clob = true, enable_blob = true, disable = false, storedProc = true,
        alter = false, grant = true, select = true, update = true, create = true, delete = true, drop = false,
        revoke = false
        );
</cfscript>

Я пытался создать источник данных, используя приведенный выше код статически, он успешно создает источник данных.

Для создания базы данных

<cfquery name="createDB" result="res">
    create database #form.dbname#
</cfquery>

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

Любой совет или помощь ценны
Заранее спасибо.


person Saravana Kumar    schedule 28.02.2020    source источник
comment
Почему? Я думаю, что это возможно в обходном пути, но сервер ColdFusion действительно не должен иметь такого уровня разрешений для вашего сервера базы данных. Используете ли вы учетную запись sa в качестве пользовательского соединения CF или у вас есть специальное соединение для сервера CF?   -  person Shawn    schedule 28.02.2020
comment
Это действительно плохая идея позволять пользователям создавать базы данных на вашем сервере.   -  person Miguel-F    schedule 28.02.2020
comment
@shawn да, я использую учетную запись sa в качестве пользовательского подключения cf   -  person Saravana Kumar    schedule 28.02.2020
comment
@miguel-F да, но это сценарий ☺   -  person Saravana Kumar    schedule 28.02.2020
comment
Вам нужно использовать имя источника данных в ‹cfquery›, который создает базу данных, хотя я не уверен, что это сработает. Возможно, вам потребуется создать БД с использованием уже существующего источника данных, а затем создать новый источник данных. Кроме того, я согласен со всеми остальными... это плохая идея... очень, очень плохая идея.   -  person Scott Stroz    schedule 28.02.2020
comment
Насколько я помню, я думаю, что вы можете создать другую базовую базу данных (например, Master в SQL Server), а также создать резервную копию и восстановить эту базу данных. Это дает вам фактический источник данных для использования. Однако я еще раз повторяю, что считаю это очень плохой идеей.   -  person Shawn    schedule 28.02.2020
comment
Я бы также НАСТОЯТЕЛЬНО рекомендовал вам создать специального пользователя для использования только CF и ограничить эту учетную запись тем, что ей разрешено делать. sa имеет МНОГО привилегий в вашей базе данных. И вы действительно не хотите, чтобы пользователь, доступный через Интернет, мог делать что-то вроде DROP TABLE master с вашей базой данных.   -  person Shawn    schedule 28.02.2020
comment
Я бы также взглянул на petefreitag.com/presentations/cfsummit/ 2016/cf2016-lockdown.pdf. Пит действительно знает свое дело, и это руководство (и другие для применимых версий) очень хорошо.   -  person Shawn    schedule 28.02.2020
comment
Я предлагаю поместить код для создания базы данных в хранимую процедуру и предоставить учетной записи CF разрешение на ее выполнение.   -  person Dan Bracuk    schedule 28.02.2020
comment
@DanBracuk ЕСЛИ это действительно нужно сделать. :-)   -  person Shawn    schedule 28.02.2020
comment
Еще одно замечание, которое я добавлю для будущих читателей: одна из причин, по которой это плохая идея (несмотря на аспекты безопасности), заключается в том, что вы можете открыть дыру, позволяющую легко осуществить отказ в обслуживании, преднамеренный или нет. Если это вызывается несколько раз, каждая из этих баз данных имеет стоимость дискового пространства. Вы можете довольно быстро заполнить жесткие диски на сервере базы данных. Нехватка места на диске может стать огромной головной болью. И что еще хуже, если вам выставляют счет за используемое дисковое пространство, вы можете получить довольно дорогой сюрприз.   -  person Shawn    schedule 28.02.2020
comment
Вы не упомянули, почему вы хотите предоставить эту возможность пользователю, поэтому я просто предположу, что вы создаете приложение для интрасети для обслуживания баз данных с веб-интерфейсом. Если вам нужна гибкость при подключении к базе данных, вы должны игнорировать cfquery/datasources и вместо этого использовать драйвер JDBC напрямую. createObject("java", ...) будет вашим инструментом.   -  person Alex    schedule 29.02.2020
comment
@Shawn Я решил этот сценарий, используя основную базу данных. да, это плохая идея, но я думаю, что есть решение.   -  person Saravana Kumar    schedule 29.02.2020
comment
@Alex Так же, как концепции CMS. пользователь/администратор сайта должен иметь возможность создавать свою собственную базу данных и таблицу через пользовательский интерфейс (без знания базы данных и ColdFusion).   -  person Saravana Kumar    schedule 29.02.2020
comment
"...create their own database and table via UI (without knowledge of database and ColdFusion)" ‹‹‹ Да, это возможно возможно, но есть много вещей, которые можно делать, но не следует делать. Я хочу сказать, что вы открываете себя для МНОГО проблем, если позволяете это.   -  person Shawn    schedule 29.02.2020
comment
Хорошо. Я согласен с вами, постараюсь избежать этого сценария :)   -  person Saravana Kumar    schedule 02.03.2020


Ответы (1)


Можете ли вы преобразовать свой скрипт в функцию и передать желаемое имя базы данных из ввода формы в качестве аргумента?

runCreateDatabase = createDBforMe(databasename=form.dbname)

person Richard_J_Nap    schedule 04.03.2020
comment
Вы имеете в виду, что говорите о концепции/цели удобства использования кода, верно? спасибо за совет ???? - person Saravana Kumar; 04.03.2020