Re: Create Table Dinamic

From: "Anderson dos Santos Donda" <andersondonda(at)gmail(dot)com>
To: "Craig Ringer" <craig(at)postnewspapers(dot)com(dot)au>, pgsql-general(at)postgresql(dot)org
Subject: Re: Create Table Dinamic
Date: 2008-08-07 13:55:06
Message-ID: ad072ae30808070655o5b5ea37v58ebce05e0ef6872@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, Aug 6, 2008 at 11:59 PM, Craig Ringer
<craig(at)postnewspapers(dot)com(dot)au>wrote:

> Anderson dos Santos Donda wrote:
>
> > PS : If somebody want knows why I need to create this function, is
> because
> > in my db have 1000 tables with the some colums, and each time I have a
> new
> > client, I need to create this tables manually.
>
> While EXECUTE or CREATE TABLE ... LIKE is the answer to the immediate
> question, I have to ask: Is this really the best approach?
>
> This is a bit of a design red flag, you see. Is it possible that rather
> than:
>
> CREATE TABLE x_client1(
> x_client1_id SERIAL PRIMARY KEY,
> name TEXT
> );
>
> CREATE TABLE x_client2(
> x_client2_id SERIAL PRIMARY KEY,
> name TEXT
> );
>
> CREATE TABLE x_client3(
> x_client3_id SERIAL PRIMARY KEY,
> name TEXT
> );
>
>
>
> ... etc, you might be better off with:
>
>
>
> CREATE TABLE client (
> client_id SERIAL PRIMARY KEY,
> client_name TEXT NOT NULL
> -- etc
> );
>
> CREATE TABLE x (
> x_id SERIAL NOT NULL PRIMARY KEY,
> client_id INTEGER NOT NULL,
> FOREIGN KEY (client_id) REFERENCES client(client_id) ON DELETE CASCADE,
> -- Then the fields from the template table for `x':
> name TEXT,
> -- etc
> );
>
> CREATE INDEX x_client_id_fkey ON x (client_id);
>
>
>
> ?
>
> If you are separating the tables for better control over priveleges or
> the like, might it be better to create a new database instance per
> client instead?
>
> Of course, there are certainly cases where templated tables make sense.
> In particular, if you need some resources shared between all users, but
> other resources to be restricted by database permissions to be private
> to each user, then cloned tables make sense. Putting them in per-user
> schema keeps things clean and lets you use the schema search path rather
> than lots of ugly table name pre/suffixes if you have to do this.
>
> --
> Craig Ringer

Thanks all for Help, and answer Craig...

Each client has a db, and each db has the same tables. I don't need to share
datas with the clients ( and I can't do it ) , because each clients have
differents datas in yours tables.

My function is to help me to create a new db with the tables.

I have a particular server db with the names tables of each client, so I
want to do a FOR LOOP in my function to create my tables on new database.

Example

CREATE OR REPLACE FUNCTION CreateTriggersFunctionsSetValues()
RETURNS VOID AS
$BODY$
DECLARE
NumRowsQuotes ativos%ROWTYPE;
NameTable text := '';
BEGIN

FOR NumRowsQuotes IN SELECT * FROM ativos
LOOP
SELECT INTO NameTable ativos WHERE codigo = NumRowsQuotes;
setvalues(NameTable);
END LOOP;

END;
$BODY$

LANGUAGE 'plpgsql' VOLATILE;

If there a better way to do it .. I thanks to tell me!!

Any way.. thanks for Help!!

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Kevin Murphy 2008-08-07 13:57:23 How to use postgresql-jdbc rpm with Sun JDK
Previous Message Merlin Moncure 2008-08-07 13:41:27 Re: bytea encode performance issues