title: Dataflow: Accessing a value provider after the pipeline is complete
body: <p>I'm attempting to do a lagging update after my pipeline completes where the tables are passed in at runtime due to date versioning. Being this code is executed as a template, that requires the use of nestedValueProviders.</p>
  
  <pre><code>public interface DataQueryRunnerOptions extends DataflowPipelineOptions {
  
  @Description("Table to read/write payload data.")
      @Default.String("test.payloadData")
      ValueProvider&lt;String&gt; getPayloadTable();
  
  @Description("Table to read eligibility data from, and update with payloadData")
      @Default.String("test.dqr_test_eligibilities")
      ValueProvider&lt;String&gt; getEligibilityInputTable();
  
  }
  </code></pre>
  
  <p>Usage in pipeline:</p>
  
  <pre><code>campaignIdToDataQueryMap.apply("RunDataQueries", ParDo.of(new RunDataQueries()))
        .apply("WritePayloadDataToTable", BigQueryIO.writeTableRows()
          .withSchema(getPayloadDataSchema())
          .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
          .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_TRUNCATE)
          .to(options.getPayloadTable()));
  </code></pre>
  
  <p>Then I invoke code after the pipeline:</p>
  
  <pre><code>pipeline.run().waitUntilFinish();
  
  runFinalUpdate(options);
  </code></pre>
  
  <p>For the runFinalUpdate method:</p>
  
  <pre><code>private static void runFinalUpdate(DataQueryRunner2Options options) {
  
      ValueProvider.NestedValueProvider eligTable = ValueProvider.NestedValueProvider.of(
        options.getEligibilityInputTable(),
        (SerializableFunction&lt;String, String&gt;) eligibilityInputTable -&gt; options.getEligibilityInputTable().get()
      );
  
      ValueProvider.NestedValueProvider payloadTable = ValueProvider.NestedValueProvider.of(
        options.getPayloadTable(),
        (SerializableFunction&lt;String, String&gt;) payload -&gt; options.getPayloadTable().get()
      );
  
      String finalUpdate = "UPDATE " + eligTable.get() + " elig SET elig.dataQueryPayload = (SELECT pd.dataQueryPayload FROM `"
        + payloadTable.get() + "` pd WHERE pd.numericId = elig.numericId and pd.campaignId = elig.campaignId)"
        + " WHERE elig.dataQueryPayload IS NULL";
  
      try {
        Utilities.runQuery(finalUpdate);
      } catch (InterruptedException e) {
        LOG.error("Final update failure: " + e.getMessage());
        e.printStackTrace();
      }
    }
  </code></pre>
  
  <p>This gives the error:</p>
  
  <pre><code>java.lang.IllegalStateException: Value only available at runtime, but accessed from a non-runtime context: RuntimeValueProvider{propertyName=eligibilityInputTable, default=test.dqr_test_eligibilities}
  </code></pre>
  
  <p>How can I access this value outside of my pipeline run? Is there a better way to do "once only" work after a pipeline is complete?</p>