100% found this document useful (5 votes)
79 views

Download Full SQL Server Data Automation Through Frameworks: Building Metadata-Driven Frameworks with T-SQL, SSIS, and Azure Data Factory Andy Leonard PDF All Chapters

Factory

Uploaded by

awreybradtyg
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
79 views

Download Full SQL Server Data Automation Through Frameworks: Building Metadata-Driven Frameworks with T-SQL, SSIS, and Azure Data Factory Andy Leonard PDF All Chapters

Factory

Uploaded by

awreybradtyg
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 55

Download the Full Version of textbook for Fast Typing at textbookfull.

com

SQL Server Data Automation Through Frameworks:


Building Metadata-Driven Frameworks with T-SQL,
SSIS, and Azure Data Factory Andy Leonard

https://textbookfull.com/product/sql-server-data-automation-
through-frameworks-building-metadata-driven-frameworks-with-
t-sql-ssis-and-azure-data-factory-andy-leonard/

OR CLICK BUTTON

DOWNLOAD NOW

Download More textbook Instantly Today - Get Yours Now at textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

SQL Server Execution Plans For SQL Server 2008 through to


2017 and Azure SQL Database 3rd Edition Grant Fritchey

https://textbookfull.com/product/sql-server-execution-plans-for-sql-
server-2008-through-to-2017-and-azure-sql-database-3rd-edition-grant-
fritchey/
textboxfull.com

Building Custom Tasks for SQL Server Integration Services:


The Power of .NET for ETL for SQL Server 2019 and Beyond
2nd Edition Andy Leonard
https://textbookfull.com/product/building-custom-tasks-for-sql-server-
integration-services-the-power-of-net-for-etl-for-sql-server-2019-and-
beyond-2nd-edition-andy-leonard/
textboxfull.com

Building Custom Tasks for SQL Server Integration Services


The Power of NET for ETL for SQL Server 2019 and Beyond
Second Edition Andy Leonard
https://textbookfull.com/product/building-custom-tasks-for-sql-server-
integration-services-the-power-of-net-for-etl-for-sql-server-2019-and-
beyond-second-edition-andy-leonard/
textboxfull.com

Biota Grow 2C gather 2C cook Loucas

https://textbookfull.com/product/biota-grow-2c-gather-2c-cook-loucas/

textboxfull.com
Quick Start Guide to Azure Data Factory Azure Data Lake
Server and Azure Data Warehouse 1st Edition Mark Beckner

https://textbookfull.com/product/quick-start-guide-to-azure-data-
factory-azure-data-lake-server-and-azure-data-warehouse-1st-edition-
mark-beckner/
textboxfull.com

Data Integration Life Cycle Management with SSIS: A Short


Introduction by Example 1st Edition Andy Leonard

https://textbookfull.com/product/data-integration-life-cycle-
management-with-ssis-a-short-introduction-by-example-1st-edition-andy-
leonard/
textboxfull.com

SQL Server Big Data Clusters : Data Virtualization, Data


Lake, and AI Platform Benjamin Weissman

https://textbookfull.com/product/sql-server-big-data-clusters-data-
virtualization-data-lake-and-ai-platform-benjamin-weissman/

textboxfull.com

Azure SQL Revealed: A Guide to the Cloud for SQL Server


Professionals Bob Ward

https://textbookfull.com/product/azure-sql-revealed-a-guide-to-the-
cloud-for-sql-server-professionals-bob-ward/

textboxfull.com

Azure SQL Revealed: A Guide to the Cloud for SQL Server


Professionals 1st Edition Bob Ward

https://textbookfull.com/product/azure-sql-revealed-a-guide-to-the-
cloud-for-sql-server-professionals-1st-edition-bob-ward/

textboxfull.com
SQL Server Data
Automation
Through
Frameworks
Building Metadata-Driven Frameworks with
T-SQL, SSIS, and Azure Data Factory

Andy Leonard
Kent Bradshaw
SQL Server Data
Automation Through
Frameworks
Building Metadata-Driven
Frameworks with T-SQL, SSIS,
and Azure Data Factory

Andy Leonard
Kent Bradshaw
SQL Server Data Automation Through Frameworks: Building Metadata-Driven
Frameworks with T-SQL, SSIS, and Azure Data Factory
Andy Leonard Kent Bradshaw
Farmville, VA, USA Providence Forge, VA, USA

ISBN-13 (pbk): 978-1-4842-6212-2 ISBN-13 (electronic): 978-1-4842-6213-9


https://doi.org/10.1007/978-1-4842-6213-9

