powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / truncate таблицы с FK
3 сообщений из 3, страница 1 из 1
truncate таблицы с FK
    #33467961
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению не знаю, что говорит стандарт по поводу Trancate таблицы, на которую есть FK references. ASA9 не дает сделать эту операцию, т.е надо либо предварительно удалить сами FK у ссылающихся таблиц, либо delete from ...,
где FK должен быть ON DELETE CASCADE.
Раньше я в своих небольших базках не использовал FK, работая с данными только через ХП. Сейчас решил встать на путь истинный, но возникают такие вот мелкие неудобства.
Вопрос к практикам:
1. в скрипте создания БД приходится учитывать порядок создания таблиц. Если пользоваться инструментами типа PowerDesigner (я им не пользовался серьезно), то корректно ли он разруливает эти зависимости и создает правильный скрипт БД из модели?
2. PK, FK можно создавать непосредственно в CREATE TABLE либо создавать отдельно через ALTER TABLE. Какой из методов удобнее оказывается на практике, при условии что БД находится в стадии разработки, будет часто меняться/патчится/ перезаливаться/выгружаться данные?
3. Каке есть еще есть моменты, на которые следует обратить внимание?

Спасибо.
все наши на www.corba.kubsu.ru
...
Рейтинг: 0 / 0
truncate таблицы с FK
    #33468325
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветик. С наступившим :) По сабжу:
1. Обычно скрипт создания БД сначала создает таблицы, потом в них заливаются данные, потом уже навешиваются FK. Так делает утилита перезагрузки БД в ASA, так делает скорее всего и PD.
2. По моему без разницы, как навешивать PK и FK. Однако для пункта 1 естественно все будет идти через ALTER TABLE.
3. Моментов всегда много, но возникают они при непосредственной разработке задачи по конкретному ТЗ, из головы вряд ли что то можно посоветовать :) К примеру чтобы обнулить все таблицы в БД не спотыкаясь об FK достаточно взять их зависимости из системных таблиц и построить их правильный порядок обнуления и заполнения (примеры есть в FAQ). Чтобы апдейтить и синхронизировать БД, не обязательно использовать PD, вполне достаточно использовать Central/ISQL и логировать все изменения на SQL-скриптах ручками или поднимая их из лог-файла, фильтруя по логинам разработчиков.
...
Рейтинг: 0 / 0
truncate таблицы с FK
    #33468387
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2) Если вопрос стоит в каком виде хранить команды в скриптах пересоздания базы во время разработки структуры базы, то я бы сказал что alter table ... constraint использовать лучше. Тогда если вдруг появится нужда в добавлении/изменении какого либо из принуждений не нужно будет заново набивать таблицу тестовыми данными.

И не совсем в тему вопроса, или к третему вопросу? :) Просто я как раз на прошлой неделе возился со слияним двух баз с кучей связей на внешних ключах. Пришел в итоге вот к такому батничку, может кому пригодится. Батник расчитан на Win2000 и ASA9.
Код: plaintext
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.
@echo off
setlocal
rem Change next lines
set TargetDSN=MyGlobalDB
set Login=user
set Password=password
set SourceDB=d:\DBfromFarAway.db
set BaseDir=\mydb
set PrimaryKeyColumn=BaseId
rem
rem
rem
rem DO NOT CHANGE ANYTHING BELOW THIS!!!
rem
rem
set SourceDBConnect=ENG=SourceDB;UID=%Login%;PWD=%Password%
set TargetDBConnect=DSN=%TargetDSN%;UID=%Login%;PWD=%Password%
if not exist %BaseDir%\temp mkdir %BaseDir%\temp
cd %BaseDir%\temp
for /F "tokens=2" %%i in ('date /T') do set A=%%i
for /F "tokens=1-3 delims=/" %%a in ("%A%") do set BackupDir=%BaseDir%\Backup_Before_Joining_%%c_%%a
mkdir %BackupDir%
echo Backing up target database into %BackupDir%
start /w dbisqlc -q -c "%TargetDBConnect%" BACKUP DATABASE DIRECTORY '%BackupDir%';STOP ENGINE UNCONDITIONALLY
echo create table #tbl(table_id integer, table_name char( 32 ), references_order integer default  0 ); >GetListOfTables.sql
echo insert into #tbl(table_id, table_name) >>GetListOfTables.sql
echo     select t.table_id, t.table_name >>GetListOfTables.sql
echo         from sys.systable t >>GetListOfTables.sql
echo             join sys.syscolumn c on t.table_id=c.table_id >>GetListOfTables.sql
echo         where t.table_type='BASE' and c.column_name='%PrimaryKeyColumn%' and creator= 1 ; >>GetListOfTables.sql
echo begin >>GetListOfTables.sql
echo     declare o integer; >>GetListOfTables.sql
echo     set o= 0 ; >>GetListOfTables.sql
echo     while o is not null loop >>GetListOfTables.sql
echo         update #tbl set references_order = o+ 1  >>GetListOfTables.sql
echo             from sys.sysforeignkey >>GetListOfTables.sql
echo             where foreign_table_id=#tbl.table_id and primary_table_id in >>GetListOfTables.sql
echo 				(select table_id from #tbl where references_order=o); >>GetListOfTables.sql
echo         if @@rowcount= 0  then set o=null; else set o=o+ 1 ; end if; >>GetListOfTables.sql
echo     end loop; >>GetListOfTables.sql
echo end; >>GetListOfTables.sql
echo select table_name from #tbl order by references_order, table_name; >>GetListOfTables.sql
echo output to ListOfTables.lst format fixed; >>GetListOfTables.sql
echo drop table #tbl; >>GetListOfTables.sql
echo Unloading tables from source database....
start /w dbisqlc -q -c "StartLine=dbeng9 -r -gk all -gl all -n SourceDB;DBF=%SourceDB%;ASTOP=NO;%SourceDBConnect%" GetListOfTables.sql
echo set temporary option date_format='yyyy-mm-dd';>unload.sql
for /F %%i in (ListOfTables.lst) do echo print 'unloading %%i';>>unload.sql
for /F %%i in (ListOfTables.lst) do echo UNLOAD TABLE "DBA"."%%i" TO '%%i.dat' APPEND OFF;>>unload.sql
echo STOP ENGINE UNCONDITIONALLY;>>unload.sql
start /w dbisqlc -q -c "%SourceDBConnect%" unload.sql
echo Loading tables into target database....
start /w dbisqlc -q -c "StartLine=dbeng9 -gk all -gl all;ASTOP=NO;%TargetDBConnect%" GetListOfTables.sql
echo set option date_format='yyyy-mm-dd';>load.sql
for /F %%i in (ListOfTables.lst) do echo print 'loading %%i';>>load.sql
for /F %%i in (ListOfTables.lst) do echo LOAD TABLE "DBA"."%%i" FROM '%%i.dat' CHECK CONSTRAINTS OFF;>>load.sql
for /F %%i in (ListOfTables.lst) do if not exist %%i.dat copy nul %%i.dat>nul
echo commit;>>load.sql
echo STOP ENGINE UNCONDITIONALLY;>>load.sql
start /w dbisqlc -q -c "%TargetDBConnect%" load.sql
echo y|del /F /Q *.*
cd ..
rd temp
echo Done.
pause
endlocal
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / truncate таблицы с FK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]