2.2.3. Secondary Tables

The script for creating the INVOICE table:

  1. CREATE GENERATOR GEN_INVOICE_ID;
  2. CREATE TABLE INVOICE (
  3. INVOICE_ID INTEGER NOT NULL,
  4. CUSTOMER_ID INTEGER NOT NULL,
  5. INVOICE_DATE TIMESTAMP,
  6. TOTAL_SALE D_MONEY,
  7. PAID D_BOOLEAN DEFAULT 0 NOT NULL,
  8. CONSTRAINT PK_INVOICE PRIMARY KEY (INVOICE_ID)
  9. );
  10. ALTER TABLE INVOICE ADD CONSTRAINT FK_INVOCE_CUSTOMER
  11. FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (CUSTOMER_ID);
  12. CREATE INDEX INVOICE_IDX_DATE ON INVOICE (INVOICE_DATE);
  13. SET TERM ^;
  14. CREATE OR ALTER TRIGGER INVOICE_BI FOR INVOICE
  15. ACTIVE BEFORE INSERT POSITION 0
  16. AS
  17. BEGIN
  18. IF (NEW.INVOICE_ID IS NULL) THEN
  19. NEW.INVOICE_ID = GEN_ID(GEN_INVOICE_ID,1);
  20. END
  21. ^
  22. SET TERM ;^
  23. COMMENT ON TABLE INVOICE IS
  24. 'Invoices';
  25. COMMENT ON COLUMN INVOICE.INVOICE_ID IS
  26. 'Invoice number';
  27. COMMENT ON COLUMN INVOICE.CUSTOMER_ID IS
  28. 'Customer Id';
  29. COMMENT ON COLUMN INVOICE.INVOICE_DATE IS
  30. 'The date of issuance invoices';
  31. COMMENT ON COLUMN INVOICE.TOTAL_SALE IS
  32. 'Total sum';
  33. COMMENT ON COLUMN INVOICE.PAID IS
  34. 'Paid';

The INVOICE_DATE column is indexed because we will be filtering invoices by date to enable the records to be selected by a work period that will be application-defined by a start date and an end date.

In Firebird 3.0, you need to add the command for granting the USAGE privilege for a sequence (generator) to the script:

  1. GRANT USAGE ON SEQUENCE GEN_INVOICE_ID TO TRIGGER INVOICE_BI;

The script for creating the INVOICE_LINE table:

  1. CREATE GENERATOR GEN_INVOICE_LINE_ID;
  2. CREATE TABLE INVOICE_LINE (
  3. INVOICE_LINE_ID INTEGER NOT NULL,
  4. INVOICE_ID INTEGER NOT NULL,
  5. PRODUCT_ID INTEGER NOT NULL,
  6. QUANTITY NUMERIC(15,0) NOT NULL,
  7. SALE_PRICE D_MONEY NOT NULL,
  8. CONSTRAINT PK_INVOICE_LINE PRIMARY KEY (INVOICE_LINE_ID)
  9. );
  10. ALTER TABLE INVOICE_LINE ADD CONSTRAINT FK_INVOICE_LINE_INVOICE
  11. FOREIGN KEY (INVOICE_ID) REFERENCES INVOICE (INVOICE_ID);
  12. ALTER TABLE INVOICE_LINE ADD CONSTRAINT FK_INVOICE_LINE_PRODUCT
  13. FOREIGN KEY (PRODUCT_ID) REFERENCES PRODUCT (PRODUCT_ID);
  14. SET TERM ^;
  15. CREATE OR ALTER TRIGGER INVOICE_LINE_BI FOR INVOICE_LINE
  16. ACTIVE BEFORE INSERT POSITION 0
  17. AS
  18. BEGIN
  19. IF (NEW.INVOICE_LINE_ID IS NULL) THEN
  20. NEW.INVOICE_LINE_ID = NEXT VALUE FOR GEN_INVOICE_LINE_ID;
  21. END
  22. ^
  23. SET TERM ;^
  24. COMMENT ON TABLE INVOICE_LINE IS
  25. 'Invoice lines';
  26. COMMENT ON COLUMN INVOICE_LINE.INVOICE_LINE_ID IS
  27. 'Invoice line Id';
  28. COMMENT ON COLUMN INVOICE_LINE.INVOICE_ID IS
  29. 'Invoice number';
  30. COMMENT ON COLUMN INVOICE_LINE.PRODUCT_ID IS
  31. 'Product Id';
  32. COMMENT ON COLUMN INVOICE_LINE.QUANTITY IS
  33. 'Quantity';
  34. COMMENT ON COLUMN INVOICE_LINE.SALE_PRICE IS
  35. 'Price';

In Firebird 3.0, you need to add the command for granting the USAGE privilege for a sequence (generator) to the script:

  1. GRANT USAGE ON SEQUENCE GEN_INVOICE_LINE_ID TO TRIGGER INVOICE_LINE_BI;