[ 
https://issues.apache.org/jira/browse/HIVE-26324?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sourabh Badhya updated HIVE-26324:
----------------------------------
    Description: 
NOTIFICATION_SEQUENCE table must have only one row however there have been 
several reports of NOTIFICATION_SEQUENCE table having multiple rows. In order 
to prevent this situation from happening, its best to enforce "one-row-table" 
like constraints on NOTIFICATION_SEQUENCE table.

Queries tried on supported databases - 
NOTIFICATION_SEQUENCE already has NNI_ID as the primary key. This will help us 
in adding "one-row-table" like constraints.
MySQL - Assuming that the supported versions currently is 5.7+
{code:java}
DELIMITER //
CREATE TRIGGER `ONE_ROW_TRIGGER_ON_NOTIFICATION_SEQUENCE` BEFORE INSERT ON 
`NOTIFICATION_SEQUENCE`
FOR EACH ROW
BEGIN
IF NEW.`NNI_ID` != 1 THEN
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'CANNOT INSERT ROW';
END IF;
END;//
DELIMITER ; {code}
CHECK constraints are not effective in MySQL 5.7. It is introduced in 8.0.16. 
Hence need to switch to using triggers.
Link - [https://dev.mysql.com/doc/refman/5.7/en/create-table.html]

Postgres - 
Either change the definition of table like this - 
{code:java}
CREATE TABLE "NOTIFICATION_SEQUENCE"
(
    "NNI_ID" BIGINT NOT NULL CHECK ("NNI_ID" = 1),
    "NEXT_EVENT_ID" BIGINT NOT NULL,
    PRIMARY KEY ("NNI_ID")
); {code}
OR add explicit constraints like this -
{code:java}
ALTER TABLE "NOTIFICATION_SEQUENCE"
    ADD CONSTRAINT "ONE_ROW_CONSTRAINT" CHECK ("NNI_ID" = 1); {code}
Derby - 
{code:java}
ALTER TABLE "APP"."NOTIFICATION_SEQUENCE" ADD CONSTRAINT "ONE_ROW_CONSTRAINT" 
CHECK (NNI_ID = 1); {code}
Oracle - 
Either change the definition of table like this - 
{code:java}
CREATE TABLE NOTIFICATION_SEQUENCE
(
    NNI_ID NUMBER NOT NULL CHECK (NNI_ID = 1),
    NEXT_EVENT_ID NUMBER NOT NULL
); {code}
OR add explicit constraints like this -
{code:java}
ALTER TABLE NOTIFICATION_SEQUENCE ADD CONSTRAINT ONE_ROW_CONSTRAINT CHECK 
(NNI_ID = 1); {code}
Microsoft SQL Server - 
{code:java}
ALTER TABLE NOTIFICATION_SEQUENCE ADD CONSTRAINT ONE_ROW_CONSTRAINT CHECK 
(NNI_ID = 1); {code}

  was:
NOTIFICATION_SEQUENCE table must have only one row however there have been 
several reports of NOTIFICATION_SEQUENCE table having multiple rows. In order 
to prevent this situation from happening, its best to enforce "one-row-table" 
like constraints on NOTIFICATION_SEQUENCE table.

Queries tried on supported databases - 
NOTIFICATION_SEQUENCE already has NNI_ID as the primary key. This will help us 
in adding "one-row-table" like constraints.
MySQL - Assuming that the supported versions currently is 5.7+
{code:java}
DELIMITER //
CREATE TRIGGER `ONE_ROW_TRIGGER_ON_NOTIFICATION_SEQUENCE` BEFORE INSERT ON 
`NOTIFICATION_SEQUENCE`
FOR EACH ROW
BEGIN
IF NEW.`NNI_ID` != 1 THEN
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'CANNOT INSERT ROW';
END IF;
END;//
DELIMITER ; {code}
CHECK constraints are not effective in MySQL 5.7. It is introduced in 8.0.16. 
Hence need to switch to using triggers.
Link - [https://dev.mysql.com/doc/refman/5.7/en/create-table.html]

Postgres - 
Either change the definition of table like this - 
{code:java}
CREATE TABLE "NOTIFICATION_SEQUENCE"
(
    "NNI_ID" BIGINT NOT NULL CHECK ("NNI_ID" = 1),
    "NEXT_EVENT_ID" BIGINT NOT NULL,
    PRIMARY KEY ("NNI_ID")
); {code}
OR add explicit constraints like this -
{code:java}
ALTER TABLE "NOTIFICATION_SEQUENCE"
    ADD CONSTRAINT "ONE_ROW_CONSTRAINT" CHECK ("NNI_ID" = 1); {code}
Derby - 
{code:java}
ALTER TABLE "APP"."NOTIFICATION_SEQUENCE" ADD CONSTRAINT "ONE_ROW_CONSTRAINT" 
CHECK (NNI_ID = 1); {code}
Oracle - 
Either change the definition of table like this - 
{code:java}
CREATE TABLE NOTIFICATION_SEQUENCE
(
    NNI_ID NUMBER NOT NULL CHECK (NNI_ID = 1),
    NEXT_EVENT_ID NUMBER NOT NULL
); {code}
OR add explicit constraints like this -
{code:java}
ALTER TABLE NOTIFICATION_SEQUENCE ADD CONSTRAINT ONE_ROW_CONSTRAINT CHECK 
(NNI_ID = 1); {code}


> Add "one-row-table" constraints on NOTIFICATION_SEQUENCE table
> --------------------------------------------------------------
>
>                 Key: HIVE-26324
>                 URL: https://issues.apache.org/jira/browse/HIVE-26324
>             Project: Hive
>          Issue Type: Bug
>            Reporter: Sourabh Badhya
>            Assignee: Sourabh Badhya
>            Priority: Major
>
> NOTIFICATION_SEQUENCE table must have only one row however there have been 
> several reports of NOTIFICATION_SEQUENCE table having multiple rows. In order 
> to prevent this situation from happening, its best to enforce "one-row-table" 
> like constraints on NOTIFICATION_SEQUENCE table.
> Queries tried on supported databases - 
> NOTIFICATION_SEQUENCE already has NNI_ID as the primary key. This will help 
> us in adding "one-row-table" like constraints.
> MySQL - Assuming that the supported versions currently is 5.7+
> {code:java}
> DELIMITER //
> CREATE TRIGGER `ONE_ROW_TRIGGER_ON_NOTIFICATION_SEQUENCE` BEFORE INSERT ON 
> `NOTIFICATION_SEQUENCE`
> FOR EACH ROW
> BEGIN
> IF NEW.`NNI_ID` != 1 THEN
> SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'CANNOT INSERT ROW';
> END IF;
> END;//
> DELIMITER ; {code}
> CHECK constraints are not effective in MySQL 5.7. It is introduced in 8.0.16. 
> Hence need to switch to using triggers.
> Link - [https://dev.mysql.com/doc/refman/5.7/en/create-table.html]
> Postgres - 
> Either change the definition of table like this - 
> {code:java}
> CREATE TABLE "NOTIFICATION_SEQUENCE"
> (
>     "NNI_ID" BIGINT NOT NULL CHECK ("NNI_ID" = 1),
>     "NEXT_EVENT_ID" BIGINT NOT NULL,
>     PRIMARY KEY ("NNI_ID")
> ); {code}
> OR add explicit constraints like this -
> {code:java}
> ALTER TABLE "NOTIFICATION_SEQUENCE"
>     ADD CONSTRAINT "ONE_ROW_CONSTRAINT" CHECK ("NNI_ID" = 1); {code}
> Derby - 
> {code:java}
> ALTER TABLE "APP"."NOTIFICATION_SEQUENCE" ADD CONSTRAINT "ONE_ROW_CONSTRAINT" 
> CHECK (NNI_ID = 1); {code}
> Oracle - 
> Either change the definition of table like this - 
> {code:java}
> CREATE TABLE NOTIFICATION_SEQUENCE
> (
>     NNI_ID NUMBER NOT NULL CHECK (NNI_ID = 1),
>     NEXT_EVENT_ID NUMBER NOT NULL
> ); {code}
> OR add explicit constraints like this -
> {code:java}
> ALTER TABLE NOTIFICATION_SEQUENCE ADD CONSTRAINT ONE_ROW_CONSTRAINT CHECK 
> (NNI_ID = 1); {code}
> Microsoft SQL Server - 
> {code:java}
> ALTER TABLE NOTIFICATION_SEQUENCE ADD CONSTRAINT ONE_ROW_CONSTRAINT CHECK 
> (NNI_ID = 1); {code}



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to