mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
I send you a attach of my modified refint.c that
works with a new policy in cascade mode . Please Read README.MAX . I do not know if you are the author of refint.c , but if not please tell me who is . Thank you ( excuse me for my bad english) . Massimo Lambertini massimo.lambertini@everex.it
This commit is contained in:
123
contrib/spi/preprocessor/step2.pl
Executable file
123
contrib/spi/preprocessor/step2.pl
Executable file
@ -0,0 +1,123 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
##
|
||||
## MAIN
|
||||
##
|
||||
$table_name="";
|
||||
$old_name="";
|
||||
$references_table="";
|
||||
$references_column="";
|
||||
$is_create=0;
|
||||
|
||||
|
||||
|
||||
while ( <> )
|
||||
{
|
||||
chop;
|
||||
$str=$_ ;
|
||||
|
||||
if ($is_create == 1) {
|
||||
$table_name=$str;
|
||||
$is_create=2;
|
||||
}
|
||||
if ( $str =~ /^CREATE TABLE/ ){
|
||||
$is_create=1;
|
||||
}
|
||||
if ($is_create == 2) {
|
||||
if ($str =~ /^FOREIGN KEY/){
|
||||
($d1,$d2,$d3,$columns,$d4,$d5,$references_table,$d6) = split (/ /,$str,8);
|
||||
#printf "Table $table_name $columns $references_table\n";
|
||||
|
||||
if ($table_name ne $old_name ){
|
||||
printf "--\n-- Trigger for $table_name\n--\n\n";
|
||||
}
|
||||
|
||||
foreach $i ( split(/,/ , $columns ) ){
|
||||
print "CREATE INDEX I_$table_name";
|
||||
print "_$i ON $table_name ( $i ) ;\n";
|
||||
}
|
||||
|
||||
printf "\nCREATE TRIGGER T_P_$table_name";
|
||||
printf "_$references_table BEFORE INSERT OR UPDATE ON $table_name FOR EACH ROW\n" ;
|
||||
printf "EXECUTE PROCEDURE\n";
|
||||
printf "check_primary_key(";
|
||||
$val=0;
|
||||
foreach $i ( split(/,/ , $columns ) ){
|
||||
print "'$i',";
|
||||
$val=$val+1 ;
|
||||
}
|
||||
print "'$references_table',";
|
||||
|
||||
$t=1;
|
||||
foreach $i ( split(/,/,$columns ) ){
|
||||
print "'$i'";
|
||||
if ( $t < $val ) {
|
||||
printf ",";
|
||||
}
|
||||
$t=$t+1;
|
||||
}
|
||||
print " );\n\n";
|
||||
|
||||
printf "CREATE TRIGGER T_F_D_$references_table";
|
||||
printf "_$table_name BEFORE DELETE ON $references_table FOR EACH ROW\n" ;
|
||||
printf "EXECUTE PROCEDURE\n";
|
||||
printf "check_foreign_key(1,'cascade',";
|
||||
$val=0;
|
||||
foreach $i ( split(/,/ , $columns ) ){
|
||||
print "'$i',";
|
||||
$val=$val+1 ;
|
||||
}
|
||||
print "'$table_name',";
|
||||
|
||||
$t=1;
|
||||
foreach $i ( split(/,/,$columns ) ){
|
||||
print "'$i'";
|
||||
if ( $t < $val ) {
|
||||
printf ",";
|
||||
}
|
||||
$t=$t+1;
|
||||
}
|
||||
print " );\n\n";
|
||||
|
||||
printf "CREATE TRIGGER T_F_U_$references_table";
|
||||
printf "_$table_name AFTER UPDATE ON $references_table FOR EACH ROW\n" ;
|
||||
printf "EXECUTE PROCEDURE\n";
|
||||
printf "check_foreign_key(1,'cascade',";
|
||||
$val=0;
|
||||
foreach $i ( split(/,/ , $columns ) ){
|
||||
print "'$i',";
|
||||
$val=$val+1 ;
|
||||
}
|
||||
print "'$table_name',";
|
||||
|
||||
$t=1;
|
||||
foreach $i ( split(/,/,$columns ) ){
|
||||
print "'$i'";
|
||||
if ( $t < $val ) {
|
||||
printf ",";
|
||||
}
|
||||
$t=$t+1;
|
||||
}
|
||||
print " );\n\n";
|
||||
|
||||
if ($table_name ne $old_name ){
|
||||
printf "-- ********************************\n\n\n";
|
||||
}
|
||||
$old_name=$table_name ;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
if ($str =~ /^\)\;/ ) {
|
||||
$is_create = 0 ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user