On Wed, Aug 6, 2008 at 11:59 PM, Craig Ringer
<[EMAIL PROTECTED]>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!!

Reply via email to