Я хотел решить проблему, очень похожую на эту. Единственное отличие состоит в том, что мне нужен более универсальный инструмент, а также независимый от СУБД. Я хотел иметь возможность применять инструмент в производственных средах, и некоторые из целевых баз данных не были Oracle.
Я придумал функцию Powershell, которая выполняет подстановку параметров и генерирует повторяющийся сценарий, содержащий последовательность операторов GRANT. Выход выглядит как
grant ALL
on Employees
to DBA;
grant READ
on Employees
to Analyst;
grant READ, WRITE
on Employees
to Application;
grant ALL
on Departments
to DBA;
grant READ
on Departments
to Analyst, Application;
Для моего инструмента есть два входа: файл шаблона и файл csv. Файл шаблона выглядит следующим образом:
grant $privs
on $table
to $user;
И CSV-файл выглядит так:
privs,table,user
ALL,Employees,DBA
READ,Employees,Analyst
"READ, WRITE", Employees, Application
ALL,Departments,DBA
READ,Departments,"Analyst, Application"
Инструмент расширения выглядит следующим образом:
<# This function is a table driven template tool.
It's a refinement of an earlier attempt.
It generates output from a template and
a driver table. The template file contains plain
text and embedded variables. The driver table
(in a csv file) has one column for each variable,
and one row for each expansion to be generated.
5/13/2015
#>
function Expand-csv {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[string] $driver,
[Parameter(Mandatory=$true)]
[string] $template
)
Process
{
$OFS = "`r`n"
$list = Import-Csv $driver
[string]$pattern = Get-Content $template
foreach ($item in $list) {
foreach ($key in $item.psobject.properties) {
Set-variable -name $key.name -value $key.value
}
$ExecutionContext.InvokeCommand.ExpandString($pattern)
}
}
}
Наконец, пример вызова инструмента выглядит так:
Expand-csv demo.csv demo.tem > demo.sql
обратите внимание, что спецификация файла csv стоит первой, а спецификация файла шаблона - второй.
обратите внимание, что «формальные параметры», используемые в файле шаблона, выглядят как переменные Powershell. Это то, что они есть.
обратите внимание, что имена, используемые в шаблоне, соответствуют именам, указанным в заголовке файла CSV.
На самом деле я использовал предшественник этого инструмента с различными диалектами SQL, а также с целевыми языками, отличными от SQL. Я даже использовал его для генерации повторяющегося скрипта Powershell, который делает не что иное, как многократный вызов другого скрипта .ps1 с разными фактическими параметрами.
Это не самый элегантный инструмент в мире, но он хорошо мне подходит.