Copyright © 2020 by Andy Leonard, Kent Bradshaw


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Jonathan Gennick
Development Editor: Laura Berendson
Coordinating Editor: Jill Balzano
Cover image designed by Freepik (www.freepik.com)
Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street,
6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer-
sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member
(owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a
Delaware corporation.
For information on translations, please e-mail [email protected]; for reprint,
paperback, or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book’s product page, located at www.apress.com/9781484262122. For more
detailed information, please visit http://www.apress.com/source-code.
Printed on acid-free paper
For Christy
—Andy

For Ann
—Kent
Table of Contents
About the Authors���������������������������������������������������������������������������������������������������� xi

About the Technical Reviewer������������������������������������������������������������������������������� xiii


Acknowledgments���������������������������������������������������������������������������������������������������xv

Introduction�����������������������������������������������������������������������������������������������������������xvii

Part I: Stored Procedure-Based Database Frameworks������������������������������������������� 1

Chapter 1: Stored Procedures 101��������������������������������������������������������������������������� 3


The Need for a Framework����������������������������������������������������������������������������������������������������������� 3
Demonstration of a Framework���������������������������������������������������������������������������������������������������� 4
An Example Schema���������������������������������������������������������������������������������������������������������������� 5
The Daily Process�������������������������������������������������������������������������������������������������������������������� 6
Executing the Daily Process�������������������������������������������������������������������������������������������������� 12
Including a Monthly Process������������������������������������������������������������������������������������������������� 12
Summary������������������������������������������������������������������������������������������������������������������������������������ 18

Chapter 2: Automation with Stored Procedures����������������������������������������������������� 19


A Daily Process Controller����������������������������������������������������������������������������������������������������������� 19
Monthly Process Controller��������������������������������������������������������������������������������������������������������� 23
Summary������������������������������������������������������������������������������������������������������������������������������������ 26

Chapter 3: Stored Procedure Orchestrators����������������������������������������������������������� 27


The Orchestrator������������������������������������������������������������������������������������������������������������������������� 27
A Quick Process Overview���������������������������������������������������������������������������������������������������������� 31
A Look at Troubleshooting Issues������������������������������������������������������������������������������������������������ 31
Summary������������������������������������������������������������������������������������������������������������������������������������ 32

v
Table of Contents

Chapter 4: A Stored Procedure–Based Metadata-Driven Framework�������������������� 33


Building the Metadata����������������������������������������������������������������������������������������������������������������� 33
Metadata-Ready Controllers������������������������������������������������������������������������������������������������������� 40
Metadata-Ready Orchestrator����������������������������������������������������������������������������������������������������� 47
Troubleshooting with Metadata�������������������������������������������������������������������������������������������������� 50
Summary������������������������������������������������������������������������������������������������������������������������������������ 56

Part II: SSIS Frameworks���������������������������������������������������������������������������������������� 57

Chapter 5: A Simple, Custom, File-­Based SSIS Framework������������������������������������ 59


An SSIS Framework, Defined and Designed������������������������������������������������������������������������������� 60
Functionality�������������������������������������������������������������������������������������������������������������������������� 60
Empathy�������������������������������������������������������������������������������������������������������������������������������� 60
Simplicity������������������������������������������������������������������������������������������������������������������������������� 60
Building a File-Based SSIS Framework�������������������������������������������������������������������������������������� 61
Obtain the Code��������������������������������������������������������������������������������������������������������������������� 61
Metadata-Driven Execution Management����������������������������������������������������������������������������� 62
The SSISConfig Database������������������������������������������������������������������������������������������������������ 62
Config Schema���������������������������������������������������������������������������������������������������������������������� 63
The Config.Applications Table������������������������������������������������������������������������������������������������ 65
The Config.Packages Table���������������������������������������������������������������������������������������������������� 67
A Sample SSIS Solution�������������������������������������������������������������������������������������������������������������� 75
Configure Visual Studio 2019 for SSIS Development������������������������������������������������������������� 76
Create the Sample SSIS Solution������������������������������������������������������������������������������������������ 78
SSIS Framework Metadata Management����������������������������������������������������������������������������������� 85
Add an SSIS Application�������������������������������������������������������������������������������������������������������� 85
Add SSIS Packages��������������������������������������������������������������������������������������������������������������� 88
Assign SSIS Application Packages���������������������������������������������������������������������������������������� 91
Conclusion���������������������������������������������������������������������������������������������������������������������������������� 96

vi
Table of Contents

Chapter 6: Framework Execution Engine��������������������������������������������������������������� 97


Create a Parent SSIS Package���������������������������������������������������������������������������������������������������� 97
Log Execution Values������������������������������������������������������������������������������������������������������������������ 98
Retrieve SSIS Application Packages from SSISConfig�������������������������������������������������������������� 104
Iterate Application Packages����������������������������������������������������������������������������������������������������� 120
Log Application Package Values����������������������������������������������������������������������������������������������� 130
Execute Application Packages�������������������������������������������������������������������������������������������������� 135
Log Execution Results��������������������������������������������������������������������������������������������������������������� 150
Conclusion�������������������������������������������������������������������������������������������������������������������������������� 158

Chapter 7: Framework Logging���������������������������������������������������������������������������� 159


Create a Log Schema���������������������������������������������������������������������������������������������������������������� 159
Add Application Instance Logging to Parent.dtsx���������������������������������������������������������������������� 164
Add Application Package Instance Logging to Parent.dtsx������������������������������������������������������� 176
Viewing Execution Report Data������������������������������������������������������������������������������������������������� 191
Configure Fault Tolerance in SSIS Framework Application Metadata��������������������������������������� 197
Conclusion�������������������������������������������������������������������������������������������������������������������������������� 206

Chapter 8: Azure-SSIS Integration Runtime��������������������������������������������������������� 207


Getting Started with Azure�������������������������������������������������������������������������������������������������������� 207
Provisioning an Azure Data Factory������������������������������������������������������������������������������������������ 208
Provisioning Azure Storage������������������������������������������������������������������������������������������������������� 217
Provisioning an Azure-SSIS Integration Runtime for SSIS Package Files��������������������������������� 223
Stopping the Azure-SSIS Integration Runtime�������������������������������������������������������������������������� 236
Conclusion�������������������������������������������������������������������������������������������������������������������������������� 240

Chapter 9: Deploy a Simple, Custom, File-Based Azure-SSIS Framework������������ 241


Provisioning the SSISConfig Database�������������������������������������������������������������������������������������� 241
Deploy the Simple, Custom, File-Based Azure-SSIS Framework���������������������������������������������� 249
Provision an Azure File Share��������������������������������������������������������������������������������������������������� 267
Upload SSIS Packages��������������������������������������������������������������������������������������������������������� 270
Update PackageLocation Values������������������������������������������������������������������������������������������ 272

vii
Table of Contents

Build the SSIS Framework ADF Execution Engine�������������������������������������������������������������������� 273


Retrieve a List of SSIS Packages����������������������������������������������������������������������������������������� 273
Execute the Retrieved SSIS Packages��������������������������������������������������������������������������������� 287
View Test Execution Logs���������������������������������������������������������������������������������������������������� 296
Conclusion�������������������������������������������������������������������������������������������������������������������������������� 299

Chapter 10: Framework Logging in ADF��������������������������������������������������������������� 301


Add the ApplicationName Parameter���������������������������������������������������������������������������������������� 301
A Quick Review of SSIS Framework Applications and Packages���������������������������������������� 302
Add Application Instance Logging��������������������������������������������������������������������������������������������� 303
Modifying the Log.ApplicationInstance Table���������������������������������������������������������������������� 303
Adding the Log.InsertApplicationInstance Stored Procedure���������������������������������������������� 304
Logging Application Instance���������������������������������������������������������������������������������������������� 306
Adding the Log.UpdateApplicationInstanceStatus Stored Procedure���������������������������������� 311
Updating Application Instance��������������������������������������������������������������������������������������������� 312
Let’s Test It!������������������������������������������������������������������������������������������������������������������������� 316
Updating Application Instance on Success�������������������������������������������������������������������������� 317
Adding the ApplicationPackageId Field������������������������������������������������������������������������������� 320
Adding the ApplicationInstanceId Pipeline Variable������������������������������������������������������������� 321
Add the Child Pipeline��������������������������������������������������������������������������������������������������������� 325
Let’s Test It!������������������������������������������������������������������������������������������������������������������������� 333
Add Application Package Instance Logging������������������������������������������������������������������������������ 334
Modifying the Log.ApplicationPackageInstance Table��������������������������������������������������������� 335
Adding the Log.InsertApplicationPackageInstance Stored Procedure��������������������������������� 336
Logging Application Package Instance�������������������������������������������������������������������������������� 338
Adding the Log.UpdateApplicationPackageInstanceStatus Stored Procedure�������������������� 344
Updating Application Package Instance������������������������������������������������������������������������������ 345
Let’s Test It!������������������������������������������������������������������������������������������������������������������������� 348
Updating Application Package Instance on Success����������������������������������������������������������� 350
Conclusion�������������������������������������������������������������������������������������������������������������������������������� 353

viii
Table of Contents

Chapter 11: Fault Tolerance in the ADF Framework��������������������������������������������� 355


A Brief Introduction to Fault Tolerance�������������������������������������������������������������������������������������� 355
Add ADF Managed Identity to Contributor Role������������������������������������������������������������������������� 356
Add Application Package Fault Tolerance��������������������������������������������������������������������������������� 359
About Fail Application on Package Failure�������������������������������������������������������������������������� 359
Implementing Application Package Fault Tolerance������������������������������������������������������������ 359
Checking the Logic�������������������������������������������������������������������������������������������������������������� 362
Implementing the Fault Tolerance Logic������������������������������������������������������������������������������ 363
Let’s Test It!������������������������������������������������������������������������������������������������������������������������� 378
Conclusion�������������������������������������������������������������������������������������������������������������������������������� 383

Index��������������������������������������������������������������������������������������������������������������������� 385

ix
About the Authors
Andy Leonard is Chief Data Engineer at Enterprise Data
& Analytics, creator and Data Philosopher at DILM (Data
Integration Lifecycle Management) Suite, an Azure Data
Factory and SQL Server Integration Services trainer and
consultant, and a BimlHero. He is a SQL Server database and
data warehouse developer, community mentor, engineer,
and farmer. Andy is coauthor of SQL Server Integration
Services Design Patterns, Data Integration Life Cycle
Management with SSIS, and The Biml Book.

Kent Bradshaw is the founder or Tudor Data Solutions,


LLC. With over 40 years of IT experience, he is a SQL
Server database/ETL developer and database architect
with a background in Medicaid claims, public schools,
government, retail, and insurance systems. In 2011,
Kent founded Tudor Data Solutions, LLC, to pursue new
development opportunities which led to his association with
Andy Leonard and Enterprise Data & Analytics. In 2017, Kent
received the MPP certification for Data Science.

xi
About the Technical Reviewer
André van Meulebrouck has a keen interest in functional
programming, especially Haskell and F#.
He also likes data technologies from markup languages
to databases and F# type providers.
He lives in Southern California with his wife “Tweety”,
and is active in athletics: hiking, mountain biking, and
gravity/balance sports like freestyle skating (in-line and ice),
skateboarding, surfing, and sandboarding.
To keep his mind sharp, he does compositional origami, plays classical guitar, and
enjoys music notation software.

xiii
Acknowledgments
This book would not have been possible without the help of Kent Bradshaw, my
coauthor, friend, and brother. This book represents Kent’s first foray into authoring, and
he delivered outstanding work.
Thanks André van Meulebrouck for proofreading, working through the samples, and
providing feedback on the manuscript.
I owe my coworkers at Enterprise Data & Analytics (EntDNA.com) a debt of gratitude
for their encouragement and for covering for me when I stayed up too late trying to
figure out how to make the code work. We have an awesome team, especially my
brothers from other mothers – Nick Harris, Shannon Lowder, and Reeves Smith.
Donald Farmer inspires me every time we interact. As Principal Program Manager at
Microsoft, Donald worked extensively with SSIS and helped shape the product. Donald
continues to shape data software by providing vendors unique strategic guidance at
TreeHive Strategy (treehivestrategy.com).
I am certain there are many excellent editors in this business. Jonathan Gennick is
the best with whom I have had the privilege to work. Without Jill Balzano’s input and
project management, I would have been lost!
Finally, I thank my family for their understanding. My children Stevie Ray, Emma, and
Riley who live at home at the time of this writing, and Manda and Penny who have children
of their own. And Christy, to whom I dedicate this book, my wife, my love. Thank you.
—Andy

Writing this book never really entered my mind until my great friend and EDNA
colleague, Andy Leonard, convinced me to do it. I truly appreciate his confidence in me,
and it was a very interesting experience. I’m really glad that I could work together with
him on this project.
Many thanks to Jonathan Gennick, Jill Balzano, and André van Meulebrouck for all of
their help and suggestions. They made things so much easier.
Most important of all, I want to thank my wife, Ann. Much of where I am today is due
to her love, support, and encouragement. I couldn’t begin to do it without her. Thank you.

—Kent

xv
Introduction
Frameworks have existed for as long as people have been building things. When
people began developing solutions using computers, frameworks soon followed. Like
woodworking jigs, frameworks exist to simplify work and speed up the process of
developing a solution, whether the problem is to complete a woodworking project or
deliver an enterprise data integration solution.

Who Is This Book For?


Anyone who is interested in data-related automation or executing multiple chunks
of code with a single command will find value in these pages. Three audiences will
particularly benefit from this book:

1. Database developers

2. Data engineers and data integration developers

3. Business Intelligence Markup Language (Biml) developers

Database developers will learn about driving database object execution from stored
procedures and will see one example of a database framework.
Data engineers and data integration developers will learn how to use SQL Server
Integration Services (SSIS) to implement a metadata-driven data integration framework.
Biml developers will see one example of using BimlExpress and metadata to
rapidly produce several SSIS packages in selected design patterns and an example of
interrogating flat files to generate flat file formats and flat file connection managers via
Biml.

How This Book Is Structured


In the following sections, we will explore the chapter layout of this book. There are two
parts that guide you through the process of building a database framework using stored
procedures and an SSIS framework. Each of those parts is composed of several chapters.

xvii
Introduction

Part I: Stored Procedure–Based Database Frameworks


In the first part of this book, we will focus on building a database framework using
stored procedures. These chapters are targeted primarily at those who develop database
solutions. We do not endeavor to create the most comprehensive primer for every aspect
of database development; we cover the basics well.

C
 hapter 1: Stored Procedures 101
Before we dive into database development, let’s cover some basics of stored procedures.

C
 hapter 2: Automation with Stored Procedures
Once you have a solid grasp on stored procedures, we will use what we’ve learned about
stored procedures to automate execution using the controller pattern, which executes
one or more stored procedures.

C
 hapter 3: Stored Procedure Orchestrators
In this chapter, we examine high-level execution management using the orchestrator
pattern, which executes one or more controller stored procedures.

C
 hapter 4: A Stored Procedure–Based Metadata-Driven
Framework
Metadata-driven frameworks are a recurring theme in this book. In this chapter, we
store information about stored procedures, controllers, and orchestrators to execute
framework applications.

Part II: SSIS Frameworks


If your enterprise is executing a few SSIS packages, there is no need for an SSIS
framework. However, if your enterprise is executing several hundred (or several
thousand) SSIS packages, you definitely need an SSIS framework.

xviii
Introduction

C
 hapter 5: A Simple, Custom, File-Based SSIS Framework
In this chapter, we define a data integration/engineering framework metadata database
that manages configuration and execution. We introduce a version of an SSIS framework
that manages these subject areas for SSIS executed on-premises.

C
 hapter 6: Framework Execution Engine
In this chapter, we add instrumentation in the form of Information and Error events.
Built-in SSIS logging will surface these messages, which are useful when troubleshooting
SSIS framework application issues.

C
 hapter 7: Framework Logging
In this chapter, we persist execution metadata to “Instance” tables. The
ApplicationInstance table stores one record for each instance of an SSIS framework
application execution. The ApplicationPackageInstance table stores one record for each
instance of an SSIS framework application package execution. Important execution
instance attributes – such as start and end times and execution status – are maintained
in the “Instance” tables.

C
 hapter 8: Azure-SSIS Integration Runtime
In this chapter, we introduce Azure Data Factory (ADF) and the Azure-SSIS integration
runtime by walking through the provisioning processes.

C
 hapter 9: Deploy a Simple, Custom, File-Based Azure-SSIS
Framework
In Chapters 5–7, we designed and constructed an SSIS framework aimed at on-premises
SSIS execution, configuration, and logging. In this chapter, we begin migrating the SSIS
framework designed in Chapters 5–7 by provisioning a new Azure SQL database and
then deploying the metadata database to our new Azure SQL database. We provision an
Azure File Share and migrate test SSIS packages to the Azure File Share. Finally, we begin
building the Azure Data Factory parent pipeline that serves as the execution engine for
the ADF version of the SSIS framework.

xix
Introduction

C
 hapter 10: Framework Logging in ADF
In this chapter, we add logging functionality to the parent ADF pipeline, much like the
functionality we added to the on-premises version of the SSIS framework in Chapter 7.

C
 hapter 11: Fault Tolerance in the ADF Framework
In this chapter, we complete ADF execution engine functionality by implementing fault
tolerance to programmatically stop (or not stop) pipeline execution based on SSISConfig
metadata configurations.

C
 onclusion
This book is for people who want to dive deeper into SQL Server and SSIS automation.
We will be discussing and demonstrating database and Integration Services frameworks
and covering such topics as SQL Server, SSIS, Azure, and Azure Data Factory.
As you can see, we have a long journey filled with learning and new insight ahead of
us. Let’s get started!

xx
PART I

Stored Procedure-Based
Database Frameworks
CHAPTER 1

Stored Procedures 101


One of the most common issues continually facing IT organizations is finding the proper
balance between the effort to develop and deploy processes into production against the
efficiency and effectiveness of production control operators. The effort to develop and
deploy and the effectiveness of production control seem to be diametrically opposed.
Making it easier to develop and deploy processes usually means more work and manual
intervention for production control. The real question that needs to be considered is
where is it better to “feel the pain”? Pushing the effort toward the development side of
the equation can slow down the throughput but minimizes the liability of issues at the
production process level. This and the next few chapters are going to concentrate on
processes that are executed using stored procedures. In this chapter, you’ll get a basic
introduction to stored procedures that is the foundation for the chapters that follow.
You’ll see how to create a child stored procedure, and we’ll provide you a template that
you can use to create similar procedures in your own work.

The Need for a Framework


When just in development mode, it is awfully easy (and impressive) to construct
large, monolithic procedures that do everything from beginning to end. They are the
proverbial “black box” where something goes in, many gyrations take place, and then the
desired result occurs. Those are great until a problem occurs, or just a change in business
requirements means that modifications need to be made. When the procedure does
so much, what does it take to test it once the modifications are done? Even though the
change only impacts 10 percent of the procedure, the entire procedure has to be tested.
What does it take to accomplish that? What if there are several intricate modifications
that need to be made? How difficult does it become for more than one developer to work
on the changes and coordinate their efforts?

3
© Andy Leonard, Kent Bradshaw 2020
A. Leonard and K. Bradshaw, SQL Server Data Automation Through Frameworks,
https://doi.org/10.1007/978-1-4842-6213-9_1
Chapter 1 Stored Procedures 101

Now, consider that monolith broken up into multiple procedures, each of which
performs a unit of work. When a change is made and needs to be tested, that effort can
be isolated to just what is necessary to perform that unit of work, and the validation is
concentrated on the result of the procedure. And, with it now being multiple procedures,
modifications can usually be done simultaneously by multiple developers, and their
efforts can be mutually exclusive. Over time, that approach can prove to be much more
cost effective and efficient.
That is where a framework helps to organize and manage processes to provide
the most flexibility in development and can minimize the maintenance effort (which,
sometimes, is not considered until it becomes an obvious issue). A framework provides
a consistent methodology for assembling and executing processes. It also promotes
writing code in small units of work that can potentially be mixed, matched, and reused.
It adds complexity to the development and deployment processes but can reduce the
effort for production scheduling. The framework can also provide greater flexibility for
managing the execution of the process.

D
 emonstration of a Framework
To begin the analysis of the framework concept, we need a process. Our example to
follow shows a framework built to run a daily process against an example schema. The
details of that process don’t matter to the example. Just consider that any production
system might have something that needs to be done each day, and what follows is a
framework by which to make those daily processes happen.
Also, part of the example is a monthly process. Just as a system might need certain
tasks to be done each day, it’s also common to have certain things that need to be done
once monthly. In designing such a system, one must take into account the order in
which daily and monthly processes execute when their schedules intersect on – in our
example – the first of each month.
For the purpose of this book, a simple process has been developed (NOTE: all of the
code described can be downloaded at entdna.com. You can also find a link to the code
from the book’s catalog page on Apress.com). Downloading the example code enables
you to follow along with the upcoming examples on your own machine.

4
Chapter 1 Stored Procedures 101

An Example Schema


Listing 1-1 shows code to create a schema called FWDemo that will contain everything
needed for the demonstration. Also, there is code to create a table called FWDemo.
ProcessLog. Including a pattern for writing to this table throughout all of the procedures
certainly adds some complexity and overhead to the procedures, but what it provides in
monitoring and troubleshooting more than makes up for the upfront effort.

Listing 1-1. Schema and log table creation

print 'FWDemo Schema'


If Not Exists(Select name
              From sys.schemas
              Where name='FWDemo')
begin
  print ' - Creating FWDemo schema'
  declare @sql varchar(255) = 'Create Schema FWDemo'
  exec(@sql)
  print ' - FWDemo schema created'
end
Else
print ' - FWDemo schema already exists.'
print ''
GO

IF  EXISTS (SELECT * FROM sys.objects


            WHERE object_id = OBJECT_ID(N'FWDemo.ProcessLog')
              AND type in (N'U'))
    DROP TABLE FWDemo.ProcessLog
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO
5
Chapter 1 Stored Procedures 101

CREATE TABLE [FWDemo].[ProcessLog](


      [ProcessLogID]      [int] IDENTITY(1,1) NOT NULL,
      [ProcessLogMessage] [nvarchar](255)     NOT NULL,
      [CreateDate]        [smalldatetime]     NOT NULL
)
GO

SET ANSI_PADDING OFF


GO

Do you have a SQL Server instance that you can use for learning purposes? Connect
to that instance as an administrator, for example, as the sa user. Then, in SQL Server
Management Studio (SSMS), open a “New Query” window, copy the code from Listing 1-1,
and execute it to create the example schema used in this and subsequent chapters.

The Daily Process


Listing 1-2 shows the code to create two stored procedures that will make up our
demonstration Daily Process. We are providing two procedures in our example because
it’s common to have more than one, and having two allows us to show how to make the
execution of subsequent procedures depend upon the success of earlier ones – because
the need to execute a series of procedures and halt or take other actions when an error
occurs is the real-life scenario that most of us face.
These procedures (as well as all others that we will be using) can be compiled and
executed for your own testing. You will notice that there is some code commented out
(lines that are preceded with ‘--’) in each procedure that can be invoked (remove the
‘--’, then recompile) to create an error condition. This ability to create an error condition
allows testing for successful and unsuccessful completions that will become more
important as we progress through demonstration iterations in later chapters.
For the sake of this exercise, we will declare a business rule for the Daily Process
stating that FWDemo.DailyProcess1 must complete successfully before FWDemo.
DailyProcess2 can be executed. FWDemo.DailyProcess2 must then complete
successfully before the Daily Process can be deemed successfully executed.

6
Chapter 1 Stored Procedures 101

Listing 1-2. Daily Process stored procedures

If Exists(Select s.name + '.' + p.name


          From sys.procedures p
          Join sys.schemas s
            On s.schema_id = p.schema_id
          Where s.name = 'FWDemo'
            And p.name = 'DailyProcess1')
begin
  print ' - Dropping FWDemo.DailyProcess1 stored procedure'
  Drop Procedure FWDemo.DailyProcess1
  print ' - FWDemo.DailyProcess1 stored procedure dropped'
end
GO

CREATE PROCEDURE FWDemo.DailyProcess1


AS
---------------------------------------------------------------------------
---------------------------------------------------------------------------
--
-- Purpose: This procedure is part of the Stored Procedure Framework Demo.
--
-- NOTE: An Error situation can be created for testing/demo purposes by
--    un-commenting the Error code in the body of the procedure.  To return
--    to a procedure with a successful execution, re-comment the code or    
--    recompile the original.
--
---------------------------------------------------------------------------
---------------------------------------------------------------------------

SET NOCOUNT ON

/*********************************************/
/*  Log the START of the procedure to the process log  */
/*********************************************/

7
Chapter 1 Stored Procedures 101

INSERT INTO FWDemo.ProcessLog (


      ProcessLogMessage,
      CreateDate
)
Values ('Procedure FWDemo.DailyProcess1 - STARTING',
      GETDATE()
)

DECLARE @RetStat int

SET @RetStat = 0

/******************************************/
/*  Force an ERROR CONDITION for this procedure  */
/******************************************/

--INSERT INTO FWDemo.ProcessLog (


--    ProcessLogMessage,
--    CreateDate
--)
--VALUES ('Procedure FWDemo.DailyProcess1 - Problem Encountered',
--    GETDATE()
--)
--SET @RetStat = 1

/****************************************************/
/*  Log the COMPLETION of the procedure to the process log     */
/****************************************************/

IF @RetStat = 0
   BEGIN
      INSERT INTO FWDemo.ProcessLog (
            ProcessLogMessage,
            CreateDate
      )
      VALUES ('Procedure FWDemo.DailyProcess1 - COMPLETED',
            GETDATE()
      )

8
Chapter 1 Stored Procedures 101

   END
ELSE
   BEGIN
      INSERT INTO FWDemo.ProcessLog (
            ProcessLogMessage,
            CreateDate
      )
      VALUES ('Procedure FWDemo.DailyProcess1 - ERROR',
      GETDATE()
      )
   END

RETURN @RetStat
GO

If Exists(Select s.name + '.' + p.name


          From sys.procedures p
          Join sys.schemas s
            On s.schema_id = p.schema_id
          Where s.name = 'FWDemo'
            And p.name = 'DailyProcess2')
begin
  print ' - Dropping FWDemo.DailyProcess2 stored procedure'
  Drop Procedure FWDemo.DailyProcess2
  print ' - FWDemo.DailyProcess2 stored procedure dropped'
end
GO

CREATE PROCEDURE FWDemo.DailyProcess2


AS
---------------------------------------------------------------------------
---------------------------------------------------------------------------
--
-- Purpose: This procedure is part of the Stored Procedure Framework Demo.
--

9
Chapter 1 Stored Procedures 101

-- NOTE: An Error situation can be created for testing/demo purposes by


--    un-commenting the Error code in the body of the procedure.  To return
--    to a procedure with a successful execution, re-comment the code or
--    recompile the original.
--
---------------------------------------------------------------------------
---------------------------------------------------------------------------

SET NOCOUNT ON

/*********************************************/
/*  Log the START of the procedure to the process log  */
/*********************************************/

INSERT INTO FWDemo.ProcessLog (


      ProcessLogMessage,
      CreateDate
)
Values ('Procedure FWDemo.DailyProcess2 - STARTING',
      GETDATE()
)

DECLARE @RetStat int

SET @RetStat = 0

/******************************************/
/*  Force an ERROR CONDITION for this procedure  */
/******************************************/

--INSERT INTO FWDemo.ProcessLog (


--    ProcessLogMessage,
--    CreateDate
--)
--VALUES ('Procedure FWDemo.DailyProcess2 - Problem Encountered',
--    GETDATE()
--)

10
Chapter 1 Stored Procedures 101

--SET @RetStat = 1

/****************************************************/
/*  Log the COMPLETION of the procedure to the process log     */
/****************************************************/

IF @RetStat = 0
   BEGIN
      INSERT INTO FWDemo.ProcessLog (
            ProcessLogMessage,
            CreateDate
      )
      VALUES ('Procedure FWDemo.DailyProcess2 - COMPLETED',
            GETDATE()
      )
   END
ELSE
   BEGIN
      INSERT INTO FWDemo.ProcessLog (
            ProcessLogMessage,
            CreateDate
      )
      VALUES ('Procedure FWDemo.DailyProcess2 - ERROR',
            GETDATE()
      )
   END

RETURN @RetStat
GO

In a “New Query” window in SSMS, execute the code from Listing 1-2 while
connected to the FWDemo schema. The code creates two stored procedures that
together make up a daily process. With those procedures in place, you can turn your
attention to the next problem, which is to schedule those procedures to actually run each
day.

11
Chapter 1 Stored Procedures 101

Executing the Daily Process


Now that an environment has been built and a process created, let’s turn to the
execution. Operations staff will have to set up or schedule the procedures to run and
either monitor for any error conditions that are raised or set up precedence rules if such
a function exists in any scheduling tool used. In a basic sense, we now have a Daily
Process that is ready for production. Listing 1-3 shows the statements that can be used
to execute the Daily Process procedures and also a SELECT statement that can be run
to view the output written to FWDemo.ProcessLog. You will notice that we are ordering
the output in a descending order. This will show the most recent messages at the top and
eliminate the need to scroll down to get to the messages for the current execution and
much easier once the log starts to become heavily populated.

Listing 1-3. Daily Process execute statements and process log SELECT statement

EXECUTE FWDemo.DailyProcess1

EXECUTE FWDemo.DailyProcess2

SELECT ProcessLogID
      ,ProcessLogMessage
      ,CreateDate
FROM FWDemo.ProcessLog
ORDER BY ProcessLogID desc

Including a Monthly Process


Now it’s time to add another layer to our production process. In Listing 1-4, there is
code to create two more stored procedures that will make up a Monthly Process. The
procedures operate the same as our daily process procedures, and there are some
business rules associated with them. First, the monthly process will run on the first day
of the month. Second, it will run after the successful execution of the Daily Process,
and third, FWDemo.MonthlyProcess1 must complete successfully before FWDemo.
MonthlyProcess2 can be executed.

12
Chapter 1 Stored Procedures 101

Listing 1-4. Monthly Process stored procedures

If Exists(Select s.name + '.' + p.name


          From sys.procedures p
          Join sys.schemas s
            On s.schema_id = p.schema_id
          Where s.name = 'FWDemo'
            And p.name = 'MonthlyProcess1')
begin
  print ' - Dropping FWDemo.MonthlyProcess1 stored procedure'
  Drop Procedure FWDemo.MonthlyProcess1
  print ' - FWDemo.MonthlyProcess1 stored procedure dropped'
end
GO

CREATE PROCEDURE FWDemo.MonthlyProcess1


AS
---------------------------------------------------------------------------
---------------------------------------------------------------------------
--
-- Purpose: This procedure is part of the Stored Procedure Framework Demo.
--
-- NOTE: An Error situation can be created for testing/demo purposes by
--    un-commenting the Error code in the body of the procedure.  To return
--    to a procedure with a successful execution, re-comment the code or
--    recompile the original.
--
---------------------------------------------------------------------------
---------------------------------------------------------------------------

SET NOCOUNT ON

/*********************************************/
/*  Log the START of the procedure to the process log  */
/******************************** ************/

13
Chapter 1 Stored Procedures 101

INSERT INTO FWDemo.ProcessLog (


      ProcessLogMessage,
      CreateDate
)
Values ('Procedure FWDemo.MonthlyProcess1 - STARTING',
      GETDATE()
)

DECLARE @RetStat int


SET @RetStat = 0

/******************************************/
/*  Force an ERROR CONDITION for this procedure  */
/******************************************/

--INSERT INTO FWDemo.ProcessLog (


--    ProcessLogMessage,
--    CreateDate
--)
--VALUES ('Procedure FWDemo.MonthlyProcess1 - Problem Encountered',
--    GETDATE()
--)
--SET @RetStat = 1

/****************************************************/
/*  Log the COMPLETION of the procedure to the process log     */
/****************************************************/

IF @RetStat = 0
   BEGIN
      INSERT INTO FWDemo.ProcessLog (
            ProcessLogMessage,
            CreateDate
      )
      VALUES ('Procedure FWDemo.MonthlyProcess1 - COMPLETED',
            GETDATE()
      )
   END

14
Another Random Scribd Document
with Unrelated Content
»Niin, niin», vastasi hän tehden kiihkeän liikkeen. »Miksi ette
sanonut minulle tätä? Miksi ette tunnustanut minulle, vaikkapa
viimeisessä hetkessä? Minä… mutta ei sanaakaan enää!» jatkoi hän
valittavalla äänellä ja koetti hoputtaa hevostaan eteenpäin. »Minä
olen kuullut kylliksi. Te haavoitatte sydäntäni, herra de Berault.
Vastedes rukoilen Jumalalta voimaa antamaan teille anteeksi.»

»Mutta te ette ole kuunnellut minua loppuun», sanoin kiihkeästi.

»En tahdo kuulla enempää», vastasi hän, turhaan yrittäen saada


ääntänsä vakaaksi. »Mitä hyvää siitä olisi? Voinko sanoa enempää
kuin olen sanonut? Tai luuletteko, että minä voin antaa anteeksi nyt
— hänen ollessaan takanamme, kulkemassa kuolemaansa kohden?
Oi, ei, ei!» jatkoi hän. »Jättäkää minut! Minä pyydän teitä jättämään
minut rauhaan. En voi hyvin.»

Hän heittäysi niin sanoessaan eteenpäin hevosensa kaulalle ja


alkoi itkeä niin rajusti, että kyyneleet kierivät esille naamion alta ja
kimmelsivät kuin kastehelmet kuutamossa, ja nyyhkytykset
puistuttivat häntä niin voimakkaasti, että luulin hänen putoavan.
Ojensin vaistomaisesti käteni auttaakseni häntä, mutta hän väistyi.
»Ei», läähätti hän, »älkää koskeko minuun! Meidän välillämme on
liian paljon!»

»Välillemme täytyy vielä yhden lisän tulla», vastasin lujasti.


»Teidän on kuunneltava minua vielä hetkinen, vaikka vastoin
tahtoannekin, sen rakkauden tähden, jota tunnette veljeänne
kohtaan. Vielä on yksi tie minulle avoinna pelastaakseni kunniani, ja
viime aikoina olen päättänyt valita sen tien. Tänään, sen sanon
kiitollisesti, voin siten menetellä ilomielin, vaikken ilman kaipausta,
päättävästi, vaikken kevein tuntein. Mademoiselle», jatkoin
vakavasti, enkä silloin tuntenut ollenkaan sitä voitoniloa, sitä
ylpeyteni tyydytystä, jota olin odottanut kokevani, vaan ainoastaan
iloa siitä ilosta, jota sain hänelle toimittaa, »minä kiitän Jumalaa, että
vallassani on vielä peruuttaa se, mitä olen tehnyt, että vielä voin
palata sen luo, joka minut lähetti, ja sanoa hänelle muuttaneeni
mieltä ja tahtovani kantaa oman taakkani ja kärsiä rangaistukseni.»

Me olimme noin sadan askeleen päässä mäen laelta ja


tienviitasta. Hän huudahti kiihkeästi, ettei hän ollut ymmärtänyt
minua. »Mitä äsken… sanoittekaan?» sopersi hän. »Minä en
kuullut…» Ja hän alkoi hypistellä naamion sidenauhoja.

»Ainoastaan sen, mademoiselle», vastasin leppeästi, »että minä


annan veljellenne takaisin hänen kunniasanansa. Tästä hetkestä asti
hän on vapaa menemään minne tahansa haluaa. Tässä, missä nyt
olemme, on neljän tien risteys. Oikeanpuolinen vie Montaubaniin,
missä teillä varmaan on ystäviä, jotka voivat antaa teille turvapaikan
joksikin aikaa. Vasemmanpuolinen vie Bordeauxiin, missä voitte
nousta laivaan, jos haluatte. Sanalla sanoen, mademoiselle»,
jatkoin, ja ääneni petti hiukan nyt lopulla, »minä toivon, että huolenne
ovat nyt lopussa.»

Hän käänsi kasvonsa minuun — me olimme molemmat


pysähtyneet — ja nyki naamion nauhoja. Mutta hänen vapisevat
kätensä olivat vetäneet ne umpisolmuun; hän antoi käden vaipua ja
huudahti epätoivoisena:

»Mutta te? Te?» Hänen äänensä oli niin muuttunut, että tuskin
tunsin sitä. »Mitä te aiotte tehdä? Minä en käsitä teitä, hyvä herra.»

»On kolmas tie», vastasin minä. »Se vie Pariisiin. Se on minun


tieni, mademoiselle. Me eroamme tässä.»
»Mutta minkätähden?» huudahti hän kiivaasti.

»Sentähden, että minä tästä päivästä alkaen tahtoisin ruveta


kunnialliseksi», vastasin matalalla äänellä. »Mutta minä en tahdo olla
jalomielinen toisen kustannuksella. Minun täytyy palata sinne, mistä
olen tullutkin.»

»Châteletiin?» kuiskasi hän.

»Niin, mademoiselle. Châteletiin.»

Hän koetti kouristuneesti kohottaa naamiotaan.

»En voi oikein hyvin», änkytti hän, »en voi hengittää.»

Ja hän alkoi huojua niin rajusti satulassa, että hyppäsin ratsailta,


riensin hänen hevosensa pään eteen ja ennätin juuri parahiksi
ottamaan hänet vastaan, kun hän putosi. Hän ei ollut vielä aivan
tiedottomana, sillä tukiessani häntä hän huusi:

»Älkää koskeko minuun! Älkää koskeko minuun! Minä kuolen


häpeästä.»

Mutta puhuessaan hän tarttui minuun kiinni. Minä en ollut kuullut


väärin, ja hänen sanansa tekivät minut onnelliseksi. Sitten kannoin
hänet ruohopenkereelle ja laskin hänet siihen, juuri kun herra de
Cocheforêt karautti paikalle. Hän hyppäsi salamoivin silmin alas
hevosen selästä.

»Mitä tämä on?» huusi hän. »Mitä olette sanonut hänelle,


kunnoton?»
»Hän ilmoittaa sen teille», vastasin kuivakiskoisesti, ja hänen
katseensa tyynnytti minut jälleen. »Muun muassa, että te olette
vapaa. Tästä hetkestä alkaen, herra de Cocheforét, päästän teidät
sanastanne ja lähden voittamaan takaisin kunniani. Hyvästi.»

Hän huusi jotakin minun noustessani satulaan, mutta minä en


pysähtynyt kuulemaan tai vastaamaan. Kannustin hevostani ja
ratsastin tienviitan ohi; edessäni oli nummi, kuivunut, alaston,
melkein puuton; takanani oli kaikki, mitä rakastin. Kun olin
ratsastanut parisataa syltä, käännyin katsomaan ja näin herra de
Cocheforêtin seisovan kuin patsaana, joka kuvastui taivasta vasten,
ja tuijottavan jälkeeni mademoisellen liikkumattoman ruumiin yli.
Hetken kuluttua katsoin taas. Silloin näin ainoastaan solakan
puuristin ja sen alla tumman, muodottoman kasan.

XIII luku

Martinpäivän aatto

Myöhään marraskuun 29 päivän illalla ratsastin Pariisiin Orléansin


portin läpi. Tuuli oli luoteinen, ja aurinko laski sakeaan pilvimereen.
Ilmassa tuntui olevan sauhua, löyhkää nousi katuojista, ja kaupungin
haju ellotti minua; kaikesta sydämestäni kadehdin sitä miestä, joka
oli lähes kaksi kuukautta sitten lähtenyt Pariisista tämän saman
portin kautta, kasvot etelään käännettyinä ja tiedossaan ratsastus
päivä päivältä ja penikulma penikulmalta yli nummien, soiden ja
laidunten. Hänellä oli ollut edessään muutaman viikon elämä,
vapaus ja raikas ilma, toivo ja epätietoisuus; nyt sitävastoin tulin
takaisin tuomion alaisena, ja siinä savuharsossa, joka leijaili
lukemattomien kattojen sokkelon päällä, näin oman kohtaloni
kammottavan vertauskuvan.

Sillä se on totinen tosi: keski-ikäinen mies ei voi


silmänräpäyksessä heittää kaikkia tapojaan ja katsantokantojaan,
joita kokemus on hänelle vähitellen tuottanut; hän ei nouse äkkiä
kaikkia niitä kovia sääntöjä ja periaatteita vastaan, joita hän on niin
kauan noudattanut, — ainakaan hän ei tee sitä vapisematta ja
epäilyksittä, ilman sisällisiä taisteluja ja pahoja aavistuksia.
Vähintään kymmeneen kertaan tein itselleni Loiren ja Pariisin välillä
sen kysymyksen, mitä kunnia oli ja mitä iloa se saattaa minulle
tuottaa silloin, kun makaan maatumassa ja unohdettuna — enkö
vain ollut virvatulta tavoittamassa ja eikö se tunnoton mies, jonka
luokse olin palaamassa, olisi ensimmäinen nauramaan
typeryydelleni.

Oli melkein pimeä, kun ratsastin sillan yli ja alakuloisena läksin


Savonnie-kadulle. Pantuani hevoseni talliin otin satularepun ja
pistoolihuotrat ja kiipesin ylös portaita vanhan isäntäni luo — johtuu
mieleeni, että paikka tuntui minusta käyneen kummallisen ahtaaksi,
viheliäiseksi ja haisevaksi minun poissaollessani — ja koputin. Sen
avasi heti pikku räätäli itse. Hän levitti kätensä ja levitti silmänsä
selälleen, nähdessään minut.

»Kautta pyhän Genevièven!» huudahti hän. »Eikö siinä olekin


herra de
Berault!»

»Kyllä on.»

Pitkän yksinäisen matkani jälkeen tunsin itseni hiukan liikutetuksi


huomatessani hänen niin ilahtuvan minut nähdessään, vaikken
milloinkaan ollut tehnyt hänelle mitään sen suurempaa palvelusta
kun silloin tällöin puhellut toverillisesti hänen kanssaan ja lainaillut
hänen rahojaan. »Näytätte hämmästyneeltä, ystäväiseni», jatkoin,
kun hän vetäytyi syrjään, laskeakseen minut sisälle. »Voin vannoa,
että olette pantannut kapistukseni ja vuokrannut huoneeni pois,
senkin veijari!»

»Ei olisi milloinkaan tullut kysymykseenkään, teidän armonne!»


vastasi hän. »Olen päinvastoin odottanut teitä.»

»Milloin?» kysyin ihmeissäni. »Tänäänkö?»

»Tänään tai huomenna», vastasi hän seuratessaan minua sisälle


ja sulkiessaan oven. »Ensi sanoikseni virkoin kuultuani aamulliset
uutiset: Nyt saamme herra de Beraultin tänne takaisin. Teidän
armonne suonee anteeksi lapsille», jatkoi hän sipsuttaen
edestakaisin ympärilläni, minun asettuessani vanhalle paikalleni
kolmijalkaiselle tuolille tulisijan eteen. »Nyt on kylmä ilta, eikä ole
tulta pesässä.»

Hänen puuhakkaasti toimittaessaan säilyyn viittani ja


satulareppuni, tuli pikku Gil — minä olin ollut kummina hänelle St.
Sulpicen kirkossa ja samana päivänä lainannut kymmenen
kultarahaa hänen isältään — hyvin ujona esille ja alkoi leikkiä
miekankahvan kanssa.

»Vai niin, te odotitte minua takaisin, kun kuulitte uutiset, Frison?»


sanoin ja nostin pojan polvelleni.

»Niin odotin, teidän armonne», vastasi hän ja tarkasteli liemipadan


sisustaa ennen kuin asetti sen tulelle.
»No, antakaa kuulua, minkälaisia uutisia ne ovat», sanoin
kuivakiskoisesti.

»Ne koskevat kardinaalia.»

»Vai niin. Mistä on puhe?»

Hän katsoi minuun ja piteli raskasta pataa käsissään.

»Ettekö te ole kuullut sitä?» huudahti hän hämmästyneenä.

»En sanaakaan. Kertokaa se minulle, ystäväiseni.»

»Ettekö ole kuullut, että hänen ylhäisyytensä on joutunut


epäsuosioon?»

Tuijotin häneen epäuskoisena.

»En hiiskaustakaan», sanoin sitten. Hän laski padan alas.

»Siinä tapauksessa on tiedän armonne totisesti ollut hyvin pitkällä


matkalla», sanoi hän tunteellisesti ja vakuuttavasti. »Sillä sitä on
huhuiltu jo viikon ajan tai enemmänkin, ja minä luulin teidän
sentähden tulleen takaisin. Viikon? Ei, kenties jo kuukaudenkin.
Kuiskaillaan, että se johtuu leskikuningattaresta. Ainakin on varmaa,
että hänen käskyjään on peruutettu ja hänen upseereilleen annettu
uusia ohjeita. Huhu tietää, että piakkoin solmitaan rauha Espanjan
kanssa. Hänen vihollisensa nostavat päätään joka puolella, ja minä
olen kuullut, että hän on jo tilannut vaihtohevoset valmiiksi rannikolle
asti, voidakseen paeta milloin hyvänsä. Kenties hän on jo
lähtenytkin.»
»Mutta entä kuningas!» sanoin ihan ällistyksissäni. »Unohdatte
kuninkaan. Niin pian kuin kardinaali puhaltaa sävelen pillistään,
tanssii hän… ja muut myöskin!» lisäsin uhkaavasti.

»Kyllä», vastasi Frison innokkaasti. »Se on totta, teidän armonne,


mutta kuningas ei tahdo nähdä häntä. Kolmasti kuuluu kardinaali
tänään käyneen Luxembourg-palatsissa ja seisoneen kuten kaikki
muutkin odotushuoneessa; lienee ollut kerrassaan surkea nähdä
häntä siinä tilassa. Mutta hänen majesteettinsa ei suostu ottamaan
häntä vastaan. Ja kun hän läksi viimeisen kerran sieltä pois,
kerrotaan hänen kasvojensa olleen kuin kuolleen miehen. Niin, hän
on suuri mies, herra de Berault, ja me voimme saada huonomman
hallitusmiehen. Aateliset eivät pitäneet hänestä, mutta hän oli hyvä
kauppiaille ja porvaristolle ja oikeudentuntoinen kaikkia kohtaan.»

»Vaiti, mies! Vaiti, ja anna minun ajatella!» sanoin kovin


kuohuksissani. Ja hänen kävellessään edestakaisin valmistamassa
illallistani, tulenloimun levitessä ympäri niukasti kalustetun pikku
huoneen ja pojan huvitellessa leikkikaluillaan, vaivuin miettimään
noita suuria uutisia, ihmetellen nykyistä asemaani ja mitä minun piti
tehdä. Aluksi minusta tuntui, ettei minulla ollut mitään muuta
tehtävää kuin pysytellä hiljaa. Muutaman tunnin kuluttua voisin
nauraa hänelle. Kaikesta päättäen oli onnenarpa kiepahtanut minulle
suosiollisesti. Minä olin suorittanut suuren tehtävän, antautunut
suureen vaaraan, voittanut naisen rakkauden, ja kaiken tämän
jälkeen minun ei tarvinnut kärsiä mitään rangaistusta.

Mutta yksi sana, joka kirposi Frisonin kieleltä hänen häärätessään


ympäri, ammentaessaan lientä ja leikatessaan leipää, painui syvästi
mieleeni ja samensi tyytyväisyyteni.
»Niin, teidän armonne», sanoi hän vahvistukseksi jollekin
edelliselle huomautukselleen, jota en ollut tarkannut, »ja minä olen
kuullut kerrottavan, että hänen viimeksi näyttäytyessään palatsin
etuhuoneessa ei yksikään niistä kymmenistä herroista, jotka olivat
maanantaina olleet hänen odotushuoneessaan, ollut tahtonut
puhella hänen kanssaan. Ne livistivät tiehensä kuin rotat — niin,
aivan kuin rotat — kunnes hän jäi ypö yksikseen seisomaan. Ja minä
olen nähnyt hänet!» Frison teki suuren liikkeen. »Oi…! Olen nähnyt
kuninkaan näyttävän raukalta hänen rinnallaan! Ja entä hänen
silmänsä! Niitä en tahtoisi nähdä nyt.»

»Äh, lorua», murahdin, »teille on valehdeltu. Niin typeriä eivät


ihmiset ole.»

»Vai niin? No, teidän armonne käsittää sen asian paremmin»,


vastasi hän vältellen. »Mutta kun liesi on kylmillään, ovat kissat
poissa.»

Vakuutin hänelle vielä kerran, että hän oli hupsu. Mutta siitä
huolimatta ja kaikkien järkeilyjeni jälkeenkin tunsin mieltäni
ahdistavan. Hän oli suuri mies, hän jos kukaan, ja kaikki hylkäsivät
hänet; ja minä — no, minulla ei ollut mitään syytä rakastaa häntä.
Mutta minä olin ottanut vastaan rahaa häneltä, olin ottanut
suorittaakseni häneltä asian ja jättänyt sen silleen. Jos hän kaatui
ennen kuin minä parhaimmalla tahdollanikaan ehdin täyttää
sitoumukseni hänelle, no niin — sitä parempi minulle. Se oli minun
voittoni — sotaonnea, sattuman suosiollisuutta. Mutta jos sitävastoin
piilouduin, otin ajan liittolaisekseni ja pysyttelin täällä hänen vielä
ollessaan jaloillaan, vaikkakin horjuen, niin kuinka silloin puhdistui
kunniani? Mitä arvoa oli silloin niillä suurilla sanoilla, joita olin
lausunut mademoisellelle Agenissa? Olisin samanlainen kuin
ritariromaanin pelkuriraukka, joka makasi ojassa taistelun riehuessa
ja sitten tuli esille kaiken päätyttyä kerskumaan urhoollisuudestaan.

Henki on halukas, mutta liha heikko. Yksi päivä, vuorokausi tai


kaksi saattoi tuottaa ratkaisun elämästä ja kuolemasta, rakkaudesta
ja kuolemasta, ja minä epäröitsin. Mutta viimein tein päätökseni.
Kahdentoista aikaan seuraavana päivänä, sinä aikana, jolloin olisin
mennyt saapuville, jollen olisi kuullut näitä uutisia, — sillä hetkellä
päätin mennä hänen luokseen, mutta en ennen, sen olin velkaa
itselleni. Enkä myöhemminkään, sen olin velkaa hänelle.

Sitten kun olin tästä päässyt selville, läksin aivan tyynesti levolle.
Mutta päivän valjetessa heräsin, ja minun oli mitä vaikeinta pysyä
hiljaa, kunnes kuulin Frisonin nousseen makuulta. Huusin silloin
häntä, saadakseni tietää, kuuluiko mitään uutta, ja makasin odotellen
ja kuunnellen, hänen mentyänsä kaupungille tiedustelemaan.
Minusta tuntui kuin olisi kokonainen iankaikkisuus kulunut ennen
kuin hän palasi.

»No, onko hän matkustanut pois?» kysyin kärsimättömästi kun


hän vihdoinkin astui huoneeseen.

Sitä hän ei tietystikään ollut tehnyt. Yhdeksän aikaan lähetin


Frisonin uudelleen ulos, samoin kello kymmeneltä ja yhdeltätoista,
mutta aina oli tulos sama. Minä olin kuin armahdustaan odottava,
joka pälyilee ja kuuntelee sydän kurkussa. Mutta hänen palattuansa
viimeiseltä kierrokseltaan lakkasin toivomasta ja pukeuduin
huolellisesti. Luultavasti olin kummallisen näköinen, sillä Frison
pysäytti minut ovella ja kysyi ilmeisen levottomasti, minne aioin.
Työnsin hänet leppeästi syrjään.

»Pelipöytään», sanoin, »tehdäkseni tärkeän heiton.»


Oli kaunis aamu, raikas, päiväpaisteinen ja herttainen, kun astuin
kadulle, mutta sitä tuskin huomasinkaan. Kaikki ajatukseni olivat
kiintyneet matkani määrään, niin että tuntui olevan vain askel
kynnykseltäni Richelieu-hotelliin; tuskin olin jättänyt edellisen, kun jo
olin perillä. Nyt, kuten sinä muistettavana iltanakin, jolloin olin
astunut kadun yli tihkusateessa ja tähystänyt tuonne pahaa
aavistellen, seisoi kaksi tai kolme kardinaalin livereihin puettua
lakeijaa toimettomina ison portin ulkopuolella. Lähemmäs tullessani
huomasin, että vastapäinen puoli katua pitkin Louvren sivua oli ihan
täynnä ihmisiä, joilla ei ollut ajatustakaan tehtäviensä hoitamisesta,
vaan seisoivat siinä hiljaisina, loivat syrjäkatseita hotelliin päin ja
koettivat olla vain sattumalta ohi menemässä. Heidän
äänettömyydessään ja kieroissa katseissaan oli jotakin uhkaavaa.
Kun käännyin katsomaan taakseni, päästyäni portista sisälle,
huomasin heidän ahmivan minua silmillään.

Ja muuta nähtävää heillä ei ollutkaan. Pihalla, missä olin toisin


aamuin — hovin ollessa Pariisissa — nähnyt paritkymmenet vaunut
odottelemassa ja kolme sen vertaa palvelijoita, ei ollut nyt mitään
muuta kuin tyhjyyttä, päiväpaistetta ja hiljaisuutta. Vartiovuorolla
oleva upseeri kierteli viiksiään ja katseli minua kummastuneena, kun
menin hänen ohitseen; porttikäytävässä seisoskelevat palvelijat
olivat liiaksi innostuneet keskinäiseen kuiskailuun, voidakseen hoitaa
tehtäviään, ja he virnistelivät, kun ilmestyin näkyviin. Mutta voiton vei
kaikesta se näky, joka minua kohtasi, kun olin mennyt portaita ylös ja
tulin odotushuoneen ovelle. Vahti olisi avannut vastaanottohuoneen
oven, mutta eräs hovimestari, joka seisoi vieressä ja supatti parin
muun palvelijan kanssa, riensi vastaani ja pidätti minut.

»Mikä on asianne, hyvä herra?» kysyi hän epäluuloisesti; minua


ihmetytti, miksi hän ja nuo muut katselivat minua niin kummallisesti.
»Minä olen herra de Berault», vastasin terävästi. »Minulla on
pääsyoikeus.»

Hän kumarsi hyvin kohteliaasti.

»Niin, herra de Berault, minulla on kunnia tuntea teidät


ulkonäöltä», sanoi hän. »Mutta suokaa anteeksi, onko asiananne
tavata hänen ylhäisyyttänsä?»

»Minulla on se tavallinen asia», vastasin nyreästi. »Se josta monet


joukossamme saavat elatuksensa… tervehdyksillä käyminen.»

»Mutta… onko teidät kutsuttu tänne, hyvä herra?»

»Ei», vastasin kummeksuen, »tämähän on tavallinen


vastaanottoaika.
Minulla on sitäpaitsi vähän erityistä keskustelevaakin hänen
kanssaan.»

Mies tarkasteli minua yhä silmäänpistävän neuvottomana. Sitten


hän astui syrjään ja antoi vahdille merkin avata oven. Astuin sisälle
avopäin ja varma, päättäväinen ilme kasvoillani, valmiina
kohtaamaan kaikkien katseet. Mutta jo kynnyksellä tuli salaisuus ilmi.
Huone oli tyhjä.

XIV luku

Jälkikesä
Niin, suuren kardinaalin vastaanottohuoneessa olin minä yksin
odottamassa! Katselin ympäri huonetta, pitkää kapeaa salia, jossa
hänen oli joka aamu tapana kävellä sen jälkeen kun oli
vastaanottanut arvokkaimmat suojattinsa. Tuijotin hämmentyneenä
joka suunnalle. Lavitsat seinien vierillä olivat tyhjät, ikkunakomerot
samaten. Sinne tänne sovitetut maalatut ja veistetyt kardinaalihatut,
isot R-kirjaimet ja vaakunakilvet katselivat alas tyhjälle lattialle.
Pienellä tuolilla peräoven luona istui kuitenkin mustaan puettu mies,
joka aivan rauhallisena luki tai oli lukevinaan pientä kirjaa eikä
kertaakaan vilkaissut sivulle. Tuollainen hidasverinen, veltto luonne,
jollaisia versoo suurten miesten varjossa.

Äkkiä, siinä seistessäni hämmentyneenä ja häpeissäni — sillä


minä olin nähnyt vanhan Richelieu-palatsin etuhuoneen niin täyteen
sullottuna, että hän tuskin kykeni raivaamaan tietänsä läpi ahdingon
— mies löi kirjansa kiinni, nousi pystyyn ja lähestyi minua
äänettömästi.

»Herra de Berault?» sanoi hän.

»Niin», vastasin.

»Hänen ylhäisyytensä odottaa teitä. Olkaa hyvä ja seuratkaa


minua.»

Tottelin entisestäni yhä enemmän hämmästyneenä. Sillä kuinka


voi kardinaali tietää, että minä olin täällä? Miten hän tiesi sen,
antaessaan käskyn ottaa minut vastaan? Mutta minulla ei ollut paljoa
aikaa sitä ajatella. Me menimme kahden huoneen läpi; toisessa istui
joitakuita sihteereitä kirjoittamassa. Sitten pysähdyimme kolmannen
oven eteen. Kaikkialla vallitsi hiljaisuus, sankka kuin veitsellä
leikattava. Palvelija koputti, avasi, työnsi verhon syrjään ja antoi
minulle sormi huulilla merkin, että voin astua sisään. Minä tein niin ja
huomasin seisovani varjostimen takana.

»Onko siellä herra de Berault?» kysyi ohut epäsointuinen ääni.

»On, teidän ylhäisyytenne», vastasin vapisten.

»Astukaa esiin, ystäväiseni, niin saamme puhella.»

Astuin varjostimen taakse, ja miten lie ollutkaan, mutta ulkona


odottava ihmisjoukko, tyhjä eteissali, jossa vastikään olin seissyt,
hiljaisuus, äänettömyys, kaikki tuntui keskittyneen tänne ja antavan
miehelle, jonka edessä seisoin, sellaisen arvokkuuden, jollaista
hänellä ei ollut milloinkaan ollut minun silmissäni silloin, kun koko
maailma tunkeili hänen ovillaan ja ylpeimmätkin liehakoivat häntä
houkutellakseen hymyilyn hänen huuliltaan. Hän istui nojatuolissa
lieden takasyrjällä, pieni punainen kalotti isossa päässä ja kauniit
kädet vielä sylissä. Hieno liinakaulus joka oli käännetty kaavun
kaulurin yli, oli aivan sileä, mutta hänen punainen kauhtanansa oli
alas asti koristeltu kalliilla pitseillä, ja Pyhän Hengen veljeskunnan
tunnus, valkoinen kyyhkynen kultaisella ristillä, loisti hänen
rinnassaan. Paperikasojen seassa näin tilavalla pöydällä hänen
vieressään miekan ja pistooleja, ja hänen takanaan olevan
pienemmän pöydän liinan alta pisti esille pari kannussaappaita.
Lähestyessäni hän katseli minua järkähtämättömän tyynenä, ja
hänen lempeistä, melkein hyväntahtoisista kasvoistaan koetin
turhaan nähdä edellisen yön voimakkaiden mielenliikutusten jälkiä.
Aivoihini iski ajatus, että jos tämä mies todellakin (ja sen sain
myöhemmin kuulla todeksi) seisoi elämän ja kuoleman ohuella
partaveitsenterällä, maallisen mahdin huipun — Ranskan herrana ja
Euroopan sovintotuomarina — ja tavallisen yksinkertaisen
kuolevaisen nimettömän vähäpätöisyyden vaiheilla, niin hän oli
maineensa arvoinen. Hän ei antanut alemmille luonteille tilaisuutta
voitonriemuun.

Tätä mietiskelyä oli kestänyt ainoastaan pikku tuokion.

»Vai niin, tulitte viimein takaisin, herra de Berault», sanoi hän


ystävällisesti. »Olen odottanut teitä kello yhdeksästä asti.»

»Teidän ylhäisyytenne tiesi siis…?» mutisin.

»Että te tulitte yksinänne ratsastaen Orléansin portista eilen


illalla?» vastasi hän, asettaen kätensä ristiin ja luoden minuun
selittämättömän silmäyksen. »Kyllä, sen tiesin heti illalla. Ja
puhukaamme nyt tehtävästänne. Te olette ollut uskollinen ja uuttera,
siitä olen varma. Missä hän on?»

Tuijotin häneen ja seisoin kuin kivettyneenä. Kaikki se


kummallisuus, jota olin nähnyt asunnostani lähdettyäni, se
odottamaton, mikä minua täällä oli kohdannut, oli jollakin merkillisellä
tavalla saanut minut unohtamaan oman asemani, oman vaarani —
tähän asti. Mutta hänen kysymyksensä nostatti äkkiä kaikki eteeni, ja
minä muistin tilanteeni. Sydämeni paisui, ja nyt ponnistin saadakseni
takaisin edes hiukan vanhaa sisuani, mutta toviin en kyennyt
virkkamaan sanaakaan.

»No niin», sanoi hän keveästi, ja hymyily pani hänen viiksensä


väreilemään, »te ette sano mitään. Te läksitte hänen kanssaan
Auchista neljäntenäkolmatta. Sen verran tiedän. Ja eilen tulitte
takaisin Pariisiin ilman häntä. Ei suinkaan hän ole karannut teiltä?»

»Ei, teidän ylhäisyytenne», änkytin vastaukseksi.


»No, se on hyvä», vastasi hän ja vaipui takaisin tuolilleen. »Tiesin
voivani luottaa teihin. Mutta missä hän on siis? Mihin olette pannut
hänet? Hän tietää paljon, ja mitä pikemmin minäkin saan sen tietää,
sitä parempi. Tuovatko apulaisenne hänet tänne?»

»Ei, teidän ylhäisyytenne», sopersin huulet kuivina. Hänen


hyväntuulisuutensa ja suopeutensa kauhistutti minua. Aavistinhan
hyvin, kuinka hirveä muutos oli tulossa ja miten hän raivoaisi
kerrottuani totuuden. Mutta minäkö, Gil de Berault, vapisisin
yhdenkään ihmisen edessä! Sillä ajatuksella kannustin itseäni. »Ei,
teidän ylhäisyytenne», sanoin epätoivon rohkaisemana, »minä en
ole tuonut häntä tänne, vaan päinvastoin laskenut hänet vapaaksi.»

»Te olette — mitä?» huudahti hän. Puhuessaan hän nojautui


eteenpäin, kädet tuettuina tuolin käsinojiin, ja hänen silmänsä, jotka
pienenemistään pienenivät, näyttivät lukevan sieluni sisimmät
ajatukset.

»Olen laskenut hänet vapaaksi», toistin tyynesti.

»Ja miksi?» kysyi hän äänellä, joka muistutti viilan rahinaa.

»Sentähden, että vangitsin hänet häpeällisellä tavalla», vastasin.


»Sentähden, että olen aatelismies, teidän ylhäisyytenne, ja se
tehtävä olisi pitänyt antaa aatelittomalle. Jos välttämättömästi
tahdotte tietää sen», jatkoin kärsimättömästi, »niin minä vangitsin
hänet väijyen seuraamalla naisen jälkiä ja voittamalla hänen
luottamuksensa ja pettämällä sen. Ja mitä pahaa olenkaan
elämässäni tehnyt — viimeksi täällä ollessani otitte ystävällisesti
muistuttaaksenne minulle osan tekojani — tätä en ole tehnyt
milloinkaan ennen enkä teekään!»
»Ja te päästitte hänet vapaaksi?»

»Niin.»

»Sitten kun olitte tuonut hänet Auchiin?»

»Niin.»

»Ja siis pelastanut hänet joutumasta Auchin varusväen päällikön


käsiin?»

»Niin», vastasin epätoivoisen välinpitämättömästi.

»Kuinka käy sitten sen luottamuksen, jota minä osoitin teille,


herraseni?» jatkoi hän uhkaavasti ja kumartuen yhä enemmän
eteenpäin lävisti minut katseellaan. »Te, joka laverratte
luottamuksesta ja uskosta, te, joka saitte pitää henkenne
kunniasananne nojalla ja ilman lupaustanne olisitte ollut ruumiina jo
enemmän kuin kuukauden ajan, vastatkaa minulle tähän! Kuinka nyt
käy sen luottamuksen, jota osoitin teille?»

»Vastaus on hyvin yksinkertainen», sanoin ja kohautin olkapäitäni,


— olin saanut tuulahduksen vanhaa itseäni. »Olen täällä, kärsiäkseni
rangaistukseni.»

»Ja te luulette, etten tiedä miksi?» vastasi hän ja löi kätensä


käsinojaan niin voimakkaasti, että minua hämmästytti. »Sentähden,
että olette kuullut valtani olevan lopussa? Sentähden, että olette
kuullut minun, joka eilen olin kuninkaan oikea käsi, tänään olevan
herpaantunut, kuihtunut ja voimaton? Sentähden, että olette kuullut
— — mutta varokaa itseänne! Varokaa itseänne!» jatkoi hän
tavattoman kiivaasti ja äänellä, joka muistutti koiran murinaa. »Te ja
muut! Varokaa itseänne, sanon minä. Vielä kenties huomaatte
erehtyneenne!»

»Niin totta kuin taivas minut tuomitsee», vastasin juhlallisesti, »ei


asia ole niin. Ennen kuin saavuin Pariisiin eilen illalla, en tiennyt
mitään siitä huhusta. Tulin tänne yhdessä ainoassa tarkoituksessa,
nimittäin lunastaakseni takaisin kunniani, luovuttamalla teidän
ylhäisyytenne käsiin jälleen sen, mitä annoitte minulle hyvässä
uskossa, ja tässä se on.»

Tuokion hän istui vielä samassa asennossa tähystäen minua


tiukasti.
Sitten leppyivät hänen kasvonsa hiukan.

»Olkaa hyvä ja soittakaa tuota kelloa», sanoi hän.

Se oli pöydällä vieressäni. Minä kilistin, mustapukuinen


pehmeäjalkainen mies tuli sisälle, lipui kardinaalin luo ja pani jonkin
paperin hänen käteensä. Kardinaali katsoi siihen, palvelijan
seistessä pää nöyrästi kumarassa, ja minun sydämeni sykki rajusti.

»Hyvä on», sanoi hänen ylhäisyytensä hetken vaitiolon jälkeen,


joka minusta tuntui loppumattomalta. »Käskekää avata ovet.»

Mies kumarsi syvään ja vetäytyi varjostimen taakse. Kuulin pienen


kellon soivan jossakin ulkona hiljaisuudessa, ja nyt kardinaali nousi.

»Seuratkaa minua!» sanoi hän, kummallinen kiilto terävissä


silmissään.

Kummeksuen vetäydyin syrjään, hänen mennessään varjostimen


luo; sitten seurasin häntä. Ensimmäisen oven ulkopuolella, joka oli
auki, oli kahdeksan tai yhdeksän henkilöä — hovipoikia, munkki,
hovimestari ja muutamia vahteja, jotka odottivat hartaan hiljaisina.
Nämä antoivat minulle merkin mennä edellä ja yhtyivät sitten meihin,
ja tässä järjestyksessä astelimme ensimmäisen huoneen läpi ja
toisen, jossa kirjurit ottivat meidät vastaan kumarruksin. Viimeinen
ovi, etuhuoneen, lennähti auki meidän lähestyessämme. Kuului
ääniä:

»Tilaa! Tilaa hänen ylhäisyydelleen!»

Me astuimme kahden kumartelevan lakeijarivin välitse ja


jouduimme — tyhjään huoneeseen.

Sveitsiläissoturit eivät tienneet minne kääntää katseensa, ja


lakeijat vapisivat kiireestä kantapäähän. Mutta kardinaali asteli
eteenpäin, näköjään täysin rauhallisena, kunnes oli verkalleen
edennyt puolet huoneen pituutta. Silloin hän kääntyi ensin toiselle ja
sitten toiselle puolen, naureskellen hiljaa ja ivallisesti.

»Hurskas isä», sanoi hän epäsointuisella äänellään munkille,


»mitä sanoo psalmien kirjoittaja? Minusta on tullut kuin pelikaani
erämaassa ja niinkuin pöllö autioilla asuinsijoilla.»

Munkki jupisi myöntävän vastauksen.

»Ja eikö ole kirjoitettuna edempänä samassa psalmissa: Ne


tulevat hukkumaan, mutta sinä jäät pysyväiseksi?»

»Niin on», vastasi munkki. »Aamen.»

»No, tämä epäilemättä tarkoittaa toista elämää», sanoi kardinaali


kylmäkiskoisen heikosti hymyillen. »Me palaamme kuitenkin
kirjojemme ääreen ja palvelemme Jumalaa ja kuningasta pienissä
asioissa, jollemme suurissa. Tulkaa, hurskas isä, tämä paikka ei ole
meille enää sovelias. Vanitas vanitatum — omnia vanitas!
Vetäydymme takaisin.»

Ja yhtä juhlallisesti kuin olimme tulleetkin menimme takaisin


ensimmäisestä, toisesta ja kolmannesta ovesta, kunnes taas
seisoimme kardinaalin hiljaisessa huoneessa, hän, minä ja
mustapukuinen, pehmeäjalkainen mies. Hetkeksi näytti Richelieu
unohtaneen minut. Hän seisoi mietiskellen lieden ääressä, silmät
tähdättyinä pieneen tuleen, joka paloi siinä, vaikka ilma oli lämmin.
Kerran kuulin hänen nauravan, ja kahdesti hän virkahti purevan
ivallisesti:

»Narreja! Narreja! Narreja!»

Vihdoin hän kohotti katseensa, huomasi minut ja hätkähti.

»Ahaa», sanoi hän, »teidät olin unohtanut. Niin, teillä on onni


mukananne, herra de Berault. Eilen oli minulla sadoittain suojatteja,
tänään on minulla ainoastaan yksi, eikä minulla ole varaa hirtättää
häntä. Mutta mitä vapauteenne tulee — se on aivan toinen asia.»

Tahdoin sanoa jotakin, puolustautua, mutta hän kääntyi nopeasti


pöydän luo ja istuutui kirjoittamaan muutamia sanoja paperille. Sitten
hän soitti, minun seistessäni hämmästyneenä odotellen.

Mustapukuinen tuli varjostimen taakse.

»Ottakaa tämä kirje ja viekää tämä herra ylempään


vartiohuoneeseen», sanoi kardinaali terävästi. »En tahdo kuulla
enempää, herra de Berault», jatkoi hän rypistäen kulmiaan ja
kohottaen kätensä estämään keskeytystä. »Asia on päätetty. Saatte
olla kiitollinen.»
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like