从bash脚本生成文件

从bash脚本生成文件,bash,postgresql,heredoc,Bash,Postgresql,Heredoc,我必须生成一个file.sql文件,其中包含一些DDL语句 首先,它应该创建一个数据库用户、模式并授予一些权限。然后,它应该将一些表的副本复制到新创建的模式中。我在bash数组变量中保存的表名。数组中的表数可能不同 我无法创建一个cat>file.sql$文件就可以做到这一点。您的目标是什么?要将一个模式复制到另一个模式?要转储数据库吗?有很多方法可以在没有bash的情况下使用pg_dump或普通SQL来实现,但不清楚您想要做什么。此外,模式是否在同一个数据库中?我的目标是使用sql语句创建一个

我必须生成一个file.sql文件,其中包含一些DDL语句

首先,它应该创建一个数据库用户、模式并授予一些权限。然后,它应该将一些表的副本复制到新创建的模式中。我在bash数组变量中保存的表名。数组中的表数可能不同

我无法创建一个
cat>file.sql
块执行此操作,因为我需要生成CREATETABLE和ALTERTABLE命令。。取决于表计数

我制作了一个带有变量和三个bash函数的generate.sh脚本:

TABLES=( "table_one" "table_two" "table_three" "table_four" "table_five")
SOURCE_SCHEMA="src"
TARGET_SCHEMA="tgt"
FILE=file.sql
生成文件后,file.sql应该如下所示:

\connect dbname
CREATE USER u_user WITH PASSWORD 'blah';
CREATE SCHEMA IF NOT EXISTS src AUTHORIZATION u_user;
GRANT USAGE ON SCHEMA src TO u_user;

CREATE TABLE src.temp (
    id INTEGER PRIMARY KEY,
    schema_name VARCHAR(100),
    table_name VARCHAR(100),
    truncated BOOLEAN DEFAULT false
);

CREATE TABLE src.table_one AS TABLE tgt.table_one;
ALTER TABLE src.table_one ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (1, 'tgt', 'table_one');

CREATE TABLE src.table_two AS TABLE tgt.table_two;
ALTER TABLE src.table_two ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (2, 'tgt', 'table_two');

CREATE TABLE src.table_three AS TABLE tgt.table_three;
ALTER TABLE src.table_three ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (3, 'tgt', 'table_three');
etc

CREATE OR REPLACE FUNCTION ..
CREATE OR REPLACE FUNCTION ..
CREATE OR REPLACE FUNCTION ..

如果只有sql语句具有固定数量的表,那么使用一个
cat>$文件就可以做到这一点。您的目标是什么?要将一个模式复制到另一个模式?要转储数据库吗?有很多方法可以在没有bash的情况下使用pg_dump或普通SQL来实现,但不清楚您想要做什么。此外,模式是否在同一个数据库中?我的目标是使用sql语句创建一个普通文件。问题是,我希望使用
cat>$FILE来实现这一点。我的计划是为公司DBA创建统一的解决方案—使用脚本并在您自己的db实例上运行。在我的解决方案中,在执行一个bash函数后,我需要检查file.sql是否有所有需要的语句(使用
sed
string替换)。然后执行另一个bash函数。。。还有一张支票。如果文件没有一些sql语句,例如一个bash func失败。。我不想将该文件馈送到
psql
。我希望能够更智能地实现这一点,如果只针对postgreSQL,使用PL函数会更容易,因为您可以访问数据库模式。使用PL,您可以创建准备运行的.sql文件。但如果它是针对任何DBMS的,那么我建议使用bash aproach或其他。
function create_prepare_sql_v2 {
count=1
for table in ${!TABLES[@]}; do
        ( echo -e "CREATE TABLE $SOURCE_SCHEMA.${TABLES[$table]} AS TABLE $TARGET_SCHEMA.${TABLES[$table]};" \
        "\nALTER TABLE $SOURCE_SCHEMA.${TABLES[$table]} ADD PRIMARY KEY(id);" \
        "\nINSERT INTO $SOURCE_SCHEMA.temp VALUES ("$count", '"$TARGET_SCHEMA"', '"${TABLES[$table]}"');" ) >> $FILE
        ((count++))
done
function create_prepare_sql_v3 {
   cat >> $FILE << 'EOF_SQL_V3'

...here I put my custom PL/pgSQL functions...

EOF_SQL_V3

create_prepare_sql_v1 && echo "step1_done" >> $FILE || exit 1
create_prepare_sql_v2 && sed -i 's/step1_done/step2_done/' $FILE || exit 1
create_prepare_sql_v3 && sed -i 's/step2_done/step3_done/' $FILE || exit 1


if ! fgrep -q 'step3_done' $FILE ; then
        echo "Something went wrong. Exiting.."
        exit 1
fi

sed -i '/step3_done/d' $FILE
echo "All good."
\connect dbname
CREATE USER u_user WITH PASSWORD 'blah';
CREATE SCHEMA IF NOT EXISTS src AUTHORIZATION u_user;
GRANT USAGE ON SCHEMA src TO u_user;

CREATE TABLE src.temp (
    id INTEGER PRIMARY KEY,
    schema_name VARCHAR(100),
    table_name VARCHAR(100),
    truncated BOOLEAN DEFAULT false
);

CREATE TABLE src.table_one AS TABLE tgt.table_one;
ALTER TABLE src.table_one ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (1, 'tgt', 'table_one');

CREATE TABLE src.table_two AS TABLE tgt.table_two;
ALTER TABLE src.table_two ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (2, 'tgt', 'table_two');

CREATE TABLE src.table_three AS TABLE tgt.table_three;
ALTER TABLE src.table_three ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (3, 'tgt', 'table_three');
etc

CREATE OR REPLACE FUNCTION ..
CREATE OR REPLACE FUNCTION ..
CREATE OR REPLACE FUNCTION ..