mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
Wrap most queries in a try..except block which may fail with a SQL privilege error. So these places do not raise an exception at user level. Exceptions should only raise in unpredictable error situations. Important for reactivating the MadExcept dialog.
This commit is contained in:
@@ -439,46 +439,51 @@ begin
|
||||
// There is no way to ALTER parameters or the name of it.
|
||||
// Create a temp routine, check for syntax errors, then drop the old routine and create it.
|
||||
// See also: http://dev.mysql.com/doc/refman/5.0/en/alter-procedure.html
|
||||
if FAlterRoutineName <> '' then begin
|
||||
// Create temp name
|
||||
i := 0;
|
||||
allRoutineNames := Mainform.Connection.GetCol('SELECT ROUTINE_NAME FROM '+Mainform.mask(DBNAME_INFORMATION_SCHEMA)+'.'+Mainform.mask('ROUTINES')+
|
||||
' WHERE ROUTINE_SCHEMA = '+esc(Mainform.ActiveDatabase)+
|
||||
' AND ROUTINE_TYPE = '+esc(ProcOrFunc)
|
||||
);
|
||||
TargetExists := ((editName.Text <> FAlterRoutineName) or (ProcOrFunc <> FAlterRoutineType)) and
|
||||
(allRoutineNames.IndexOf(editName.Text) > -1);
|
||||
if TargetExists then begin
|
||||
if MessageDlg('Routine "'+editName.Text+'" already exists. Overwrite it?',
|
||||
mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then begin
|
||||
Exit;
|
||||
try
|
||||
if FAlterRoutineName <> '' then begin
|
||||
// Create temp name
|
||||
i := 0;
|
||||
allRoutineNames := Mainform.Connection.GetCol('SELECT ROUTINE_NAME FROM '+Mainform.mask(DBNAME_INFORMATION_SCHEMA)+'.'+Mainform.mask('ROUTINES')+
|
||||
' WHERE ROUTINE_SCHEMA = '+esc(Mainform.ActiveDatabase)+
|
||||
' AND ROUTINE_TYPE = '+esc(ProcOrFunc)
|
||||
);
|
||||
TargetExists := ((editName.Text <> FAlterRoutineName) or (ProcOrFunc <> FAlterRoutineType)) and
|
||||
(allRoutineNames.IndexOf(editName.Text) > -1);
|
||||
if TargetExists then begin
|
||||
if MessageDlg('Routine "'+editName.Text+'" already exists. Overwrite it?',
|
||||
mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then begin
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
while True do begin
|
||||
inc(i);
|
||||
TempName := APPNAME + '_temproutine_' + IntToStr(i);
|
||||
if allRoutineNames.IndexOf(TempName) = -1 then
|
||||
break;
|
||||
end;
|
||||
TempSQL := 'CREATE '+ProcOrFunc+' '+Mainform.mask(tempName)+'(' + BaseSQL;
|
||||
Mainform.Connection.Query(TempSQL);
|
||||
// Drop temporary routine, used for syntax checking
|
||||
Mainform.Connection.Query('DROP '+ProcOrFunc+' IF EXISTS '+Mainform.mask(TempName));
|
||||
// Drop edited routine
|
||||
Mainform.Connection.Query('DROP '+FAlterRoutineType+' IF EXISTS '+Mainform.mask(FAlterRoutineName));
|
||||
if TargetExists then begin
|
||||
// Drop target routine - overwriting has been confirmed, see above
|
||||
Mainform.Connection.Query('DROP '+ProcOrFunc+' IF EXISTS '+Mainform.mask(editName.Text));
|
||||
end;
|
||||
end;
|
||||
while True do begin
|
||||
inc(i);
|
||||
TempName := APPNAME + '_temproutine_' + IntToStr(i);
|
||||
if allRoutineNames.IndexOf(TempName) = -1 then
|
||||
break;
|
||||
end;
|
||||
TempSQL := 'CREATE '+ProcOrFunc+' '+Mainform.mask(tempName)+'(' + BaseSQL;
|
||||
Mainform.Connection.Query(TempSQL);
|
||||
// Drop temporary routine, used for syntax checking
|
||||
Mainform.Connection.Query('DROP '+ProcOrFunc+' IF EXISTS '+Mainform.mask(TempName));
|
||||
// Drop edited routine
|
||||
Mainform.Connection.Query('DROP '+FAlterRoutineType+' IF EXISTS '+Mainform.mask(FAlterRoutineName));
|
||||
if TargetExists then begin
|
||||
// Drop target routine - overwriting has been confirmed, see above
|
||||
Mainform.Connection.Query('DROP '+ProcOrFunc+' IF EXISTS '+Mainform.mask(editName.Text));
|
||||
end;
|
||||
FinalSQL := 'CREATE '+ProcOrFunc+' '+Mainform.mask(editName.Text)+'(' + BaseSQL;
|
||||
Mainform.Connection.Query(FinalSQL);
|
||||
// Set editing name if create/alter query was successful
|
||||
FAlterRoutineName := editName.Text;
|
||||
FAlterRoutineType := ProcOrFunc;
|
||||
Mainform.SetEditorTabCaption(Self, FAlterRoutineName);
|
||||
Mainform.actRefresh.Execute;
|
||||
Modified := False;
|
||||
except
|
||||
on E:Exception do
|
||||
MessageDlg(E.Message, mtError, [mbOk], 0);
|
||||
end;
|
||||
FinalSQL := 'CREATE '+ProcOrFunc+' '+Mainform.mask(editName.Text)+'(' + BaseSQL;
|
||||
Mainform.Connection.Query(FinalSQL);
|
||||
// Set editing name if create/alter query was successful
|
||||
FAlterRoutineName := editName.Text;
|
||||
FAlterRoutineType := ProcOrFunc;
|
||||
Mainform.SetEditorTabCaption(Self, FAlterRoutineName);
|
||||
Mainform.actRefresh.Execute;
|
||||
Modified := False;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user