Chciałem rozwiązać problem bardzo podobny do tego. Jedyną różnicą jest to, że chciałem narzędzie bardziej ogólne, a także agnostyczne DBMS. Chciałem móc zastosować to narzędzie w środowiskach produkcyjnych, a niektóre z docelowych baz danych nie były Oracle.
to, co wymyśliłem, to funkcja Powershell, która wykonuje zastępowanie parametrów i generuje powtarzający się skrypt zawierający sekwencję instrukcji GRANT. Dane wyjściowe wyglądają jak dwa wejścia do mojego narzędzia, pliku szablonu i pliku CSV.Plik szablon wygląda tak:
grant $privs
on $table
to $user;
a plik CSV wygląda tak:
privs,table,user
ALL,Employees,DBA
READ,Employees,Analyst
"READ, WRITE", Employees, Application
ALL,Departments,DBA
READ,Departments,"Analyst, Application"
Narzędzie ekspansja wygląda następująco:
<# 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)
}
}
}
Wreszcie, wezwanie próbki do narzędzie wygląda następująco:
Expand-csv demo.csv demo.tem > demo.sql
Należy zauważyć, że specyfikacja pliku csv pojawia się jako pierwsza, a specyfikacja pliku szablonu ma drugie miejsce. Należy zauważyć, że "parametry formalne" użyte w pliku szablonu wyglądają jak zmienne Powershell. Tak właśnie są. Należy pamiętać, że nazwy używane w szablonie odpowiadają nazwom, które pojawiają się w nagłówku pliku csv.
Rzeczywiście użyłem prekursora tego narzędzia z różnymi dialektami SQL, a także z językami docelowymi innymi niż SQL. Używałem go nawet do generowania powtarzającego się skryptu Powershell, który nie tylko przywołuje inny skrypt .ps1, w kółko, z różnymi rzeczywistymi parametrami.
To nie jest najbardziej eleganckie narzędzie na świecie, ale służy mi dobrze.
Myślę, że musisz to zrobić na własnej skórze. Przeprowadź pętlę przez "All_TAB_PRIVS" i wygeneruj ten skrypt. Jednak ciekawe pytanie. Chciałbym wiedzieć, czy to możliwe. – Guru