-
Notifications
You must be signed in to change notification settings - Fork 0
/
uBaseMigracaoBD.pas
151 lines (137 loc) · 3.24 KB
/
uBaseMigracaoBD.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
unit uBaseMigracaoBD;
interface
uses
System.SysUtils,
System.Types,
System.UITypes,
System.Classes,
System.Variants,
FireDAC.Stan.Intf,
FireDAC.Stan.Option,
FireDAC.Stan.Param,
FireDAC.Stan.Error,
FireDAC.DatS,
FireDAC.Phys.Intf,
FireDAC.DApt.Intf,
FireDAC.Stan.Async,
FireDAC.DApt,
FireDAC.Stan.Def,
FireDAC.Comp.DataSet,
FireDAC.Comp.Client,
FireDAC.Phys.PG;
type
TBaseMigracaoBD = class
public
DacConnection: TFDConnection;
function Instalar(): Boolean; virtual; abstract;
function Desinstalar(): Boolean; virtual; abstract;
function VerificarNecessidade: Boolean; virtual; abstract;
protected
function ObterSchemaOwner: String;
function ExisteTabela(NomeTabela: String): Boolean;
function AlterarOwnerTabela(const NovoOwner, NomeSchemaTabela: String): Boolean;
procedure InstalarTabela(SQLDDL: TStringList);
end;
implementation
procedure TBaseMigracaoBD.InstalarTabela(SQLDDL: TStringList);
var
FdQuery : TFDQuery;
begin
FdQuery := TFDQuery.Create(nil);
try
FdQuery.Connection := DacConnection;
FdQuery.SQL := SqlDDL;
FdQuery.ExecSQL;
finally
FdQuery.Free;
end;
end;
function TBaseMigracaoBD.ExisteTabela(NomeTabela: String): Boolean;
var
FdQuery : TFDQuery;
SQL : TStringList;
begin
Result := False;
SQL := TStringList.Create;
with SQL do
begin
Add('SELECT');
Add(' ''S'' AS "retorno" ');
Add('FROM');
Add(' pg_class C ');
Add('LEFT JOIN');
Add(' pg_namespace NS');
Add(' ON (C.relnamespace = NS.oid) ');
Add('WHERE');
Add(' C.relkind = ''r''');
Add(' AND NS.nspname = (SELECT setting FROM pg_settings WHERE name=''search_path'') ');
Add(' AND C.relname = :paramNomeTabela; ');
end;
FdQuery := TFDQuery.Create(nil);
try
FdQuery.Connection := DacConnection;
FdQuery.SQL := SQL;
FdQuery.ParamByName('paramNomeTabela').AsString := NomeTabela;
FdQuery.Open;
while not FdQuery.Eof do
begin
Result := FdQuery.FieldByName('retorno').AsString = 'S';
FdQuery.Next;
end;
finally
FdQuery.Free;
SQL.Free;
end;
end;
function TBaseMigracaoBD.ObterSchemaOwner: String;
var
FdQuery : TFDQuery;
SQL : TStringList;
begin
Result := '';
SQL := TStringList.Create;
with SQL do
begin
Add('SELECT');
Add(' AH.rolname AS "owner" ');
Add('FROM');
Add(' pg_namespace NS ');
Add('LEFT JOIN');
Add(' pg_authid AH');
Add(' ON (NS.nspowner = AH.oid) ');
Add('WHERE');
Add(' NS.nspname = (SELECT setting FROM pg_settings WHERE name = ''search_path'')');
end;
FdQuery := TFDQuery.Create(nil);
try
FdQuery.Connection := DacConnection;
FdQuery.SQL := SQL;
FdQuery.Open;
while not FdQuery.Eof do
begin
Result := FdQuery.FieldByName('owner').AsString;
FdQuery.Next;
end;
finally
FdQuery.Free;
SQL.Free;
end;
end;
function TBaseMigracaoBD.AlterarOwnerTabela(const NovoOwner, NomeSchemaTabela: String): Boolean;
var
SQLDDL: TStringList;
begin
SQLDDL := TStringList.Create;
try
with SQLDDL do
begin
Add('ALTER TABLE');
Add(' ' + NomeSchemaTabela);
Add(' OWNER TO "' + NovoOwner + '";');
end;
InstalarTabela(SQLDDL);
finally
SQLDDL.Free;
end;
end;
end.