فهرست منبع

AMBARI-6173. Ambari-DDL-MySQL-CREATE.sql executes with error during setup Ambari for MySQL DB. (mpapirkovskyy)

Myroslav Papirkovskyy 11 سال پیش
والد
کامیت
f414d1c416

+ 6 - 7
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewInstanceDAO.java

@@ -24,7 +24,6 @@ import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ViewInstanceDataEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
-import org.apache.ambari.server.orm.entities.ViewInstanceEntityPK;
 
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
@@ -40,6 +39,8 @@ public class ViewInstanceDAO {
    */
   @Inject
   Provider<EntityManager> entityManagerProvider;
+  @Inject
+  DaoUtils daoUtils;
 
   /**
    * Find a view with the given names.
@@ -50,12 +51,10 @@ public class ViewInstanceDAO {
    * @return  a matching view instance or null
    */
   public ViewInstanceEntity findByName(String viewName, String instanceName) {
-    EntityManager entityManager = entityManagerProvider.get();
-    ViewInstanceEntityPK pk = new ViewInstanceEntityPK();
-    pk.setViewName(viewName);
-    pk.setName(instanceName);
-
-    return entityManager.find(ViewInstanceEntity.class, pk);
+    TypedQuery<ViewInstanceEntity> query = entityManagerProvider.get().createQuery(
+      "SELECT instance FROM ViewInstanceEntity instance WHERE instance.viewName = ?1 AND instance.name = ?2",
+      ViewInstanceEntity.class);
+    return daoUtils.selectSingle(query, viewName, instanceName);
   }
 
   /**

+ 15 - 3
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceDataEntity.java

@@ -36,10 +36,12 @@ import javax.persistence.Table;
 public class ViewInstanceDataEntity {
 
   @Id
+  @Column(name = "view_instance_id", nullable = false, insertable = false, updatable = false)
+  private Long viewInstanceId;
+
   @Column(name = "view_name", nullable = false, insertable = false, updatable = false)
   private String viewName;
 
-  @Id
   @Column(name = "view_instance_name", nullable = false, insertable = false, updatable = false)
   private String viewInstanceName;
 
@@ -66,11 +68,21 @@ public class ViewInstanceDataEntity {
 
   @ManyToOne
   @JoinColumns({
-      @JoinColumn(name = "view_name", referencedColumnName = "view_name", nullable = false),
-      @JoinColumn(name = "view_instance_name", referencedColumnName = "name", nullable = false)
+    @JoinColumn(name = "view_instance_id", referencedColumnName = "view_instance_id", nullable = false),
+    @JoinColumn(name = "view_name", referencedColumnName = "view_name", nullable = false),
+    @JoinColumn(name = "view_instance_name", referencedColumnName = "name", nullable = false)
   })
   private ViewInstanceEntity viewInstance;
 
+
+  public Long getViewInstanceId() {
+    return viewInstanceId;
+  }
+
+  public void setViewInstanceId(Long viewInstanceId) {
+    this.viewInstanceId = viewInstanceId;
+  }
+
   /**
    * Get the view name.
    *

+ 12 - 44
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceDataEntityPK.java

@@ -27,12 +27,8 @@ import javax.persistence.Id;
 public class ViewInstanceDataEntityPK {
 
   @Id
-  @Column(name = "view_name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String viewName;
-
-  @Id
-  @Column(name = "view_instance_name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String viewInstanceName;
+  @Column(name = "view_instance_id", nullable = false, insertable = false, updatable = false)
+  private Long viewInstanceId;
 
   @Id
   @Column(name = "name", nullable = false, insertable = true, updatable = false, length = 100)
@@ -42,40 +38,12 @@ public class ViewInstanceDataEntityPK {
   @Column(name = "user_name", nullable = false, insertable = true, updatable = false, length = 100)
   private String user;
 
-  /**
-   * Get the name of the associated view.
-   *
-   * @return view name
-   */
-  public String getViewName() {
-    return viewName;
+  public Long getViewInstanceId() {
+    return viewInstanceId;
   }
 
-  /**
-   * Set the name of the associated view.
-   *
-   * @param viewName  view name
-   */
-  public void setViewName(String viewName) {
-    this.viewName = viewName;
-  }
-
-  /**
-   * Get the view instance name.
-   *
-   * @return the view instance name
-   */
-  public String getViewInstanceName() {
-    return viewInstanceName;
-  }
-
-  /**
-   * Set the view instance name.
-   *
-   * @param viewInstanceName  the view instance name
-   */
-  public void setViewInstanceName(String viewInstanceName) {
-    this.viewInstanceName = viewInstanceName;
+  public void setViewInstanceId(Long viewInstanceId) {
+    this.viewInstanceId = viewInstanceId;
   }
 
   /**
@@ -121,15 +89,15 @@ public class ViewInstanceDataEntityPK {
 
     ViewInstanceDataEntityPK that = (ViewInstanceDataEntityPK) o;
 
-    return this.viewName.equals(that.viewName) &&
-        this.viewInstanceName.equals(that.viewInstanceName) &&
-        this.name.equals(that.name) &&
-        this.user.equals(that.user);
+    return name.equals(that.name) && user.equals(that.user) && viewInstanceId.equals(that.viewInstanceId);
+
   }
 
   @Override
   public int hashCode() {
-    return 31 * viewName.hashCode() + viewInstanceName.hashCode() +
-        name.hashCode() + user.hashCode();
+    int result = viewInstanceId.hashCode();
+    result = 31 * result + name.hashCode();
+    result = 31 * result + user.hashCode();
+    return result;
   }
 }

+ 70 - 61
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java

@@ -32,13 +32,17 @@ import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -48,10 +52,19 @@ import java.util.Set;
 /**
  * Represents an instance of a View.
  */
-@javax.persistence.IdClass(ViewInstanceEntityPK.class)
-@Table(name = "viewinstance")
+@Table(name = "viewinstance", uniqueConstraints =
+  @UniqueConstraint(
+    name = "UQ_viewinstance_name", columnNames = {"view_name", "name"}
+  )
+)
 @NamedQuery(name = "allViewInstances",
-    query = "SELECT viewInstance FROM ViewInstanceEntity viewInstance")
+  query = "SELECT viewInstance FROM ViewInstanceEntity viewInstance")
+@TableGenerator(name = "view_instance_id_generator",
+  table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value"
+  , pkColumnValue = "view_instance_id_seq"
+  , initialValue = 1
+  , allocationSize = 1
+)
 @Entity
 public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
@@ -60,13 +73,16 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   public static final String VIEWS_CONTEXT_PATH_PREFIX = "/views/";
 
   @Id
+  @Column(name = "view_instance_id")
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "view_instance_id_generator")
+  private Long viewInstanceId;
+
   @Column(name = "view_name", nullable = false, insertable = false, updatable = false)
   private String viewName;
 
   /**
    * The instance name.
    */
-  @Id
   @Column(name = "name", nullable = false, insertable = true, updatable = false)
   private String name;
 
@@ -167,16 +183,16 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Construct a view instance definition.
    *
-   * @param view  the parent view definition
-   * @param instanceConfig  the associated configuration
+   * @param view           the parent view definition
+   * @param instanceConfig the associated configuration
    */
   public ViewInstanceEntity(ViewEntity view, InstanceConfig instanceConfig) {
-    this.name           = instanceConfig.getName();
+    this.name = instanceConfig.getName();
     this.instanceConfig = instanceConfig;
-    this.view           = view;
-    this.viewName       = view.getName();
-    this.description    = instanceConfig.getDescription();
-    this.visible        = instanceConfig.isVisible() ? 'Y' : 'N';
+    this.view = view;
+    this.viewName = view.getName();
+    this.description = instanceConfig.getDescription();
+    this.visible = instanceConfig.isVisible() ? 'Y' : 'N';
 
     String label = instanceConfig.getLabel();
     this.label = (label == null || label.length() == 0) ? view.getLabel() : label;
@@ -191,17 +207,17 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Construct a view instance definition.
    *
-   * @param view  the parent view definition
-   * @param name  the instance name
+   * @param view the parent view definition
+   * @param name the instance name
    */
   public ViewInstanceEntity(ViewEntity view, String name) {
-    this.name           = name;
+    this.name = name;
     this.instanceConfig = null;
-    this.view           = view;
-    this.viewName       = view.getName();
-    this.description    = null;
-    this.visible        = 'Y';
-    this.label          = view.getLabel();
+    this.view = view;
+    this.viewName = view.getName();
+    this.description = null;
+    this.visible = 'Y';
+    this.label = view.getLabel();
   }
 
 
@@ -267,7 +283,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the view name.
    *
-   * @param viewName  the view name
+   * @param viewName the view name
    */
   public void setViewName(String viewName) {
     this.viewName = viewName;
@@ -285,7 +301,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the name of this instance.
    *
-   * @param name  the instance name
+   * @param name the instance name
    */
   public void setName(String name) {
     this.name = name;
@@ -294,7 +310,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the label.
    *
-   * @param label  the label
+   * @param label the label
    */
   public void setLabel(String label) {
     this.label = label;
@@ -303,7 +319,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the description.
    *
-   * @param description  the description
+   * @param description the description
    */
   public void setDescription(String description) {
     this.description = description;
@@ -312,7 +328,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the visible flag.
    *
-   * @param visible  visible flag
+   * @param visible visible flag
    */
   public void setVisible(boolean visible) {
     this.visible = (visible ? 'Y' : 'N');
@@ -330,7 +346,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the icon path.
    *
-   * @param icon  the icon path
+   * @param icon the icon path
    */
   public void setIcon(String icon) {
     this.icon = icon;
@@ -348,7 +364,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the big icon path.
    *
-   * @param icon64  the big icon path
+   * @param icon64 the big icon path
    */
   public void setIcon64(String icon64) {
     this.icon64 = icon64;
@@ -366,8 +382,8 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Add a property value to this instance.
    *
-   * @param key    the property key
-   * @param value  the property value
+   * @param key   the property key
+   * @param value the property value
    */
   public void putProperty(String key, String value) {
     removeProperty(key);
@@ -383,7 +399,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Remove the property identified by the given key from this instance.
    *
-   * @param key  the key
+   * @param key the key
    */
   public void removeProperty(String key) {
     ViewInstancePropertyEntity entity = getProperty(key);
@@ -395,8 +411,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Get the instance property entity for the given key.
    *
-   * @param key  the key
-   *
+   * @param key the key
    * @return the instance property entity identified by the given key
    */
   public ViewInstancePropertyEntity getProperty(String key) {
@@ -411,7 +426,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the collection of instance property entities.
    *
-   * @param properties  the collection of instance property entities
+   * @param properties the collection of instance property entities
    */
   public void setProperties(Collection<ViewInstancePropertyEntity> properties) {
     this.properties = properties;
@@ -429,7 +444,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the collection of instance data entities.
    *
-   * @param data  the collection of instance data entities
+   * @param data the collection of instance data entities
    */
   public void setData(Collection<ViewInstanceDataEntity> data) {
     this.data = data;
@@ -447,7 +462,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the view entities.
    *
-   * @param entities  the view entities
+   * @param entities the view entities
    */
   public void setEntities(Collection<ViewEntityEntity> entities) {
     this.entities = entities;
@@ -456,8 +471,8 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Associate the given instance data value with the given key.
    *
-   * @param key    the key
-   * @param value  the value
+   * @param key   the key
+   * @param value the value
    */
   public void putInstanceData(String key, String value) {
     removeInstanceData(key);
@@ -474,7 +489,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Remove the instance data entity associated with the given key.
    *
-   * @param key  the key
+   * @param key the key
    */
   public void removeInstanceData(String key) {
     ViewInstanceDataEntity entity = getInstanceData(key);
@@ -486,8 +501,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Get the instance data entity for the given key.
    *
-   * @param key  the key
-   *
+   * @param key the key
    * @return the instance data entity associated with the given key
    */
   public ViewInstanceDataEntity getInstanceData(String key) {
@@ -495,7 +509,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
 
     for (ViewInstanceDataEntity viewInstanceDataEntity : data) {
       if (viewInstanceDataEntity.getName().equals(key) &&
-          viewInstanceDataEntity.getUser().equals(user)) {
+        viewInstanceDataEntity.getUser().equals(user)) {
         return viewInstanceDataEntity;
       }
     }
@@ -514,7 +528,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Set the parent view entity.
    *
-   * @param view  the parent view entity
+   * @param view the parent view entity
    */
   public void setViewEntity(ViewEntity view) {
     this.view = view;
@@ -532,8 +546,8 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Add a resource provider for the given resource type.
    *
-   * @param type      the resource type
-   * @param provider  the resource provider
+   * @param type     the resource type
+   * @param provider the resource provider
    */
   public void addResourceProvider(Resource.Type type, ResourceProvider provider) {
     resourceProviders.put(type, provider);
@@ -542,8 +556,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Get the resource provider for the given resource type.
    *
-   * @param type  the resource type
-   *
+   * @param type the resource type
    * @return the resource provider
    */
   public ResourceProvider getResourceProvider(Resource.Type type) {
@@ -553,8 +566,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Get the resource provider for the given resource type name (scoped to this view).
    *
-   * @param type  the resource type name
-   *
+   * @param type the resource type name
    * @return the resource provider
    */
   public ResourceProvider getResourceProvider(String type) {
@@ -565,8 +577,8 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Add a service for the given plural resource name.
    *
-   * @param pluralName  the plural resource name
-   * @param service     the service
+   * @param pluralName the plural resource name
+   * @param service    the service
    */
   public void addService(String pluralName, Object service) {
     services.put(pluralName, service);
@@ -575,8 +587,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Get the service associated with the given plural resource name.
    *
-   * @param pluralName  the plural resource name
-   *
+   * @param pluralName the plural resource name
    * @return the service associated with the given name
    */
   public Object getService(String pluralName) {
@@ -595,9 +606,8 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Get the context path for a view instance with the given names.
    *
-   * @param viewName          the view name
-   * @param viewInstanceName  the instance name
-   *
+   * @param viewName         the view name
+   * @param viewInstanceName the instance name
    * @return the context path
    */
   public static String getContextPath(String viewName, String version, String viewInstanceName) {
@@ -616,8 +626,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   /**
    * Validate the state of the instance.
    *
-   * @param viewEntity  the view entity to which this instance will be bound
-   *
+   * @param viewEntity the view entity to which this instance will be bound
    * @throws IllegalStateException if the instance is not in a valid state
    */
   public void validate(ViewEntity viewEntity) throws IllegalStateException {
@@ -636,7 +645,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
 
     if (!requiredParamterNames.isEmpty()) {
       throw new IllegalStateException("No property values exist for the required parameters " +
-          requiredParamterNames);
+        requiredParamterNames);
     }
   }
 
@@ -648,13 +657,13 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     String currentUserName = getUsername();
 
     return currentUserName == null || currentUserName.length() == 0 ?
-        " " : currentUserName;
+      " " : currentUserName;
   }
 
   /**
    * Set the user name provider helper.
    *
-   * @param userNameProvider  the helper
+   * @param userNameProvider the helper
    */
   protected void setUserNameProvider(UserNameProvider userNameProvider) {
     this.userNameProvider = userNameProvider;
@@ -674,9 +683,9 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
 
       String username;
       if (principal instanceof UserDetails) {
-        username = ((UserDetails)principal).getUsername();
+        username = ((UserDetails) principal).getUsername();
       } else {
-        username = principal == null ? "" :principal.toString();
+        username = principal == null ? "" : principal.toString();
       }
       return username;
     }

+ 0 - 99
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityPK.java

@@ -1,99 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.orm.entities;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-
-/**
- * Composite primary key for ViewInstanceEntity.
- */
-public class ViewInstanceEntityPK {
-  /**
-   * The view name.
-   */
-  @Id
-  @Column(name = "view_name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String viewName;
-
-  /**
-   * The instance name.
-   */
-  @Id
-  @Column(name = "name", nullable = false, insertable = true, updatable = false, length = 100)
-  private String name;
-
-
-  // ----- ViewInstanceEntityPK ----------------------------------------------
-
-  /**
-   * Get the name of the associated view.
-   *
-   * @return view name
-   */
-  public String getViewName() {
-    return viewName;
-  }
-
-  /**
-   * Set the name of the associated view.
-   *
-   * @param viewName  view name
-   */
-  public void setViewName(String viewName) {
-    this.viewName = viewName;
-  }
-
-  /**
-   * Get the name of the instance.
-   *
-   * @return instance name
-   */
-  public String getName() {
-    return name;
-  }
-
-  /**
-   * Set the name of the instance.
-   *
-   * @param name  instance name
-   */
-  public void setName(String name) {
-    this.name = name;
-  }
-
-
-  // ----- Object overrides --------------------------------------------------
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-
-    ViewInstanceEntityPK that = (ViewInstanceEntityPK) o;
-
-    return this.viewName.equals(that.viewName) &&
-        this.name.equals(that.name);
-  }
-
-  @Override
-  public int hashCode() {
-    return 31 * viewName.hashCode() + name.hashCode();
-  }
-}

+ 89 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java

@@ -18,6 +18,7 @@
 
 package org.apache.ambari.server.upgrade;
 
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
@@ -85,6 +86,94 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog {
     dbAccessor.addColumn("viewinstancedata",
         new DBAccessor.DBColumnInfo("user_name", String.class, 255, " ", false));
 
+    dbAccessor.dropConstraint("viewinstancedata", "FK_viewinstdata_view_name");
+
+    //modify primary key of viewinstancedata
+    if (Configuration.ORACLE_DB_NAME.equals(getDbType()) ||
+        Configuration.MYSQL_DB_NAME.equals(getDbType())) {
+      dbAccessor.executeQuery("alter table viewinstance drop primary key", true);
+      dbAccessor.executeQuery("alter table viewinstancedata drop primary key", true);
+    }else if (Configuration.POSTGRES_DB_NAME.equals(getDbType())) {
+      dbAccessor.executeQuery("alter table viewinstance drop constraint viewinstance_pkey", true);
+      dbAccessor.executeQuery("alter table viewinstancedata drop constraint viewinstancedata_pkey", true);
+    }
+
+
+    dbAccessor.addColumn("viewinstance", new DBAccessor.DBColumnInfo("view_instance_id", Long.class, null, null, true));
+    dbAccessor.addColumn("viewinstancedata",
+      new DBAccessor.DBColumnInfo("view_instance_id", Long.class, null, null, true));
+
+    if (Configuration.ORACLE_DB_NAME.equals(getDbType())) {
+      //sequence looks to be simpler than rownum
+      if (dbAccessor.tableHasData("viewinstancedata")) {
+        dbAccessor.executeQuery("CREATE SEQUENCE TEMP_SEQ " +
+            "  START WITH 1 " +
+            "  MAXVALUE 999999999999999999999999999 " +
+            "  MINVALUE 1 " +
+            "  NOCYCLE " +
+            "  NOCACHE " +
+            "  NOORDER");
+        dbAccessor.executeQuery("UPDATE viewinstance SET view_instance_id = TEMP_SEQ.NEXTVAL");
+        dbAccessor.dropSequence("TEMP_SEQ");
+      }
+    }else if (Configuration.MYSQL_DB_NAME.equals(getDbType())) {
+      if (dbAccessor.tableHasData("viewinstance")) {
+        dbAccessor.executeQuery("UPDATE viewinstance " +
+            "SET view_instance_id = (SELECT @a := @a + 1 FROM (SELECT @a := 1) s)");
+      }
+    }else if (Configuration.POSTGRES_DB_NAME.equals(getDbType())) {
+      if (dbAccessor.tableHasData("viewinstance")) {
+        //window functions like row_number were added in 8.4, workaround for earlier versions (redhat/centos 5)
+        dbAccessor.executeQuery("CREATE sequence temp_seq START WITH 1");
+        dbAccessor.executeQuery("UPDATE viewinstance SET view_instance_id = nextval('temp_seq')");
+        dbAccessor.dropSequence("temp_seq");
+      }
+
+
+    }
+
+    dbAccessor.executeQuery("alter table viewinstance add primary key (view_instance_id)");
+    dbAccessor.executeQuery("ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name UNIQUE (view_name, name)", true);
+
+    if (Configuration.POSTGRES_DB_NAME.equals(getDbType())) {
+      dbAccessor.executeQuery("UPDATE viewinstancedata AS vid SET view_instance_id = vi.view_instance_id " +
+        "FROM viewinstance AS vi WHERE vi.name = vid.view_instance_name AND vi.view_name = vid.view_name");
+    } else if (Configuration.ORACLE_DB_NAME.equals(getDbType())) {
+      dbAccessor.executeQuery("UPDATE viewinstancedata AS vid SET view_instance_id = (" +
+        "SELECT view_instance_id FROM viewinstance AS vi WHERE vi.name = vid.view_instance_name AND vi.view_name = vid.view_name)");
+    }else if (Configuration.MYSQL_DB_NAME.equals(getDbType())) {
+      dbAccessor.executeQuery("UPDATE viewinstancedata AS vid JOIN viewinstance AS vi " +
+        "ON vi.name = vid.view_instance_name AND vi.view_name = vid.view_name " +
+        "SET vid.view_instance_id = vi.view_instance_id");
+    }
+
+    dbAccessor.executeQuery("alter table viewinstancedata add primary key (view_instance_id, name, user_name)");
+
+    dbAccessor.addFKConstraint("viewinstancedata", "FK_viewinstdata_view_name", new String[]{"view_instance_id", "view_name", "view_instance_name"},
+      "viewinstance", new String[]{"view_instance_id", "view_name", "name"}, false);
+
+
+    long count = 1;
+    ResultSet resultSet = null;
+    try {
+      resultSet = dbAccessor.executeSelect("SELECT count(*) FROM viewinstance");
+      if (resultSet.next()) {
+        count = resultSet.getLong(1) + 2;
+      }
+    } finally {
+      if (resultSet != null) {
+        resultSet.close();
+      }
+    }
+
+    String valueColumnName = "\"value\"";
+    if (Configuration.ORACLE_DB_NAME.equals(getDbType()) || Configuration.MYSQL_DB_NAME.equals(getDbType())) {
+      valueColumnName = "value";
+    }
+
+    dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, " + valueColumnName + ") " +
+        "VALUES('view_instance_id_seq', " + count + ")", true);
+
     dbAccessor.addColumn("viewinstance",
         new DBAccessor.DBColumnInfo("label", String.class, 255, null, true));
 

+ 4 - 3
ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql

@@ -63,8 +63,8 @@ CREATE TABLE hostgroup_component (blueprint_name VARCHAR(255) NOT NULL, hostgrou
 CREATE TABLE blueprint_configuration (blueprint_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data VARCHAR(32000) NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
-CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstancedata (view_instance_id BIGINT, view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(VIEW_INSTANCE_ID, NAME, USER_NAME));
+CREATE TABLE viewinstance (view_instance_id BIGINT, view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_instance_id));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
@@ -110,8 +110,9 @@ ALTER TABLE viewparameter ADD CONSTRAINT FK_viewparam_view_name FOREIGN KEY (vie
 ALTER TABLE viewresource ADD CONSTRAINT FK_viewres_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
 ALTER TABLE viewinstance ADD CONSTRAINT FK_viewinst_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
 ALTER TABLE viewinstanceproperty ADD CONSTRAINT FK_viewinstprop_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
-ALTER TABLE viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_instance_id, view_name, view_instance_name) REFERENCES viewinstance(view_instance_id, view_name, name);
 ALTER TABLE viewentity ADD CONSTRAINT FK_viewentity_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name UNIQUE (view_name, name);
 
 
 INSERT INTO ambari_sequences(sequence_name, value) values ('cluster_id_seq', 1);

+ 4 - 3
ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql

@@ -53,8 +53,8 @@ CREATE TABLE hostgroup_component (blueprint_name VARCHAR2(255) NOT NULL, hostgro
 CREATE TABLE blueprint_configuration (blueprint_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL , PRIMARY KEY(blueprint_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
-CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstancedata (view_instance_id NUMBER(19), view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_instance_id, name, user_name));
+CREATE TABLE viewinstance (view_instance_id NUMBER(19), view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), "resource" VARCHAR(255), PRIMARY KEY(view_name, name));
@@ -100,8 +100,9 @@ ALTER TABLE viewparameter ADD CONSTRAINT FK_viewparam_view_name FOREIGN KEY (vie
 ALTER TABLE viewresource ADD CONSTRAINT FK_viewres_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
 ALTER TABLE viewinstance ADD CONSTRAINT FK_viewinst_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
 ALTER TABLE viewinstanceproperty ADD CONSTRAINT FK_viewinstprop_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
-ALTER TABLE viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_instance_id, view_name, view_instance_name) REFERENCES viewinstance(view_instance_id, view_name, name);
 ALTER TABLE viewentity ADD CONSTRAINT FK_viewentity_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name UNIQUE (view_name, name);
 
 INSERT INTO ambari_sequences(sequence_name, value) values ('host_role_command_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('user_id_seq', 1);

+ 4 - 3
ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql

@@ -86,8 +86,8 @@ CREATE TABLE blueprint_configuration (blueprint_name varchar(255) NOT NULL, type
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
-CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstancedata (view_instance_id BIGINT, view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_instance_id, name, user_name));
+CREATE TABLE viewinstance (view_instance_id BIGINT, view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
@@ -132,8 +132,9 @@ ALTER TABLE viewparameter ADD CONSTRAINT FK_viewparam_view_name FOREIGN KEY (vie
 ALTER TABLE viewresource ADD CONSTRAINT FK_viewres_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
 ALTER TABLE viewinstance ADD CONSTRAINT FK_viewinst_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
 ALTER TABLE viewinstanceproperty ADD CONSTRAINT FK_viewinstprop_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
-ALTER TABLE viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_instance_id, view_name, view_instance_name) REFERENCES viewinstance(view_instance_id, view_name, name);
 ALTER TABLE viewentity ADD CONSTRAINT FK_viewentity_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name UNIQUE (view_name, name);
 
 
 ---------inserting some data-----------

+ 8 - 7
ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql

@@ -133,7 +133,7 @@ GRANT ALL PRIVILEGES ON TABLE ambari.blueprint_configuration TO :username;
 GRANT ALL PRIVILEGES ON TABLE ambari.hostgroup_configuration TO :username;
 
 CREATE TABLE ambari.viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), icon VARCHAR(255), icon64 VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
-CREATE TABLE ambari.viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
+CREATE TABLE ambari.viewinstancedata (view_instance_data_id BIGINT, view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_instance_data_id));
 CREATE TABLE ambari.viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), description VARCHAR(255), visible CHAR(1), icon VARCHAR(255), icon64 VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE ambari.viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
@@ -183,12 +183,13 @@ ALTER TABLE ambari.blueprint_configuration ADD CONSTRAINT FK_cfg_blueprint_name
 ALTER TABLE ambari.hostgroup_configuration ADD CONSTRAINT FK_hg_cfg_bp_hg_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES ambari.hostgroup (blueprint_name, name);
 ALTER TABLE ambari.requestresourcefilter ADD CONSTRAINT FK_reqresfilter_req_id FOREIGN KEY (request_id) REFERENCES ambari.request (request_id);
 ALTER TABLE ambari.requestoperationlevel ADD CONSTRAINT FK_req_op_level_req_id FOREIGN KEY (request_id) REFERENCES ambari.request (request_id);
-ALTER TABLE ambari.viewparameter ADD CONSTRAINT FK_viewparam_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
-ALTER TABLE ambari.viewresource ADD CONSTRAINT FK_viewres_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
-ALTER TABLE ambari.viewinstance ADD CONSTRAINT FK_viewinst_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name);
-ALTER TABLE ambari.viewinstanceproperty ADD CONSTRAINT FK_viewinstprop_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
-ALTER TABLE ambari.viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
-ALTER TABLE ambari.viewentity ADD CONSTRAINT FK_viewentity_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name);
+ALTER TABLE ambari.viewparameter ADD CONSTRAINT FK_viewparam_view_name FOREIGN KEY (view_name) REFERENCES ambari.viewmain(view_name);
+ALTER TABLE ambari.viewresource ADD CONSTRAINT FK_viewres_view_name FOREIGN KEY (view_name) REFERENCES ambari.viewmain(view_name);
+ALTER TABLE ambari.viewinstance ADD CONSTRAINT FK_viewinst_view_name FOREIGN KEY (view_name) REFERENCES ambari.viewmain(view_name);
+ALTER TABLE ambari.viewinstanceproperty ADD CONSTRAINT FK_viewinstprop_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES ambari.viewinstance(view_name, name);
+ALTER TABLE ambari.viewinstancedata ADD CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_instance_id, view_name, view_instance_name) REFERENCES ambari.viewinstance(view_instance_id, view_name, name);
+ALTER TABLE ambari.viewentity ADD CONSTRAINT FK_viewentity_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES ambari.viewinstance(view_name, name);
+ALTER TABLE ambari.viewinstance ADD CONSTRAINT UQ_viewinstance_name UNIQUE (view_name, name);
 
 
 ---------inserting some data-----------