diff --git a/src/docs/user/connectors.txt b/src/docs/user/connectors.txt index bba946a1..9aa2f44e 100644 --- a/src/docs/user/connectors.txt +++ b/src/docs/user/connectors.txt @@ -125,6 +125,8 @@ List of all extra arguments supported by Microsoft SQL Connector is shown below: `----------------------------------------`--------------------------------------- Argument Description --------------------------------------------------------------------------------- ++\--identity-insert Set IDENTITY_INSERT to ON before \ + export insert. +\--non-resilient+ Don't attempt to recover failed \ export operations. +\--schema + Scheme name that sqoop should use. \ @@ -133,6 +135,15 @@ Argument Description data movement. --------------------------------------------------------------------------------- +Allow identity inserts +^^^^^^^^^^^^^^^^^^^^^^ + +You can allow inserts on columns that have identity. For example: + +---- +$ sqoop export ... --export-dir custom_dir --table custom_table -- --identity-insert +---- + Non-resilient operations ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/java/org/apache/sqoop/manager/SQLServerManager.java b/src/java/org/apache/sqoop/manager/SQLServerManager.java index 534c0cc4..625f7cd1 100644 --- a/src/java/org/apache/sqoop/manager/SQLServerManager.java +++ b/src/java/org/apache/sqoop/manager/SQLServerManager.java @@ -60,6 +60,11 @@ public class SQLServerManager // Option set in extra-arguments to disable resiliency and use default mode public static final String NON_RESILIENT_OPTION = "non-resilient"; + // Option to allow inserts on identity columns + public static final String IDENTITY_INSERT = "identity-insert"; + public static final String IDENTITY_INSERT_PROP = + "org.apache.sqoop.manager.sqlserver.table.identity"; + // driver class to ensure is loaded when making db connection. private static final String DRIVER_CLASS = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; @@ -77,6 +82,11 @@ public class SQLServerManager */ private String tableHints; + /** + * Whether to allow identity inserts. + */ + private boolean identityInserts; + public SQLServerManager(final SqoopOptions opts) { super(DRIVER_CLASS, opts); @@ -159,6 +169,10 @@ public void exportTable(com.cloudera.sqoop.manager.ExportJobContext context) if (tableHints != null) { configuration.set(TABLE_HINTS_PROP, tableHints); } + + // Propagate whether to allow identity inserts to job + configuration.setBoolean(IDENTITY_INSERT_PROP, identityInserts); + JdbcExportJob exportJob; if (isNonResilientOperation()) { exportJob = new JdbcExportJob(context, null, null, @@ -286,6 +300,8 @@ void parseExtraArgs(String[] args) throws ParseException { this.tableHints = hints; } + + identityInserts = cmdLine.hasOption(IDENTITY_INSERT); } /** @@ -307,6 +323,10 @@ private RelatedOptions getExtraOptions() { .withDescription("Optional table hints to use") .withLongOpt(TABLE_HINTS).create()); + extraOptions.addOption(OptionBuilder + .withDescription("Allow identity inserts") + .withLongOpt(IDENTITY_INSERT).create()); + return extraOptions; } diff --git a/src/java/org/apache/sqoop/mapreduce/SQLServerExportDBExecThread.java b/src/java/org/apache/sqoop/mapreduce/SQLServerExportDBExecThread.java index 1810ba86..7d58f1be 100644 --- a/src/java/org/apache/sqoop/mapreduce/SQLServerExportDBExecThread.java +++ b/src/java/org/apache/sqoop/mapreduce/SQLServerExportDBExecThread.java @@ -123,6 +123,11 @@ protected void executeStatement(PreparedStatement stmt, protected String getInsertStatement(int numRows) { StringBuilder sb = new StringBuilder(); + if (getConf().getBoolean(SQLServerManager.IDENTITY_INSERT_PROP, false)) { + LOG.info("Enabling identity inserts"); + sb.append("SET IDENTITY_INSERT ").append(tableName).append(" ON "); + } + sb.append("INSERT INTO " + tableName + " "); String tableHints = getConf().get(SQLServerManager.TABLE_HINTS_PROP); diff --git a/src/java/org/apache/sqoop/mapreduce/sqlserver/SqlServerExportBatchOutputFormat.java b/src/java/org/apache/sqoop/mapreduce/sqlserver/SqlServerExportBatchOutputFormat.java index cc69d77b..e583bbb6 100644 --- a/src/java/org/apache/sqoop/mapreduce/sqlserver/SqlServerExportBatchOutputFormat.java +++ b/src/java/org/apache/sqoop/mapreduce/sqlserver/SqlServerExportBatchOutputFormat.java @@ -62,6 +62,11 @@ public SqlServerExportBatchRecordWriter(TaskAttemptContext context) protected String getInsertStatement(int numRows) { StringBuilder sb = new StringBuilder(); + if (getConf().getBoolean(SQLServerManager.IDENTITY_INSERT_PROP, false)) { + LOG.info("Enabling identity inserts"); + sb.append("SET IDENTITY_INSERT ").append(tableName).append(" ON "); + } + sb.append("INSERT INTO " + tableName + " "); String tableHints = getConf().get(SQLServerManager.TABLE_HINTS_PROP);