Модификация структуры базы данных
http://domdarc.com/boccpasdomct.html[sitsitcolo] [[1][sitsitcolo]]
- http://roldom.com/letoviba.html sitsitcolo
- [sitsitcolo]
- [[2]]
- [| sitsitcolo]
- [3]
- [sitsitcolo|http://elteltsitz.com/c4tvarorba.html]
- ((http://domc4tel.com/dronchidomo.html sitsitcolo))
- [sitsitcolo](http://reldomd.com/trocli.html "sitsitcolo")
"sitsitcolo":http://linoboel.com/trocvarvare.html
СÑÑÑкÑÑÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ÑÑавлÑемой Ñ "голой" плаÑÑоÑмой назÑваеÑÑÑ ÑÑалонной, а Ñама база даннÑÑ Ð±ÐµÐ· полÑзоваÑелÑÑÐºÐ¸Ñ Ð½Ð°ÑÑÑоек â ÑÑалоном. ÐÑÐ°Ð»Ð¾Ð½Ð½Ð°Ñ ÑÑÑÑкÑÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ñ Ð²ÑÑ Ð¾Ð´Ð¾Ð¼ новÑÑ Ð²ÐµÑÑий Ñайла gedemin.exe. ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð±Ð°Ð· пÑедÑÑмоÑÑен Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ модиÑикаÑии ÑÑÑÑкÑÑÑÑ. РаÑÑмоÑÑим его ÑабоÑÑ Ð½Ð° ÑледÑÑÑем пÑимеÑе: пÑÑÑÑ Ð² ÑÑалоннÑÑ ÑÑÑÑкÑÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ добавиÑÑ ÑаблиÑÑ GD_TEST и ÑвÑзаннÑе Ñ Ð½ÐµÐ¹ обÑекÑÑ: пеÑвиÑнÑй клÑÑ Ð¸ ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð»Ñ ÐµÐ³Ð¾ авÑомаÑиÑеÑкого ÑоÑмиÑованиÑ.
Создание SQL ÑкÑипÑа
ÐеÑвÑм делом Ñоздадим в подкаÑалоге SQL каÑалога GEDEMIN Ñайл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ gd_test.sql, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ ÑледÑÑÑий ÑкÑипÑ:
SET NAMES WIN1251;
SET SQL DIALECT 3;
CONNECT '<ÐÐ¼Ñ ÑеÑвеÑа и пÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ Ñ ÑÑалонной ÐÐ>'
USER 'SYSDBA' PASSWORD 'masterkey';
COMMIT;
CREATE TABLE gd_test (
id dintkey,
name dname
);
ALTER TABLE gd_test ADD CONSTRAINT gd_pk_test_id
PRIMARY KEY (id);
SET TERM ^ ;
CREATE TRIGGER gd_bi_test
BEFORE INSERT
POSITION 0
AS
BEGIN
IF (NEW.id IS NULL) THEN
NEW.id = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0);
END
^
SET TERM ; ^
COMMIT;
Ðзменение веÑÑии ÑÑÑÑкÑÑÑÑ ÐÐ
ÐÑÑоÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÐµÑÑии ÑÑÑÑкÑÑÑÑ ÐÐ Ñ ÑаниÑÑÑ Ð² ÑаблиÑе fin_versioninfo. Ðе ÑÑÑÑкÑÑÑа и наполнение задаÑÑÑÑ Ð² Ñайле gd_version.sql. ÐапиÑÑ Ñ Ð¼Ð°ÐºÑималÑнÑм иденÑиÑикаÑоÑом ÑооÑвеÑÑÑвÑÐµÑ ÑекÑÑей веÑÑии ÑÑÑÑкÑÑÑÑ. ÐÑÑÑем макÑималÑнÑй Ð½Ð¾Ð¼ÐµÑ Ð¸ добавим в ÑказаннÑй Ñайл новÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾ веÑÑии:
INSERT INTO fin_versioninfo VALUES (100, '0000.0001.0000.0127', '16.01.2008', 'GD_TEST table added');
ÐбÑаÑиÑе внимание, ÑÑо в ваÑем ÑлÑÑае иденÑиÑикаÑоÑ, ÑÑÑоковое пÑедÑÑавление веÑÑии ÐÐ, даÑа внеÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ бÑдÑÑ Ð´ÑÑгими!
Ðобавление вÑзова ÑкÑипÑа в пакеÑнÑй Ñайл ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑалонной ÐÐ
ÐÑÐ°Ð»Ð¾Ð½Ð½Ð°Ñ ÐÐ ÑоÑмиÑÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð°ÐºÐµÑного Ñайла create.bat из каÑалога SQL. ÐÑкÑоем его на ÑедакÑиÑование и добавим ÑÑÑÐ¾ÐºÑ Ð²Ñзова наÑего ÑкÑипÑа:
... isql -i gd_file.sql rem ÐÑзÑваем Ð½Ð°Ñ ÑкÑÐ¸Ð¿Ñ isql -i gd_test.sql makelbrbtree.exe /sn czech:k:\bases\gedemin\etalon.fdb /tmp tst_tree_tbl.sql ...
Ðак показано в пÑимеÑе вÑÑе, обÑÑно, вÑзов новÑÑ ÑкÑипÑов добавлÑеÑÑÑ Ð² ÐºÐ¾Ð½ÐµÑ Ñайла, пеÑед вÑзовом ÑÑилиÑÑ Ð¿ÐµÑеÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½ÑеÑвалÑнÑÑ Ð´ÐµÑевÑев.
Создание пÑоÑедÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑии ÑÑÑÑкÑÑÑÑ ÑÑÑеÑÑвÑÑÑей ÐÐ
ТепеÑÑ, поÑле Ñого, как Ð¼Ñ Ñоздали Ñайл Ñо ÑкÑипÑом и добавили его в ÑпиÑок create.bat, ÑÑÐ°Ð»Ð¾Ð½Ð½Ð°Ñ Ð±Ð°Ð·Ð° бÑÐ´ÐµÑ ÑоÑмиÑоваÑÑÑÑ Ñже Ñ Ð½Ð°Ñей ÑаблиÑей. Ðо, как бÑÑÑ Ñ Ñеми базами. коÑоÑÑе бÑли ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ñанее и Ñже ÑкÑплÑаÑиÑÑÑÑÑÑ Ñ Ð¿Ð¾Ð»ÑзоваÑелей? ÐÐ»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в ÑÑÑÑкÑÑÑÑ ÑÑÑеÑÑвÑÑÑей Ð±Ð°Ð·Ñ ÑледÑÐµÑ ÑоздаÑÑ Ð¿ÑоÑедÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑии. ÐбÑÑно, ÐºÐ°Ð¶Ð´Ð°Ñ Ð¿ÑоÑедÑÑа Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² Ñвоем оÑделÑном Ñайле в подкаÑалоге Setup оÑновного каÑалога пÑоекÑа. Ðазвание ÑниÑа пÑинÑÑо наÑинаÑÑ Ñ Ð¿ÑеÑикÑа mdf_.
unit mdf_AddTestTable;
interface
uses
IBDatabase, gdModify;
procedure AddTestTable(IBDB: TIBDatabase; Log: TModifyLog);
implementation
uses
IBSQL, SysUtils;
procedure AddTestTable(IBDB: TIBDatabase; Log: TModifyLog);
var
FTransaction: TIBTransaction;
FIBSQL: TIBSQL;
begin
Log('ÐаÑаÑо добавление ÑаблиÑÑ GD_TEST');
FTransaction := TIBTransaction.Create(nil);
try
FTransaction.DefaultDatabase := IBDB;
FTransaction.StartTransaction;
try
FIBSQL := TIBSQL.Create(nil);
try
FIBSQL.Transaction := FTransaction;
FIBSQL.SQL.Text :=
'CREATE TABLE gd_test ( ' + #13#10 +
' id dintkey, ' + #13#10 +
' name dname ' + #13#10 +
')';
FIBSQL.ExecQuery;
FIBSQL.SQL.Text :=
'ALTER TABLE gd_test ADD CONSTRAINT gd_pk_test_id ' + #13#10 +
' PRIMARY KEY (id)';
FIBSQL.ExecQuery;
FIBSQL.SQL.Text :=
'CREATE TRIGGER gd_bi_test ' + #13#10 +
' BEFORE INSERT ' + #13#10 +
' POSITION 0 ' + #13#10 +
'AS ' + #13#10 +
'BEGIN ' + #13#10 +
' IF (NEW.id IS NULL) THEN' + #13#10 +
' NEW.id = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0); ' + #13#10 +
'END';
FIBSQL.ExecQuery;
FIBSQL.Close;
FIBSQL.SQL.Text :=
'INSERT INTO fin_versioninfo ' +
' VALUES (100, '0000.0001.0000.0127', '16.01.2008', 'GD_TEST table added')';
try
FIBSQL.ExecQuery;
except
end;
FTransaction.Commit;
Log('Ðобавление ÑаблиÑÑ GD_TEST ÑÑпеÑно завеÑÑено');
finally
FIBSQL.Free;
end;
except
on E: Exception do
begin
FTransaction.Rollback;
Log(E.Message);
end;
end;
finally
FTransaction.Free;
end;
end;
end.
Ðобавление пÑоÑедÑÑÑ Ð² обÑий ÑпиÑок
ÐÑзов пÑоÑедÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑии оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ð¾ÑледоваÑелÑно по ÑпиÑкÑ, коÑоÑÑй Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² Ñайле mdf_proclist.pas. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ позиÑии в ÑпиÑке, кÑоме Ñамой пÑоÑедÑÑÑ, ÑказÑваеÑÑÑ Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии ÑÑÑÑкÑÑÑÑ ÐÐ -- ModifyVersion. ÐÑоÑедÑÑа бÑÐ´ÐµÑ Ð²Ñзвана, еÑли ÑекÑÑий Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии ÑÑÑÑкÑÑÑÑ ÐРменÑÑе либо Ñавен знаÑÐµÐ½Ð¸Ñ ModifyVersion.
Ðобавление наÑей пÑоÑедÑÑÑ Ð² ÑпиÑок ÑÑебÑÐµÑ ÑÑÐµÑ Ð¿ÑоÑÑÑÑ Ð´ÐµÐ¹ÑÑвий:
- ÐобавиÑÑ Ð¸Ð¼Ñ Ð½Ð°Ñего модÑÐ»Ñ Ð² ÑекÑÐ¸Ñ uses.
- УвелиÑиÑÑ ÑÑеÑÑик cProcCount.
- ÐобавиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² маÑÑив cProcList. ÐÑе Ñаз обÑаÑиÑе внимание на Ñо, ÑÑо ModifyVersion Ð´Ð»Ñ Ð½Ð°Ñей пÑоÑедÑÑÑ ÑÑо не ÑÐ¾Ñ Ð½Ð¾Ð¼ÐµÑ, коÑоÑÑй она пÑиÑÐ²Ð¾Ð¸Ñ Ð² ÑезÑлÑÑаÑе Ñвоего вÑполнениÑ, а пÑедÑдÑÑий!
ÐомпилÑÑÐ¸Ñ Ð¸ запÑÑк
ТепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑекомпилиÑоваÑÑ Ð¸ запÑÑÑиÑÑ gedemin.exe. ÐÑи попÑÑке подклÑÑÐµÐ½Ð¸Ñ Ðº базе даннÑÑ Ñ ÑÑÑаÑевÑей ÑÑÑÑкÑÑÑой под ÑÑеÑной запиÑÑÑ Administrator, на ÑкÑан бÑÐ´ÐµÑ Ð²Ñдано ÑообÑение о Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи обновиÑÑ ÑÑÑÑкÑÑÑÑ.