create db2 index on non-partitioned table in different tablespace - database

I have created Non partitined table in db2.
create table test (name varchar (22), cell# integer);
table created succesffully.
Now I want to create index on test table in tablespace TEST_IDX.
I execute following query
CREATE INDEX test1 ON test (cell#) in TEST_IDX.
It give me following error:
[CREATE - 0 row(s), 0.000 secs] [Error Code: -109, SQL State: 42601] DB2 SQL Error: SQLCODE=-109, SQLSTATE=42601, SQLERRMC=IN
db2 database version is DB2/LINUXZ64 9.7.3

I think you will have to specify that for the table, i.e.:
create table test (
...
) in <tblspc> index in TEST_IDX
See ADMIN_MOVE_TABLE ( http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dm.doc/doc/t0054864.html?resultof=%22%6d%6f%76%65%5f%74%61%62%6c%65%22%20 ) for more information.

Index tablespace should be defined during table creation, if not mentioned index will be created in same tablespace where table is exist.

Related

SQL Data Warehouse External Table with String fields

I am unable to find a way to create an external table in Azure SQL Data Warehouse (Synapse SQL Pool) with Polybase where some fields contain embedded commas.
For a csv file with 4 columns as below:
myresourcename,
myresourcelocation,
"""resourceVersion"": ""windows"",""deployedBy"": ""john"",""project_name"": ""test_project""",
"{ ""ResourceType"": ""Network"", ""programName"": ""v1""}"
Tried with the following Create External Table statements.
CREATE EXTERNAL FILE FORMAT my_format
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS(
FIELD_TERMINATOR=',',
STRING_DELIMITER='"',
First_Row = 2
)
);
CREATE EXTERNAL TABLE my_external_table
(
resourceName VARCHAR,
resourceLocation VARCHAR,
resourceTags VARCHAR,
resourceDetails VARCHAR
)
WITH (
LOCATION = 'my/location/',
DATA_SOURCE = my_source,
FILE_FORMAT = my_format
)
But querying this table gives the following error:
Failed to execute query. Error: HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: HadoopExecutionException: Too many columns in the line.
Any help will be appreciated.
Currently this is not supported in polybase, need to modify the input data accordingly to get it working.

HSQLDB connection in Talend: User lacks privilege or object not found using

I'm currently doing a comparision between Stambia and Talend. For this, I wanted to use the same data. So I tried to use the data available for Stambia tutorials. These are coming from an HSQL Database.
For this, I made a HSQLDB Sever with simples proprieties :
server.database.0 = file:hsqldb/demodb
server.dbname.0 = testdb
After that, I added the script whose coming from Stambia into my new database "demodb" :
SET DATABASE UNIQUE NAME HSQLDB2467A82B33
SET DATABASE GC 0
SET DATABASE DEFAULT RESULT MEMORY ROWS 0
SET DATABASE EVENT LOG LEVEL 0
SET DATABASE SQL NAMES FALSE
SET DATABASE SQL REFERENCES FALSE
SET DATABASE SQL SIZE FALSE
SET DATABASE SQL TYPES FALSE
SET DATABASE SQL TDC DELETE TRUE
SET DATABASE SQL TDC UPDATE TRUE
SET DATABASE SQL TRANSLATE TTI TYPES TRUE
SET DATABASE SQL CONCAT NULLS TRUE
SET DATABASE SQL UNIQUE NULLS TRUE
SET DATABASE SQL CONVERT TRUNCATE TRUE
SET DATABASE SQL AVG SCALE 0
SET DATABASE SQL DOUBLE NAN TRUE
SET DATABASE TRANSACTION CONTROL LOCKS
SET DATABASE DEFAULT ISOLATION LEVEL READ COMMITTED
SET DATABASE TRANSACTION ROLLBACK ON CONFLICT TRUE
SET DATABASE TEXT TABLE DEFAULTS ''
SET FILES WRITE DELAY 10
SET FILES BACKUP INCREMENT TRUE
SET FILES CACHE SIZE 10000
SET FILES CACHE ROWS 50000
SET FILES SCALE 1
SET FILES LOB SCALE 32
SET FILES DEFRAG 0
SET FILES NIO TRUE
SET FILES NIO SIZE 256
SET FILES LOG TRUE
SET FILES LOG SIZE 200
CREATE USER SA PASSWORD DIGEST 'd41d8cd98f00b204e9800998ecf8427e'
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
CREATE SCHEMA DATAMART AUTHORIZATION DBA
CREATE SCHEMA HOTEL_DATAMART AUTHORIZATION DBA
SET SCHEMA DATAMART
CREATE MEMORY TABLE DATAMART.DIM_CUSTOMER(CUS_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,CUS_ID INTEGER NOT NULL,CUS_TITLE CHARACTER(32),CUS_NAME CHARACTER(50) NOT NULL,CUS_FORNAME VARCHAR(25),CUS_COMPANY VARCHAR(100),GEO_KEY_ID INTEGER,UPDATE_DATE TIMESTAMP,CONSTRAINT PK_DIM_CUSTOMER PRIMARY KEY(CUS_KEY_ID))
ALTER TABLE DATAMART.DIM_CUSTOMER ALTER COLUMN CUS_KEY_ID RESTART WITH 300
CREATE INDEX CUSTOMER_ID ON DATAMART.DIM_CUSTOMER(CUS_ID)
CREATE MEMORY TABLE DATAMART.DIM_GEOGRAPHY(GEO_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,GEO_ZIP_CODE VARCHAR(6),GEO_CITY VARCHAR(50),GEO_DISTRICT_CODE VARCHAR(3),GEO_DISTRICT VARCHAR(50),GEO_REGION VARCHAR(50),CONSTRAINT PK_DIM_GEOGRAPHY PRIMARY KEY(GEO_KEY_ID))
ALTER TABLE DATAMART.DIM_GEOGRAPHY ALTER COLUMN GEO_KEY_ID RESTART WITH 2
CREATE UNIQUE INDEX I_DIM_GEOGRAPHY ON DATAMART.DIM_GEOGRAPHY(GEO_ZIP_CODE,GEO_CITY)
CREATE MEMORY TABLE DATAMART.DIM_TIME(TIME_KEY_DAY VARCHAR(10) NOT NULL,TIME_DATE TIMESTAMP,TIME_MONTH_DAY NUMERIC(2),TIME_WEEK_DAY NUMERIC(1),TIME_DAY_NAME VARCHAR(15),TIME_MONTH NUMERIC(2),TIME_MONTH_NAME VARCHAR(15),TIME_QUARTER NUMERIC(1),TIME_YEAR NUMERIC(4),CONSTRAINT PK_DIM_TIME PRIMARY KEY(TIME_KEY_DAY))
CREATE INDEX TIME_DAY ON DATAMART.DIM_TIME(TIME_DATE)
CREATE MEMORY TABLE DATAMART.DIM_DISCOUNT(DIS_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,DIS_RANGE VARCHAR(35),DIS_MIN NUMERIC(3),DIS_MAX NUMERIC(3),CONSTRAINT PK_DIM_DISCOUNT PRIMARY KEY(DIS_KEY_ID))
ALTER TABLE DATAMART.DIM_DISCOUNT ALTER COLUMN DIS_KEY_ID RESTART WITH 19
CREATE MEMORY TABLE DATAMART.DIM_PAYMENT_TYPES(PMT_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,PMT_CODE VARCHAR(10),PMT_NAME VARCHAR(35),CONSTRAINT PK_DIM_PAYMENT_TYPES PRIMARY KEY(PMT_KEY_ID))
ALTER TABLE DATAMART.DIM_PAYMENT_TYPES ALTER COLUMN PMT_KEY_ID RESTART WITH 9
CREATE MEMORY TABLE DATAMART.DIM_CHAMBER(CHB_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,CHB_ID NUMERIC(10),CHB_NUMBER NUMERIC(4),CHB_FLOOR NUMERIC(2),CHB_BATH NUMERIC(1),CHB_SHOWER NUMERIC(1),CHB_WC NUMERIC(1),CHB_BED_NUMBER NUMERIC(2),CHB_PHONE_NUMBER CHARACTER(3),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_DIM_CHAMBER PRIMARY KEY(CHB_KEY_ID))
ALTER TABLE DATAMART.DIM_CHAMBER ALTER COLUMN CHB_KEY_ID RESTART WITH 60
CREATE INDEX CHAMBER_ID ON DATAMART.DIM_CHAMBER(CHB_ID)
CREATE MEMORY TABLE DATAMART.FACT_BILLING(BIL_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,BIL_ID NUMERIC(10,2),CUS_KEY_ID INTEGER,TIME_KEY_DAY VARCHAR(10),DIS_KEY_ID INTEGER,PMT_KEY_ID INTEGER,BIL_MONTANT NUMERIC(10,2),BIL_QTE NUMERIC(10),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_FACT_BILLING PRIMARY KEY(BIL_KEY_ID),CONSTRAINT FK_FACT_BILLING_CUS FOREIGN KEY(CUS_KEY_ID) REFERENCES DATAMART.DIM_CUSTOMER(CUS_KEY_ID),CONSTRAINT FK_FACT_BILLING_DIS FOREIGN KEY(DIS_KEY_ID) REFERENCES DATAMART.DIM_DISCOUNT(DIS_KEY_ID),CONSTRAINT FK_FACT_BILLING_PMT FOREIGN KEY(PMT_KEY_ID) REFERENCES DATAMART.DIM_PAYMENT_TYPES(PMT_KEY_ID),CONSTRAINT FK_FACT_BILLING_TIME FOREIGN KEY(TIME_KEY_DAY) REFERENCES DATAMART.DIM_TIME(TIME_KEY_DAY))
ALTER TABLE DATAMART.FACT_BILLING ALTER COLUMN BIL_KEY_ID RESTART WITH 8532
CREATE MEMORY TABLE DATAMART.FACT_BOOKING(BOK_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,CUS_KEY_ID INTEGER,TIME_KEY_DAY VARCHAR(10),CHB_KEY_ID INTEGER,BOK_NP_PEOPLE NUMERIC(10),BOK_BOOKED NUMERIC(1),BOK_OCCUPIED NUMERIC(1),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_FACT_BOOKING PRIMARY KEY(BOK_KEY_ID),CONSTRAINT FK_FACT_BOOKING_CHB FOREIGN KEY(CHB_KEY_ID) REFERENCES DATAMART.DIM_CHAMBER(CHB_KEY_ID),CONSTRAINT FK_FACT_BOOKING_CUS FOREIGN KEY(CUS_KEY_ID) REFERENCES DATAMART.DIM_CUSTOMER(CUS_KEY_ID),CONSTRAINT FK_FACT_BOOKING_TIME FOREIGN KEY(TIME_KEY_DAY) REFERENCES DATAMART.DIM_TIME(TIME_KEY_DAY))
ALTER TABLE DATAMART.FACT_BOOKING ALTER COLUMN BOK_KEY_ID RESTART WITH 43686
CREATE INDEX BOOK_CUS ON DATAMART.FACT_BOOKING(CUS_KEY_ID)
CREATE INDEX BOOK_TIM ON DATAMART.FACT_BOOKING(TIME_KEY_DAY)
SET SCHEMA HOTEL_DATAMART
CREATE SEQUENCE HOTEL_DATAMART.SEQ_GEO_KEY_ID AS INTEGER START WITH 1000
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_BEDROOM(BDR_ID NUMERIC(10),BDR_NUMBER NUMERIC(4),BDR_FLOOR NUMERIC(2),BDR_BATH NUMERIC(1),BDR_SHOWER NUMERIC(1),BDR_BAR NUMERIC(1),BDR_BED_COUNT NUMERIC(2),BDR_PHONE_NUMBER VARCHAR(3),BDR_TYPE VARCHAR(30),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_DIM_BEDROOM PRIMARY KEY(BDR_ID))
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_DISCOUNT(DIS_RANGE VARCHAR(35),DIS_MIN NUMERIC(3),DIS_MAX NUMERIC(3),CONSTRAINT PK_DIM_DISCOUNT PRIMARY KEY(DIS_RANGE))
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_GEOGRAPHY(GEO_KEY_ID NUMERIC(10),GEO_ZIP_CODE VARCHAR(6),GEO_CITY VARCHAR(50),GEO_STATE_CODE VARCHAR(3),GEO_STATE VARCHAR(50),CONSTRAINT PK_DIM_GEOGRAPHY PRIMARY KEY(GEO_KEY_ID))
CREATE INDEX IDX_GEO_ZIP_CODE ON HOTEL_DATAMART.DIM_GEOGRAPHY(GEO_ZIP_CODE)
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_BIL_TYPE(BIL_TYPE_CODE VARCHAR(4),BIL_TYPE_NAME VARCHAR(35),CONSTRAINT PK_DIM_BIL_TYPE PRIMARY KEY(BIL_TYPE_CODE))
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_PAYMENT_TYPE(PMT_CODE VARCHAR(4),PMT_NAME VARCHAR(35),PMT_DESCRIPTION VARCHAR(35),CONSTRAINT PK_DIM_PAYMENT_TYPE PRIMARY KEY(PMT_CODE))
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_TIME(TIME_KEY_DAY VARCHAR(10) NOT NULL,TIME_DATE TIMESTAMP,TIME_MONTH_DAY NUMERIC(2),TIME_WEEK_DAY NUMERIC(1),TIME_DAY_NAME VARCHAR(15),TIME_MONTH NUMERIC(2),TIME_MONTH_NAME VARCHAR(15),TIME_QUARTER NUMERIC(1),TIME_YEAR NUMERIC(4),CONSTRAINT PK_DIM_TIME PRIMARY KEY(TIME_KEY_DAY))
CREATE INDEX IX_TIME_DATE ON HOTEL_DATAMART.DIM_TIME(TIME_DATE)
CREATE MEMORY TABLE HOTEL_DATAMART.DIM_CUSTOMER(CUS_ID INTEGER NOT NULL,CUS_TITLE VARCHAR(32),CUS_NAME VARCHAR(100) NOT NULL,CUS_COMPANY VARCHAR(100),GEO_KEY_ID NUMERIC(10),CUS_VIP NUMERIC(1),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_DIM_CUSTOMER PRIMARY KEY(CUS_ID),CONSTRAINT FK_DIM_CUSTOMER_GEO FOREIGN KEY(GEO_KEY_ID) REFERENCES HOTEL_DATAMART.DIM_GEOGRAPHY(GEO_KEY_ID))
CREATE INDEX IDX_CUS_GEO_KEY_ID ON HOTEL_DATAMART.DIM_CUSTOMER(GEO_KEY_ID)
CREATE MEMORY TABLE HOTEL_DATAMART.FACT_BILLING(BIL_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL,BIL_ID INTEGER,CUS_ID INTEGER,TIME_KEY_DAY VARCHAR(10),DIS_RANGE VARCHAR(35),PMT_CODE VARCHAR(4),BIL_AMOUNT NUMERIC(10,2),BIL_QTY NUMERIC(10,2),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_FACT_BILLING PRIMARY KEY(BIL_KEY_ID),CONSTRAINT FK_FACT_BILLING_DIS FOREIGN KEY(DIS_RANGE) REFERENCES HOTEL_DATAMART.DIM_DISCOUNT(DIS_RANGE),CONSTRAINT FK_FACT_BILLING_CUS FOREIGN KEY(CUS_ID) REFERENCES HOTEL_DATAMART.DIM_CUSTOMER(CUS_ID),CONSTRAINT FK_FACT_BILLING_PMT FOREIGN KEY(PMT_CODE) REFERENCES HOTEL_DATAMART.DIM_PAYMENT_TYPE(PMT_CODE),CONSTRAINT FK_FACT_BILLING_TIME FOREIGN KEY(TIME_KEY_DAY) REFERENCES HOTEL_DATAMART.DIM_TIME(TIME_KEY_DAY))
ALTER TABLE HOTEL_DATAMART.FACT_BILLING ALTER COLUMN BIL_KEY_ID RESTART WITH 1
CREATE INDEX IDX_BIL_CUS_ID ON HOTEL_DATAMART.FACT_BILLING(CUS_ID)
CREATE INDEX IDX_BIL_DIS_RANGE ON HOTEL_DATAMART.FACT_BILLING(DIS_RANGE)
CREATE INDEX IDX_BIL_PMT_CODE ON HOTEL_DATAMART.FACT_BILLING(PMT_CODE)
CREATE INDEX IDX_BIL_TIME_KEY_DAY ON HOTEL_DATAMART.FACT_BILLING(TIME_KEY_DAY)
CREATE INDEX IDX_RANGE_AND_ID ON HOTEL_DATAMART.FACT_BILLING(BIL_ID,DIS_RANGE)
CREATE MEMORY TABLE HOTEL_DATAMART.FACT_BOOKING(BOK_KEY_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL,CUS_ID INTEGER,TIME_KEY_DAY VARCHAR(10),BDR_ID NUMERIC(10),BOK_PEOPLE NUMERIC(10),BOK_BOOKED NUMERIC(1),UPDATE_DATE TIMESTAMP,CONSTRAINT PK_FACT_BOOKING PRIMARY KEY(BOK_KEY_ID),CONSTRAINT FK_FACT_BOOKING_BDR FOREIGN KEY(BDR_ID) REFERENCES HOTEL_DATAMART.DIM_BEDROOM(BDR_ID),CONSTRAINT FK_FACT_BOOKING_CUS FOREIGN KEY(CUS_ID) REFERENCES HOTEL_DATAMART.DIM_CUSTOMER(CUS_ID),CONSTRAINT FK_FACT_BOOKING_TIME FOREIGN KEY(TIME_KEY_DAY) REFERENCES HOTEL_DATAMART.DIM_TIME(TIME_KEY_DAY))
ALTER TABLE HOTEL_DATAMART.FACT_BOOKING ALTER COLUMN BOK_KEY_ID RESTART WITH 1
CREATE INDEX IDX_BOK_BDR_ID ON HOTEL_DATAMART.FACT_BOOKING(BDR_ID)
CREATE INDEX IDX_BOK_TIME_KEY_DAY ON HOTEL_DATAMART.FACT_BOOKING(TIME_KEY_DAY)
CREATE MEMORY TABLE HOTEL_DATAMART.L1_DIM_TIME(L1_TIME_KEY_DAY VARCHAR(10),L2_TIME_DATE TIMESTAMP,L3_TIME_MONTH_DAY NUMERIC(2),L4_TIME_WEEK_DAY NUMERIC(1),L5_TIME_DAY_NAME VARCHAR(15),L6_TIME_MONTH NUMERIC(2),L7_TIME_MONTH_NAME VARCHAR(15),L8_TIME_QUARTER NUMERIC(1),L9_TIME_YEAR NUMERIC(4))
ALTER TABLE DATAMART.DIM_CUSTOMER ADD CONSTRAINT FK_DIM_CUSTOMER_GEO FOREIGN KEY(GEO_KEY_ID) REFERENCES DATAMART.DIM_GEOGRAPHY(GEO_KEY_ID)
ALTER SEQUENCE SYSTEM_LOBS.LOB_ID RESTART WITH 1
ALTER SEQUENCE HOTEL_DATAMART.SEQ_GEO_KEY_ID RESTART WITH 209465
SET DATABASE DEFAULT INITIAL SCHEMA PUBLIC
GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.SQL_IDENTIFIER TO PUBLIC
GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.YES_OR_NO TO PUBLIC
GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.TIME_STAMP TO PUBLIC
GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.CARDINAL_NUMBER TO PUBLIC
GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.CHARACTER_DATA TO PUBLIC
GRANT DBA TO SA
SET SCHEMA SYSTEM_LOBS
INSERT INTO BLOCKS VALUES(0,2147483647,0)
SET SCHEMA DATAMART
INSERT INTO DIM_CUSTOMER VALUES(200,1,'Monsieur','DUPONT ','Alain',NULL,1,'2013-06-04 11:43:21.211000')
INSERT INTO DIM_CUSTOMER VALUES(201,2,'Monsieur','MARTIN ','Marc','Transports MARTIN & fils',1,'2013-06-04 11:43:21.211000')
Now, I made an HSQLDB connection in Talend and I retrieve schema, so I have every tables of base_datamart in Talend.
I created a job with a source (delimited file) to charge my DIM_Discount table through a tMap.
But when I run the job, I get the error : Exception in component tHSQLDbOutput_1 (Load_DIM_DISCOUNT)
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DIM_DISCOUNT
I made research for about 2 days but I didn't find any solutions... if someone ever faced this problem, or has any idea for this, I would be really pleased.
Have a good day, thanks.

How to make the 'public' schema default in a Scala Play project that uses PostgreSQL?

I am not sure if my issue connecting to the Scala Play 2.5.x Framework or to PostgreSQL so I am going to describe my setup.
I am using the Play 2.5.6 with Scala and PostgreSQL 9.5.4-2 from the BigSQL Sandboxes. I use the Play Framework default evolution package to manage the DB versions.
I created a new database in BigSQL Sandbox's PGSQL and PGSQL created a default schema called public. I use this schema for development.
I would like to create a table with the following script (1.sql in DB evolution config):
# Initialize the database
# --- !Ups
CREATE TABLE user (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
creation_date TIMESTAMP NOT NULL
);
# --- !Downs
DROP TABLE user;
Besides that I would like to read the table with a code like this:
val resultSet = statement.executeQuery("SELECT id, name, email FROM public.user WHERE id=" + id.toString)
I got an error if I would like to execute any of the mentioned code or even if I use the CREATE TABLE... code in pgadmin. The issue is with the user table name. If I prefix it with public (i.e. public.user) everything works fine.
My questions are:
Is it normal to prefix the table name with the schema name every time? It seems to odd to me.
How can I make the public schema a default option so I do not have to qualify the table name? (e.g. CREATE TABLE user (...); will not throw an error)
I tried the following:
I set the search_path for my user: ALTER USER my_user SET search_path to public;
I set the search_path for my database: ALTER database "my_database" SET search_path TO my_schema;
search_path correctly shows this: "$user",public
I got the following errors:
In Play: p.a.d.e.DefaultEvolutionsApi - ERROR: syntax error at or near "user"
In pgadmin:
ERROR: syntax error at or near "user"
LINE 1: CREATE TABLE user (
********** Error **********
ERROR: syntax error at or near "user"
SQL state: 42601
Character: 14
This has nothing to do with the default schema. user is a reserved word.
You need to use double quotes to be able to create such a table:
CREATE TABLE "user" (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
creation_date TIMESTAMP NOT NULL
);
But I strongly recommend not doing that. Find a different name that does not require a quoted identifier.

Entity Framework 6 Code First From Database context performs CREATE TABLE on existing an VIEW

We have a production Oracle database server maintained by our ERP partner.
For some custom development I need to connect to this Oracle database using Entity Framework 6. I have a user that can SELECT any table on the ERP schema and I create views in the schema/user used in my EF context.
The view itself is pretty straightforward, a few joins but all referencing tables on another schema ofcourse.
i.e.:
CREATE TABLE ERP.M_GROUP
(
FILE VARCHAR2(3 BYTE)
, MATFAM VARCHAR2(1 BYTE) NOT NULL
, GROUP VARCHAR2(20 BYTE) NOT NULL
, OMS1 VARCHAR2(60 BYTE)
, OMS2 VARCHAR2(60 BYTE)
, RESTW_FACTOR1_I NUMBER
)
CREATE VIEW EF6CTX.GROUPS AS
SELECT
GROUP Id,
MAX(OMS1) Name
FROM
M_GROUP
WHERE
FILE = 'BAT'
AND MATFAM IN ('B','C','I', 'K')
GROUP BY GROEP
When I connect to my database using Visual Studio's Entity Framework 6 Code First from Database identifing as user EF6CTX I can select this view and my model is created as it should.
But when I try to read these groups..
var ctx = new TestContext();
ctx.Database.Log = Console.WriteLine;
foreach (var group in ctx.GROUPS)
{
Console.WriteLine("Group: {0}", group.NAME);
}
I get this result:
Opened connection at 21/11/2014 15:29:05 +01:00
Started transaction at 21/11/2014 15:29:05 +01:00
create table "EF6CTX"."GROUPS"
(
"ID" varchar2(20 CHAR) not null,
"NAME" varchar2(60 CHAR) null,
constraint "PK_GROUPS" primary key ("ID")
)
-- Executing at 21/11/2014 15:29:05 +01:00
-- Failed in 217 ms with error: ORA-01031: insufficient privileges
The user EF6CTX has no permissions to create a table.. ofcourse. But why is it trying to create a table? It should USE the existing view!
Fixed when migrations are disabled:
System.Data.Entity.Database.SetInitializer<TestContext>(null);

Check for duplicate records in sql database using vb.net

Assuming my table consist of two columns ID and Name.
And assume I have my stored procedure working on vb.net that inserts rows into the database.
But my system needs to check if an ID entered in a textbox already exists in the database when ADD button is click.
CREATE PROCEDURE AddOfficeEquipmentProfile
(
#OE_ID varchar(11),
#OE_Category char(3) =NULL,
#OE_SubCategory char(3)= NULL,
#OE_Name varchar(35)=NULL,
#OE_User varchar(35)=NULL,
#OE_Brand varchar(15)=NULL,
#OE_Model varchar(35)=NULL,
#OE_Specs varchar(1000)=NULL,
#OE_SerialNo varchar(35)=NULL,
#OE_PropertyNo varchar(35)=NULL,
#OE_MacAddress varchar(100)=NULL,
#OE_Static_IP varchar(15)=NULL,
#OE_Vendor varchar(35)=NULL,
#OE_PurchaseDate smalldatetime,
#OE_WarrantyInclusiveYear int=NULL,
#OE_WarrantyStatus char(2)= NULL,
#OE_Status varchar(15)=NULL,
#OE_Dept_Code char(3)= NULL,
#OE_Location_Code char(8)= NULL,
#OE_Remarks varchar(1000)= NULL
)
AS
INSERT INTO tblOfficeEquipmentProfile (OE_ID, OE_Category, OE_SubCategory, OE_Name, OE_User, OE_Brand, OE_Model, OE_Specs, OE_SerialNo,
OE_PropertyNo, OE_MacAddress, OE_Static_IP, OE_Vendor, OE_PurchaseDate, OE_WarrantyInclusiveYear, OE_WarrantyStatus, OE_Status, OE_Dept_Code,
OE_Location_Code, OE_Remarks )
VALUES (#OE_ID, #OE_Category, #OE_SubCategory, #OE_Name, #OE_User, #OE_Brand, #OE_Model,
#OE_Specs, #OE_SerialNo, #OE_PropertyNo, #OE_MacAddress, #OE_Static_IP, #OE_Vendor, #OE_PurchaseDate, #OE_WarrantyInclusiveYear, #OE_WarrantyStatus,
#OE_Status, #OE_Dept_Code, #OE_Location_Code, #OE_Remarks)
GO
few things you can do
make ID column as primary key, when insert you will get exception if duplicated
You can use auto increment ID, then you don't need to check ID exit or not. database will handle that
If you can't do above, run select statement or stored procedure to check whether id exist or not.
If this is for SQL Server and you're using a stored procedure - just try something like this:
CREATE PROCEDURE AddOfficeEquipmentProfile
(
#OE_ID varchar(11),
..... all your other parameters here.....
)
AS
IF NOT EXISTS (SELECT * FROM dbo.tblOfficeEquipmentProfile WHERE OE_ID = #OE_ID)
INSERT INTO dbo.tblOfficeEquipmentProfile(.... list of columns.....)
VALUES (......list of values................)
Assuming that OE_ID is your primary key and will be unique. Just check if that #OE_ID doesn't exist yet, and if it doesn't - insert the data. If it exists - don't do anything.
Building on the answer from #marc_s. In order to show a message to the user in case there already is a row in the database with the same id, you can check the number of affected rows from the query execution result.
This assumes that the stored procedure only inserts the row if the id is not present and does not emit any errors/exceptions.
Using ADO.NET (with an existing command executing the stored procedure):
Dim affectedRows as Integer = command.ExecuteNonQuery()
If affectedRows = 0 Then
'Handle the error here
MessageBox.Show("There is already a Profile with the supplied id")
Else
'Insert was made
End If
Check the following article to create a SP finding duplicate rows in any table:
http://www.codeproject.com/Articles/157977/Remove-Duplicate-Rows-from-a-Table-in-SQL-Server

Resources