diff --git a/.github/prompts/release-notes.prompt.md b/.github/prompts/release-notes.prompt.md index 97bb70bf90..8c8202ab15 100644 --- a/.github/prompts/release-notes.prompt.md +++ b/.github/prompts/release-notes.prompt.md @@ -1,29 +1,122 @@ --- name: release-notes -description: Generate release notes for a specific milestone of the Microsoft.Data.SqlClient project. +description: Generate release notes for a specific milestone, covering all packages in the repository that have changes. argument-hint: agent: agent -tools: ['github/search_issues', 'edit/createFile', 'edit/editFiles', 'read/readFile'] +tools: ['edit/createFile', 'edit/editFiles', 'read/readFile'] --- Generate release notes for the milestone "${input:milestone}". -Steps: -1. Fetch Milestone Items - - Search for all **merged** Pull Requests associated with the milestone "${input:milestone}" in the `dotnet/SqlClient` repository. - - Use `github/search_issues` with query `is:pr is:merged milestone:"${input:milestone}" repo:dotnet/SqlClient`. -2. Analyze and Categorize - - Review the title and body of each PR. For PRs that are porting other PRs to current branch use `github/search_issues` with query `is:pr is:merged repo:dotnet/SqlClient ` to get more context. - - Categorize them into: `Added`, `Fixed`, `Changed`, `Removed`. - - Ignore PRs that are labelled as `Area\Engineering` - - Identify the contributors for the "Contributors" section. -3. Create Release Notes File - - Determine the correct path: `release-notes//.md`. - - Create the file with the template contents from `release-notes/template/release-notes-template.md`. - - Fill in the template, following the instructions present in each section. -4. Update CHANGELOG.md - - Add a new entry at the top of the list (under the Note). - - Include all the text from the Added, Fixed, Changed, Removed, etc. sections from the release notes. -5. Update Release Directory README - - Update `release-notes//README.md`. - - Add the new release to the table: `| | | [Release Notes](.md) |`. +This repository ships multiple packages. Only generate release notes for packages that have relevant PRs in the milestone. All packages use the same template: [release-notes/template/release-notes-template.md](release-notes/template/release-notes-template.md). + +## Package Registry + +| Package | Release Notes Directory | How to Identify PRs | +|---------|------------------------|---------------------| +| `Microsoft.Data.SqlClient` | `release-notes//` | Default — PRs not assigned to another package | +| `Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider` | `release-notes/add-ons/AzureKeyVaultProvider//` | Labels containing `AKV`, or PR titles/bodies/files referencing `AzureKeyVaultProvider`, `add-ons/`, or `AlwaysEncrypted.AzureKeyVaultProvider` | +| `Microsoft.SqlServer.Server` | `release-notes/MSqlServerServer//` | PR titles/bodies/files referencing `Microsoft.SqlServer.Server` or `src/Microsoft.SqlServer.Server/` | +| `Microsoft.Data.SqlClient.Extensions.Abstractions` | `release-notes/Extensions/Abstractions//` | PR titles/bodies/files referencing `Extensions.Abstractions` | +| `Microsoft.Data.SqlClient.Extensions.Azure` | `release-notes/Extensions/Azure//` | PR titles/bodies/files referencing `Extensions.Azure` | +| `Microsoft.Data.SqlClient.Extensions.Logging` | `release-notes/Extensions/Logging//` | PR titles/bodies/files referencing `Extensions.Logging` | + +## Version and Dependency Lookup + +Each package has its own versioning and dependency sources. Use these to determine package versions and dependency lists: + +| Package | Version Source | Dependency Source | +|---------|---------------|-------------------| +| `Microsoft.Data.SqlClient` | [tools/props/Versions.props](tools/props/Versions.props) (`MdsVersionDefault`) | [Directory.Packages.props](Directory.Packages.props) and the [project file](src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj) | +| `AzureKeyVaultProvider` | [tools/props/Versions.props](tools/props/Versions.props) (`AkvVersionDefault`) | [AKV project file](src/Microsoft.Data.SqlClient/add-ons/AzureKeyVaultProvider/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj) and [Directory.Packages.props](Directory.Packages.props) | +| `Microsoft.SqlServer.Server` | [tools/props/Versions.props](tools/props/Versions.props) (`SqlServerPackageVersion`) | [SqlServer project file](src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj) | +| `Extensions.Abstractions` | [AbstractionsVersions.props](src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/AbstractionsVersions.props) | [Abstractions.csproj](src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj) | +| `Extensions.Azure` | [AzureVersions.props](src/Microsoft.Data.SqlClient.Extensions/Azure/src/AzureVersions.props) | [Azure.csproj](src/Microsoft.Data.SqlClient.Extensions/Azure/src/Azure.csproj) | +| `Extensions.Logging` | [LoggingVersions.props](src/Microsoft.Data.SqlClient.Extensions/Logging/src/LoggingVersions.props) | [Logging.csproj](src/Microsoft.Data.SqlClient.Extensions/Logging/src/Logging.csproj) | + +Concrete dependency versions (e.g., `Azure.Core 1.49.0`) are centrally managed in [Directory.Packages.props](Directory.Packages.props). Framework-conditional versions (e.g., `net9.0` vs everything else) are handled by `Condition` attributes in the same file. + +## Skills + +This prompt uses the following skill: +- [fetch-milestone-prs](.github/skills/fetch-milestone-prs/SKILL.md) — Fetches all merged PR metadata for the milestone + +## Steps + +### 1. Fetch Milestone Items + +- Follow the instructions in the [fetch-milestone-prs](.github/skills/fetch-milestone-prs/SKILL.md) skill to fetch all merged PRs for the milestone "${input:milestone}". +- The output will be saved to `.milestone-prs/${input:milestone}/` with individual JSON files per PR and an `_index.json` summary. + +### 2. Analyze and Categorize + +- Read the `_index.json` file to get an overview of all PRs. Read individual PR JSON files for full details (title, body, labels). +- For PRs that are porting other PRs to the current branch, read the original PR's JSON file or look up the original PR number mentioned in the body for more context. +- Categorize PRs into: `Added`, `Fixed`, `Changed`, `Removed`. +- Ignore PRs labelled `Area\Engineering` (use the `has_engineering_label` field in the JSON). +- Identify the contributors for the "Contributors" section. +- **Assign each PR to one or more packages** using the identification rules in the Package Registry table. A PR may be relevant to multiple packages. PRs not matching any non-core package belong to `Microsoft.Data.SqlClient`. + +### 3. Enrich Feature Sections with Issue Context + +For significant features or bug fixes that reference a GitHub issue: + +1. Read the referenced issue to understand the original request, use cases, and community context. +2. Use this information to write richer *Who Benefits* and *Impact* sections — don't just restate the PR description. +3. Include the issue link alongside PR links (e.g., `([#1108](https://github.com/dotnet/SqlClient/issues/1108), [#3680](https://github.com/dotnet/SqlClient/pull/3680))`). + +### 4. Verify API Names from Source Code + +When release notes reference a public API (property, method, class): + +1. Search the source code (`src/Microsoft.Data.SqlClient/src/`) to confirm the exact name, type, and signature. +2. Check XML doc comments for usage warnings or caveats that should be included in the *Impact* section. +3. Never guess API names from PR titles — always verify against the actual code. + +### 5. Generate Release Notes for Each Package + +For each package that has relevant PRs in the milestone: + +1. **Determine the package version** using the Version Source from the lookup table above. Read the actual props/project file to find the version. + +2. **Create the release notes file** at the path shown in the Package Registry table: `/.md`. + - Use the template from [release-notes/template/release-notes-template.md](release-notes/template/release-notes-template.md). + - Fill in the template following the instructions in each section. + - Only include sections (Added, Changed, Fixed, Removed) that have entries. + - Look up dependencies using the Dependency Sources from the lookup table above. Resolve concrete versions from [Directory.Packages.props](Directory.Packages.props). + - List dependencies per target framework. Use the project file's `` to determine which frameworks to list. + - Omit the Contributors section for packages with no public contributors. + +3. **Create or update the version README** at `/README.md`. Follow the existing format — see [release-notes/add-ons/AzureKeyVaultProvider/6.1/README.md](release-notes/add-ons/AzureKeyVaultProvider/6.1/README.md) for reference: + + ```markdown + # Releases + + The following `` + releases have been shipped: + + | Release Date | Description | Notes | + | :-- | :-- | :--: | + | | | [Release Notes](.md) | + ``` + +4. **Skip packages without changes.** If a package has no relevant PRs in the milestone, do not create release notes for it. Report which packages had changes and which did not. + +### 6. Update CHANGELOG.md + +- Add a new entry at the top of the list (under the Note) in [CHANGELOG.md](CHANGELOG.md). +- Include all the text from the Added, Fixed, Changed, Removed, etc. sections from the core `Microsoft.Data.SqlClient` release notes. +- If other packages also changed, include a brief summary line for each (e.g., "Released Microsoft.Data.SqlClient.Extensions.Azure 1.0.0-preview1. See [release notes](...)."). The detailed notes live in the per-package release notes files. + +### 7. Update Top-Level Release Notes README + +- Update [release-notes/README.md](release-notes/README.md): + - Add the new release to the appropriate package section. + - If a section for the package doesn't yet exist, add one following the existing pattern (see the `AzureKeyVaultProvider` and `Microsoft.SqlServer.Server` sections for reference). + - If the section already exists, add the new version link to its Release Information list. + +## Notes + +- Packages may ship as preview or stable independently. Use the actual version from the project/spec files. +- The directory structure mirrors existing conventions: `add-ons/AzureKeyVaultProvider/` for AKV, `MSqlServerServer/` for SqlServer, and `Extensions//` for the new extension packages. +- When referencing code samples, link to files in the `doc/samples/` directory if a relevant sample exists. diff --git a/.github/skills/fetch-milestone-prs/SKILL.md b/.github/skills/fetch-milestone-prs/SKILL.md new file mode 100644 index 0000000000..d5c18f6010 --- /dev/null +++ b/.github/skills/fetch-milestone-prs/SKILL.md @@ -0,0 +1,135 @@ +--- +name: fetch-milestone-prs +description: Fetches all merged pull requests for a given GitHub milestone and saves their metadata as individual JSON files. Use this skill when asked to retrieve PRs for a milestone, gather PR data for release notes, or collect milestone PR metadata. +--- + +This skill retrieves all merged pull requests associated with a GitHub milestone and saves each PR's metadata as a separate JSON file for downstream processing (e.g., release notes generation, changelog creation). + +## When to Use This Skill + +- User asks to fetch or retrieve PRs for a milestone +- User wants to gather PR data before generating release notes +- User needs milestone PR metadata for analysis or categorization +- User mentions a milestone name and wants to see what PRs were included +- As a prerequisite step before invoking the `release-notes` prompt + +## Prerequisites + +- The `gh` CLI must be installed and authenticated (`gh auth login`) +- Python 3.8+ must be available + +## Instructions + +1. **Identify the milestone name** from the user's request. This is typically a version string like `7.0.0-preview4`, `6.1.5`, etc. + +2. **Identify the repository** (optional). Defaults to `dotnet/SqlClient`. If the user specifies a different repo, pass it via `--repo`. + +3. **Run the fetch script** located in this skill's directory: + + ```bash + python .github/skills/fetch-milestone-prs/fetch-milestone-prs.py [--repo OWNER/REPO] [--output-dir DIR] + ``` + + Examples: + ```bash + # Default: outputs to .milestone-prs// + python .github/skills/fetch-milestone-prs/fetch-milestone-prs.py 7.0.0-preview4 + + # Custom output directory + python .github/skills/fetch-milestone-prs/fetch-milestone-prs.py 7.0.0-preview4 --output-dir ./my-prs + + # Different repo + python .github/skills/fetch-milestone-prs/fetch-milestone-prs.py 7.0.0-preview4 --repo dotnet/efcore + ``` + +4. **Verify the output** by checking the generated `_index.json` file in the output directory. It contains a summary of all fetched PRs. + +5. **Report results** to the user: + - Total merged PRs found + - Total skipped (closed but not merged) + - Output directory path + - Mention that each PR is in a separate `.json` file and the index is at `_index.json` + +## Output Format + +### Directory structure +``` +.milestone-prs// +├── _index.json # Summary index of all PRs +├── 1234.json # Individual PR metadata +├── 1235.json +└── ... +``` + +### Individual PR file (`.json`) +Each file contains: +```json +{ + "number": 1234, + "title": "PR title", + "author": "github-username", + "author_association": "MEMBER", + "labels": ["label1", "label2"], + "assignees": ["user1"], + "state": "closed", + "merged": true, + "merged_at": "2026-01-15T12:00:00Z", + "merge_commit_sha": "abc123...", + "created_at": "2026-01-10T10:00:00Z", + "closed_at": "2026-01-15T12:00:00Z", + "html_url": "https://github.com/dotnet/SqlClient/pull/1234", + "body": "Full PR description markdown...", + "comments_count": 5, + "is_merged_pr": true, + "has_public_api_label": false, + "has_engineering_label": false, + "has_test_label": true +} +``` + +### Index file (`_index.json`) +```json +{ + "milestone": "7.0.0-preview4", + "repo": "dotnet/SqlClient", + "total_closed": 76, + "total_merged": 74, + "total_skipped": 2, + "prs": [ + { + "number": 1234, + "title": "PR title", + "author": "github-username", + "labels": ["label1"], + "merged_at": "2026-01-15T12:00:00Z", + "has_public_api_label": false, + "has_engineering_label": false, + "has_test_label": true + } + ] +} +``` + +## Derived Fields + +The script computes these boolean flags for easy categorization: + +| Field | Logic | +|-------|-------| +| `has_public_api_label` | Any label contains "Public API :new:" | +| `has_engineering_label` | Any label contains "Engineering" | +| `has_test_label` | Any label contains "Test" | + +## Error Handling + +- If the milestone is not found, the script prints available milestones and exits. Ask the user to verify the milestone name. +- If `gh` is not authenticated, the script will fail with an auth error. Instruct the user to run `gh auth login`. +- If a specific PR detail fetch fails, the script exits. This is rare but can happen with API rate limits — suggest waiting and retrying. +- On Windows, if encoding errors occur, the script uses `errors="replace"` to handle non-UTF-8 characters gracefully. + +## Using Output with Other Workflows + +The output files are designed to be consumed by: +- The `release-notes` prompt — tag the output directory (e.g., `@.milestone-prs/7.0.0-preview4/*`) when invoking it +- Manual analysis — read `_index.json` for a quick overview, individual files for PR details +- Any script or agent that needs structured PR metadata diff --git a/.github/skills/fetch-milestone-prs/fetch-milestone-prs.py b/.github/skills/fetch-milestone-prs/fetch-milestone-prs.py new file mode 100644 index 0000000000..d61fa8d574 --- /dev/null +++ b/.github/skills/fetch-milestone-prs/fetch-milestone-prs.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +""" +Fetch all merged PR metadata for a given GitHub milestone. + +Usage: + python fetch-milestone-prs.py [--repo OWNER/REPO] [--output-dir DIR] + +Examples: + python fetch-milestone-prs.py 7.0.0-preview4 + python fetch-milestone-prs.py 7.0.0-preview4 --output-dir ./pr-data + python fetch-milestone-prs.py 7.0.0-preview4 --repo dotnet/SqlClient + +Requires: + - gh CLI (https://cli.github.com/) authenticated via `gh auth login` + - OR set GH_TOKEN environment variable (or GITHUB_TOKEN when running in GitHub Actions) + +Each PR is saved as a separate JSON file: /.json +A summary index is saved as: /_index.json +""" + +import argparse +import json +import os +import subprocess +import sys +from pathlib import Path + + +def run_gh_api(endpoint, method="GET"): + """Call the GitHub REST API via `gh api`.""" + cmd = ["gh", "api", "--method", method, endpoint] + result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") + if result.returncode != 0: + print(f"Error calling gh api {endpoint}:", file=sys.stderr) + print(result.stderr, file=sys.stderr) + sys.exit(1) + return json.loads(result.stdout) + + +def run_gh_api_paginated(endpoint): + """Call the GitHub REST API with pagination via `gh api --paginate`. + + `gh api --paginate` prints one JSON array per page. For multi-page + results this produces concatenated arrays (e.g. `[...][...]`) which + is not valid JSON. We parse each line individually and merge them. + """ + cmd = ["gh", "api", "--paginate", endpoint] + result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") + if result.returncode != 0: + print(f"Error calling gh api {endpoint}:", file=sys.stderr) + print(result.stderr, file=sys.stderr) + sys.exit(1) + items = [] + for line in result.stdout.splitlines(): + line = line.strip() + if not line: + continue + try: + page = json.loads(line) + except json.JSONDecodeError as exc: + print(f"Failed to parse paginated gh api output for {endpoint}: {exc}", file=sys.stderr) + sys.exit(1) + if isinstance(page, list): + items.extend(page) + else: + items.append(page) + return items + + +def find_milestone_number(repo, milestone_title): + """Look up the milestone number by its title.""" + milestones = run_gh_api_paginated( + f"/repos/{repo}/milestones?state=all&per_page=100" + ) + for ms in milestones: + if ms["title"] == milestone_title: + return ms["number"] + print(f"Milestone '{milestone_title}' not found.", file=sys.stderr) + print("Available milestones:", file=sys.stderr) + for ms in sorted(milestones, key=lambda m: m["title"]): + print(f" - {ms['title']} (#{ms['number']}, {ms['state']})", file=sys.stderr) + sys.exit(1) + + +def fetch_milestone_prs(repo, milestone_number): + """Fetch all closed (merged) PRs for the milestone.""" + # GitHub Issues API returns both issues and PRs; filter to PRs with pull_request key + issues = run_gh_api_paginated( + f"/repos/{repo}/issues?milestone={milestone_number}&state=closed&per_page=100" + ) + prs = [i for i in issues if "pull_request" in i] + return prs + + +def fetch_pr_details(repo, pr_number): + """Fetch full PR details including merge info.""" + return run_gh_api(f"/repos/{repo}/pulls/{pr_number}") + + +def extract_pr_metadata(issue_data, pr_detail): + """Extract the fields we care about into a clean structure.""" + labels = [l["name"] for l in issue_data.get("labels", [])] + assignees = [a["login"] for a in issue_data.get("assignees", [])] + + merged = pr_detail.get("merged", False) + merged_at = pr_detail.get("merged_at") + merge_commit = pr_detail.get("merge_commit_sha") + + return { + "number": issue_data["number"], + "title": issue_data["title"], + "author": issue_data["user"]["login"], + "author_association": issue_data.get("author_association", ""), + "labels": labels, + "assignees": assignees, + "state": issue_data["state"], + "merged": merged, + "merged_at": merged_at, + "merge_commit_sha": merge_commit, + "created_at": issue_data["created_at"], + "closed_at": issue_data["closed_at"], + "html_url": issue_data["html_url"], + "body": issue_data.get("body", ""), + "comments_count": issue_data.get("comments", 0), + # Derived fields for release notes categorization + "is_merged_pr": merged, + "has_public_api_label": "Public API :new:" in labels, + "has_engineering_label": any("Engineering" in l for l in labels), + "has_test_label": any("Test" in l for l in labels), + } + + +def main(): + parser = argparse.ArgumentParser( + description="Fetch all merged PR metadata for a GitHub milestone." + ) + parser.add_argument("milestone", help="Milestone title (e.g., '7.0.0-preview4')") + parser.add_argument( + "--repo", + default="dotnet/SqlClient", + help="GitHub repo in OWNER/REPO format (default: dotnet/SqlClient)", + ) + parser.add_argument( + "--output-dir", + default=None, + help="Output directory (default: .milestone-prs/)", + ) + args = parser.parse_args() + + output_dir = args.output_dir or os.path.join( + ".milestone-prs", args.milestone + ) + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + + print(f"Looking up milestone '{args.milestone}' in {args.repo}...") + ms_number = find_milestone_number(args.repo, args.milestone) + print(f" Found milestone #{ms_number}") + + print(f"Fetching PRs for milestone #{ms_number}...") + issues = fetch_milestone_prs(args.repo, ms_number) + print(f" Found {len(issues)} closed PRs/issues") + + index = [] + merged_count = 0 + skipped_count = 0 + + for i, issue_data in enumerate(issues): + pr_number = issue_data["number"] + print( + f" [{i+1}/{len(issues)}] Fetching PR #{pr_number}: {issue_data['title'][:60]}..." + ) + + pr_detail = fetch_pr_details(args.repo, pr_number) + metadata = extract_pr_metadata(issue_data, pr_detail) + + if not metadata["merged"]: + print(f" Skipped (closed but not merged)") + skipped_count += 1 + continue + + merged_count += 1 + + # Write individual PR file + pr_file = output_path / f"{pr_number}.json" + with open(pr_file, "w", encoding="utf-8") as f: + json.dump(metadata, f, indent=2, ensure_ascii=False) + + # Add to index + index.append( + { + "number": metadata["number"], + "title": metadata["title"], + "author": metadata["author"], + "labels": metadata["labels"], + "merged_at": metadata["merged_at"], + "has_public_api_label": metadata["has_public_api_label"], + "has_engineering_label": metadata["has_engineering_label"], + "has_test_label": metadata["has_test_label"], + } + ) + + # Sort index by PR number + index.sort(key=lambda x: x["number"]) + + # Write index file + index_file = output_path / "_index.json" + with open(index_file, "w", encoding="utf-8") as f: + json.dump( + { + "milestone": args.milestone, + "repo": args.repo, + "total_closed": len(issues), + "total_merged": merged_count, + "total_skipped": skipped_count, + "prs": index, + }, + f, + indent=2, + ensure_ascii=False, + ) + + print(f"\nDone! {merged_count} merged PRs saved to {output_path}/") + print(f" Skipped {skipped_count} closed-but-not-merged items") + print(f" Index: {index_file}") + + +if __name__ == "__main__": + main() diff --git a/.gitignore b/.gitignore index b5dc09c716..d2a25b6336 100644 --- a/.gitignore +++ b/.gitignore @@ -363,3 +363,6 @@ MigrationBackup/ # Config Json file **/config.json + +# Generated Milestone PR metadata files +.milestone-prs/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c5bc319ed8..a78bb55eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,90 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) > **Note:** Releases are sorted in reverse chronological order (newest first). +## [Preview Release 7.0.0-preview4.26064.3] - 2026-03-05 + +This update brings the below changes over the previous preview release: + +Also released as part of this milestone: +- Released Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3. See [release notes](release-notes/Extensions/Abstractions/1.0/1.0.0-preview1.md). +- Released Microsoft.Data.SqlClient.Extensions.Azure 1.0.0-preview1.26064.3. See [release notes](release-notes/Extensions/Azure/1.0/1.0.0-preview1.md). +- Released Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3. See [release notes](release-notes/Extensions/Logging/1.0/1.0.0-preview1.md). +- Released Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 7.0.0-preview1.26064.3. See [release notes](release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview1.md). + +### Changed + +- **Breaking:** Removed Azure dependencies from the core package. Azure AD / Entra authentication (`ActiveDirectoryAuthenticationProvider` and related types) has been extracted into a new `Microsoft.Data.SqlClient.Extensions.Azure` package. The core `Microsoft.Data.SqlClient` package no longer depends on `Azure.Core`, `Azure.Identity`, or their transitive dependencies. Applications using Azure AD authentication must now install `Microsoft.Data.SqlClient.Extensions.Azure` separately. + ([#1108](https://github.com/dotnet/SqlClient/issues/1108), + [#3680](https://github.com/dotnet/SqlClient/pull/3680), + [#3902](https://github.com/dotnet/SqlClient/pull/3902), + [#3904](https://github.com/dotnet/SqlClient/pull/3904), + [#3908](https://github.com/dotnet/SqlClient/pull/3908), + [#3917](https://github.com/dotnet/SqlClient/pull/3917), + [#3982](https://github.com/dotnet/SqlClient/pull/3982), + [#3978](https://github.com/dotnet/SqlClient/pull/3978), + [#3986](https://github.com/dotnet/SqlClient/pull/3986)) + +- Introduced `Microsoft.Data.SqlClient.Extensions.Abstractions` and `Microsoft.Data.SqlClient.Extensions.Logging` packages to support the extensions model. + ([#3626](https://github.com/dotnet/SqlClient/pull/3626), + [#3628](https://github.com/dotnet/SqlClient/pull/3628), + [#3967](https://github.com/dotnet/SqlClient/pull/3967)) + +- Updated UserAgent feature to use a pipe-delimited format. + ([#3826](https://github.com/dotnet/SqlClient/pull/3826)) + +- Minor improvements to Managed SNI tracing. + ([#3859](https://github.com/dotnet/SqlClient/pull/3859)) + +- Reverted public visibility of internal interop enums that were accidentally made public during the project merge. + ([#3900](https://github.com/dotnet/SqlClient/pull/3900)) + +- Performance improvements: + ([#3791](https://github.com/dotnet/SqlClient/pull/3791), + [#3772](https://github.com/dotnet/SqlClient/pull/3772)) + +- Codebase merge and cleanup: + ([#3773](https://github.com/dotnet/SqlClient/pull/3773), + [#3818](https://github.com/dotnet/SqlClient/pull/3818), + [#3836](https://github.com/dotnet/SqlClient/pull/3836), + [#3810](https://github.com/dotnet/SqlClient/pull/3810), + [#3837](https://github.com/dotnet/SqlClient/pull/3837), + [#3963](https://github.com/dotnet/SqlClient/pull/3963)) + +### Added + +- Added `SspiContextProvider` abstract class and `SqlConnection.SspiContextProvider` property, enabling custom SSPI authentication for scenarios like cross-domain Kerberos negotiation and NTLM username/password authentication. + ([#2253](https://github.com/dotnet/SqlClient/issues/2253), + [#2494](https://github.com/dotnet/SqlClient/pull/2494)) + +- Added `SqlConfigurableRetryFactory.BaselineTransientErrors` static property exposing the default transient error codes list as a `ReadOnlyCollection`. + ([#3903](https://github.com/dotnet/SqlClient/pull/3903)) + +- Added new app context switch `Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault` to set `MultiSubnetFailover=true` by default in connection strings. + ([#3841](https://github.com/dotnet/SqlClient/pull/3841)) + +- Added support for enhanced routing, a TDS feature extension that allows the server to redirect connections to a specific server and database, enabling Azure SQL Hyperscale read replica load balancing. + ([#3641](https://github.com/dotnet/SqlClient/issues/3641), + [#3969](https://github.com/dotnet/SqlClient/pull/3969), + [#3970](https://github.com/dotnet/SqlClient/pull/3970), + [#3973](https://github.com/dotnet/SqlClient/pull/3973)) + +### Fixed + +- Fixed `ExecuteScalar` to propagate errors when the server sends data followed by an error token. + ([#3912](https://github.com/dotnet/SqlClient/pull/3912)) + +- Fixed `NullReferenceException` in `SqlDataAdapter` when processing batch scenarios where certain SQL RPC calls may not include system parameters. + ([#3857](https://github.com/dotnet/SqlClient/pull/3857)) + +- Fixed reading of multiple app context switches from a single `AppContextSwitchOverrides` configuration field. + ([#3960](https://github.com/dotnet/SqlClient/pull/3960)) + +- Fixed a connection performance regression where SPN generation was triggered for non-integrated authentication modes (e.g., SQL authentication) on the native SNI path. + ([#3929](https://github.com/dotnet/SqlClient/pull/3929)) + +- Fixed an edge case in `TdsParserStateObject.TryReadPlpBytes` where zero-length reads returned `null` instead of an empty array. + ([#3872](https://github.com/dotnet/SqlClient/pull/3872)) + ## [Stable release 6.0.5] - 2026-01-15 This update brings the below changes over the previous stable release: diff --git a/release-notes/7.0/7.0.0-preview4.md b/release-notes/7.0/7.0.0-preview4.md new file mode 100644 index 0000000000..62d1d39157 --- /dev/null +++ b/release-notes/7.0/7.0.0-preview4.md @@ -0,0 +1,224 @@ +# Release Notes + +## Preview Release 7.0.0-preview4.26064.3 - 2026-03-05 + +### Changed + +#### Azure Dependencies Removed from Core Package + +*What Changed:* + +- The core `Microsoft.Data.SqlClient` package no longer depends on `Azure.Core`, `Azure.Identity`, or their transitive dependencies (e.g., `Microsoft.Identity.Client`, `Microsoft.Web.WebView2`). Azure Active Directory / Entra authentication functionality (`ActiveDirectoryAuthenticationProvider` and related types) has been extracted into a new `Microsoft.Data.SqlClient.Extensions.Azure` package that can be installed separately when needed. + ([#1108](https://github.com/dotnet/SqlClient/issues/1108), + [#3680](https://github.com/dotnet/SqlClient/pull/3680), + [#3902](https://github.com/dotnet/SqlClient/pull/3902), + [#3904](https://github.com/dotnet/SqlClient/pull/3904), + [#3908](https://github.com/dotnet/SqlClient/pull/3908), + [#3917](https://github.com/dotnet/SqlClient/pull/3917), + [#3982](https://github.com/dotnet/SqlClient/pull/3982), + [#3978](https://github.com/dotnet/SqlClient/pull/3978), + [#3986](https://github.com/dotnet/SqlClient/pull/3986)) +- To support this separation, two additional packages were introduced: `Microsoft.Data.SqlClient.Extensions.Abstractions` (shared types between the core driver and extensions) and `Microsoft.Data.SqlClient.Extensions.Logging` (shared ETW tracing infrastructure). + ([#3626](https://github.com/dotnet/SqlClient/pull/3626), + [#3628](https://github.com/dotnet/SqlClient/pull/3628), + [#3967](https://github.com/dotnet/SqlClient/pull/3967)) + +*Who Benefits:* + +- All users benefit from a significantly lighter core package. Previously, the Azure dependency chain pulled in numerous assemblies (including `Azure.Core`, `Azure.Identity`, `Microsoft.Identity.Client`, and `Microsoft.Web.WebView2`) even for applications that only needed basic SQL Server connectivity. This was the most upvoted open issue in the repository ([#1108](https://github.com/dotnet/SqlClient/issues/1108)). +- Users who do not use Azure AD authentication no longer carry Azure-related assemblies in their build output, reducing deployment size and eliminating confusion about unexpected dependencies. +- Users who do use Azure AD authentication can now manage Azure dependency versions independently from the core driver. + +*Impact:* + +- Applications using Azure AD authentication (e.g., `ActiveDirectoryPassword`, `ActiveDirectoryInteractive`, `ActiveDirectoryDefault`, etc.) must now install the `Microsoft.Data.SqlClient.Extensions.Azure` NuGet package separately. No code changes are required beyond adding the package reference. + +### Added + +#### Expose SSPI Context Provider as Public API + +*What Changed:* + +- Added the `SspiContextProvider` abstract class and a public `SspiContextProvider` property on `SqlConnection`, allowing applications to supply a custom SSPI context provider for integrated authentication. This enables custom Kerberos ticket negotiation and NTLM username/password authentication scenarios that the driver does not natively support. + ([#2253](https://github.com/dotnet/SqlClient/issues/2253), + [#2494](https://github.com/dotnet/SqlClient/pull/2494)) + +*Who Benefits:* + +- Users authenticating across untrusted domains, non-domain-joined machines, or cross-platform environments where configuring integrated authentication on the client is difficult or impossible. +- Users running in containers who need manual Kerberos negotiation without deploying sidecars or external ticket-refresh mechanisms. +- Users who need NTLM username/password authentication to SQL Server, which the driver does not provide natively. + +*Impact:* + +- Applications can set a custom `SspiContextProvider` on `SqlConnection` before opening the connection. The provider handles the authentication token exchange during integrated authentication. This is an additive API — existing authentication behavior is unchanged when no custom provider is set. See [SspiContextProvider_CustomProvider.cs](../../doc/samples/SspiContextProvider_CustomProvider.cs) for a sample implementation. +- **Note:** The `SspiContextProvider` is a part of the connection pool key. Care should be taken when using this property to ensure the implementation returns a stable identity per resource. + +#### Expose Default Transient Error List + +*What Changed:* + +- Exposed the default transient error codes list via the new `SqlConfigurableRetryFactory.BaselineTransientErrors` static property (returns a `ReadOnlyCollection`), making it easier to extend the set of transient errors without copy-pasting from the repository source. + ([#3903](https://github.com/dotnet/SqlClient/pull/3903)) + +*Who Benefits:* + +- Developers implementing custom retry logic who want to extend the built-in transient error list rather than replacing it. + +*Impact:* + +- Applications can now access the default transient error codes and append their own application-specific error codes for retry handling. + +#### Introduce App Context Switch for MultiSubnetFailover Default + +*What Changed:* + +- Added a new app context switch `Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault` to set `MultiSubnetFailover=true` by default in connection strings. + ([#3841](https://github.com/dotnet/SqlClient/pull/3841)) + +*Who Benefits:* + +- Applications that need MultiSubnetFailover enabled globally without modifying individual connection strings. + +*Impact:* + +- Applications can enable MultiSubnetFailover globally using one of the following methods: + +```c# +// In application code +AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault", true); +``` + +```xml + + + + +``` + +#### Enhanced Routing Support + +*What Changed:* + +- Added support for enhanced routing, a TDS feature that allows the server to redirect connections to a specific server *and* database. + ([#3641](https://github.com/dotnet/SqlClient/issues/3641), + [#3969](https://github.com/dotnet/SqlClient/pull/3969), + [#3970](https://github.com/dotnet/SqlClient/pull/3970), + [#3973](https://github.com/dotnet/SqlClient/pull/3973)) + +*Who Benefits:* + +- Users connecting to Azure SQL Hyperscale environments that use named read replicas and gateway-based load balancing. + +*Impact:* + +- Enhanced routing is negotiated automatically during login when the server supports it. No application code changes are required. This feature is separate from `ApplicationIntent=ReadOnly` and does not require read-only intent to be set. + +### Fixed + +- Fixed `ExecuteScalar` to propagate errors when the server sends data followed by an error token. + ([#3912](https://github.com/dotnet/SqlClient/pull/3912)) + +- Fixed `NullReferenceException` in `SqlDataAdapter` when processing batch scenarios where certain SQL RPC calls may not include system parameters. + ([#3857](https://github.com/dotnet/SqlClient/pull/3857)) + +- Fixed reading of multiple app context switches from a single `AppContextSwitchOverrides` configuration field. + ([#3960](https://github.com/dotnet/SqlClient/pull/3960)) + +- Fixed a connection performance regression where SPN generation was triggered for non-integrated authentication modes (e.g., SQL authentication) on the native SNI path. + ([#3929](https://github.com/dotnet/SqlClient/pull/3929)) + +- Fixed an edge case in `TdsParserStateObject.TryReadPlpBytes` where zero-length reads returned `null` instead of an empty array. + ([#3872](https://github.com/dotnet/SqlClient/pull/3872)) + +### Other changes + +- Updated UserAgent feature to use a pipe-delimited format, replacing the previous JSON format. + ([#3826](https://github.com/dotnet/SqlClient/pull/3826)) + +- Minor improvements to Managed SNI tracing to capture continuation events and errors. + ([#3859](https://github.com/dotnet/SqlClient/pull/3859)) + +- Reverted public visibility of internal interop enums (`IoControlCodeAccess` and `IoControlTransferType`) that were accidentally made public during the project merge. + ([#3900](https://github.com/dotnet/SqlClient/pull/3900)) + +- Performance improvements: + ([#3791](https://github.com/dotnet/SqlClient/pull/3791), + [#3772](https://github.com/dotnet/SqlClient/pull/3772)) + +## Contributors + +We thank the following public contributors. Their efforts toward this project are very much appreciated. + +- [edwardneal](https://github.com/edwardneal) +- [ErikEJ](https://github.com/ErikEJ) +- [MatthiasHuygelen](https://github.com/MatthiasHuygelen) +- [tetolv](https://github.com/tetolv) +- [twsouthwick](https://github.com/twsouthwick) +- [Wraith2](https://github.com/Wraith2) + +## Target Platform Support + +- .NET Framework 4.6.2+ (Windows x86, Windows x64, Windows ARM64) +- .NET 8.0+ (Windows x86, Windows x64, Windows ARM, Windows ARM64, Linux, macOS) + +### Dependencies + +#### .NET 9.0 + +- Microsoft.Bcl.Cryptography 9.0.9 +- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.SNI.runtime 6.0.2 +- Microsoft.Extensions.Caching.Memory 9.0.9 +- Microsoft.IdentityModel.JsonWebTokens 8.14.0 +- Microsoft.IdentityModel.Protocols.OpenIdConnect 8.14.0 +- Microsoft.SqlServer.Server 1.0.0 +- System.Configuration.ConfigurationManager 9.0.9 +- System.Security.Cryptography.Pkcs 9.0.9 + +#### .NET 8.0 + +- Microsoft.Bcl.Cryptography 8.0.0 +- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.SNI.runtime 6.0.2 +- Microsoft.Extensions.Caching.Memory 8.0.1 +- Microsoft.IdentityModel.JsonWebTokens 8.14.0 +- Microsoft.IdentityModel.Protocols.OpenIdConnect 8.14.0 +- Microsoft.SqlServer.Server 1.0.0 +- System.Configuration.ConfigurationManager 8.0.1 +- System.Security.Cryptography.Pkcs 8.0.1 + +#### .NET Standard 2.0 + +- Microsoft.Bcl.Cryptography 8.0.0 +- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.SNI.runtime 6.0.2 +- Microsoft.Extensions.Caching.Memory 8.0.1 +- Microsoft.IdentityModel.JsonWebTokens 8.14.0 +- Microsoft.IdentityModel.Protocols.OpenIdConnect 8.14.0 +- Microsoft.SqlServer.Server 1.0.0 +- System.Configuration.ConfigurationManager 8.0.1 +- System.Security.Cryptography.Pkcs 8.0.1 +- System.Text.Json 8.0.6 +- System.Threading.Channels 8.0.0 + +#### .NET Framework 4.6.2 + +- Microsoft.Bcl.Cryptography 8.0.0 +- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.SNI 6.0.2 +- Microsoft.Extensions.Caching.Memory 8.0.1 +- Microsoft.IdentityModel.JsonWebTokens 8.14.0 +- Microsoft.IdentityModel.Protocols.OpenIdConnect 8.14.0 +- System.Buffers 4.6.1 +- System.Diagnostics.DiagnosticSource 8.0.1 +- System.Memory 4.6.3 +- System.Runtime.InteropServices.RuntimeInformation 4.3.0 +- System.Security.Cryptography.Pkcs 8.0.1 +- System.Text.Json 8.0.6 +- System.Threading.Channels 8.0.0 +- System.ValueTuple 4.6.1 diff --git a/release-notes/7.0/README.md b/release-notes/7.0/README.md index 1aad450b03..e8bfcc25f3 100644 --- a/release-notes/7.0/README.md +++ b/release-notes/7.0/README.md @@ -4,6 +4,7 @@ The following Microsoft.Data.SqlClient 7.0 releases have been shipped: | Release Date | Version | Notes | | :-- | :-- | :--: | +| 2026-03-05 | 7.0.0-preview4.26064.3 | [Release Notes](7.0.0-preview4.md) | | 2025-12-08 | 7.0.0-preview3.25342.7 | [Release Notes](7.0.0-preview3.md) | | 2025-10-16 | 7.0.0-preview2.25289.6 | [Release Notes](7.0.0-preview2.md) | | 2025-09-12 | 7.0.0-preview1.25257.1 | [Release Notes](7.0.0-preview1.md) | diff --git a/release-notes/Extensions/Abstractions/1.0/1.0.0-preview1.md b/release-notes/Extensions/Abstractions/1.0/1.0.0-preview1.md new file mode 100644 index 0000000000..3370ad7c05 --- /dev/null +++ b/release-notes/Extensions/Abstractions/1.0/1.0.0-preview1.md @@ -0,0 +1,20 @@ +# Release Notes + +## Preview Release 1.0.0-preview1.26064.3 - 2026-03-05 + +### Added + +- Initial release of `Microsoft.Data.SqlClient.Extensions.Abstractions`, providing shared types and interfaces between the core `Microsoft.Data.SqlClient` driver and extension packages (e.g., authentication provider abstractions). + ([#3626](https://github.com/dotnet/SqlClient/pull/3626), + [#3628](https://github.com/dotnet/SqlClient/pull/3628), + [#3967](https://github.com/dotnet/SqlClient/pull/3967)) + +## Target Platform Support + +- .NET Standard 2.0 + +### Dependencies + +#### .NET Standard 2.0 + +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 diff --git a/release-notes/Extensions/Abstractions/1.0/README.md b/release-notes/Extensions/Abstractions/1.0/README.md new file mode 100644 index 0000000000..2e91111742 --- /dev/null +++ b/release-notes/Extensions/Abstractions/1.0/README.md @@ -0,0 +1,8 @@ +# Microsoft.Data.SqlClient.Extensions.Abstractions 1.0 Releases + +The following `Microsoft.Data.SqlClient.Extensions.Abstractions` +1.0 releases have been shipped: + +| Release Date | Description | Notes | +| :-- | :-- | :--: | +| 2026-03-05 | 1.0.0-preview1.26064.3 | [Release Notes](1.0.0-preview1.md) | diff --git a/release-notes/Extensions/Azure/1.0/1.0.0-preview1.md b/release-notes/Extensions/Azure/1.0/1.0.0-preview1.md new file mode 100644 index 0000000000..4876263b8b --- /dev/null +++ b/release-notes/Extensions/Azure/1.0/1.0.0-preview1.md @@ -0,0 +1,48 @@ +# Release Notes + +## Preview Release 1.0.0-preview1.26064.3 - 2026-03-05 + +### Added + +- Initial release of `Microsoft.Data.SqlClient.Extensions.Azure`, providing Azure Active Directory / Entra authentication support for `Microsoft.Data.SqlClient`. This package contains `ActiveDirectoryAuthenticationProvider` and related types that were previously embedded in the core `Microsoft.Data.SqlClient` driver package. + ([#3680](https://github.com/dotnet/SqlClient/pull/3680), + [#3902](https://github.com/dotnet/SqlClient/pull/3902), + [#3904](https://github.com/dotnet/SqlClient/pull/3904), + [#3908](https://github.com/dotnet/SqlClient/pull/3908), + [#3917](https://github.com/dotnet/SqlClient/pull/3917), + [#3982](https://github.com/dotnet/SqlClient/pull/3982), + [#3978](https://github.com/dotnet/SqlClient/pull/3978)) + +*Who Benefits:* + +- Users who need Azure AD authentication (e.g., `ActiveDirectoryPassword`, `ActiveDirectoryInteractive`, `ActiveDirectoryDefault`, `ActiveDirectoryManagedIdentity`, `ActiveDirectoryServicePrincipal`) with `Microsoft.Data.SqlClient` 7.0+. +- Users who want to manage the `Azure.Identity` and `Azure.Core` dependency versions independently from the core driver. + +*Impact:* + +- Applications using Azure AD authentication with `Microsoft.Data.SqlClient` 7.0+ must install this package. No code changes are required beyond adding the NuGet package reference. + +## Target Platform Support + +- .NET Standard 2.0 +- .NET Framework 4.6.2 (Windows x86, Windows x64, Windows ARM64) + +### Dependencies + +#### .NET Standard 2.0 + +- Azure.Core 1.49.0 +- Azure.Identity 1.17.0 +- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Extensions.Caching.Memory 8.0.1 +- Microsoft.Identity.Client 4.78.0 + +#### .NET Framework 4.6.2 + +- Azure.Core 1.49.0 +- Azure.Identity 1.17.0 +- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Extensions.Caching.Memory 8.0.1 +- Microsoft.Identity.Client 4.78.0 diff --git a/release-notes/Extensions/Azure/1.0/README.md b/release-notes/Extensions/Azure/1.0/README.md new file mode 100644 index 0000000000..19dc060723 --- /dev/null +++ b/release-notes/Extensions/Azure/1.0/README.md @@ -0,0 +1,8 @@ +# Microsoft.Data.SqlClient.Extensions.Azure 1.0 Releases + +The following `Microsoft.Data.SqlClient.Extensions.Azure` +1.0 releases have been shipped: + +| Release Date | Description | Notes | +| :-- | :-- | :--: | +| 2026-03-05 | 1.0.0-preview1.26064.3 | [Release Notes](1.0.0-preview1.md) | diff --git a/release-notes/Extensions/Logging/1.0/1.0.0-preview1.md b/release-notes/Extensions/Logging/1.0/1.0.0-preview1.md new file mode 100644 index 0000000000..e97fd8a78b --- /dev/null +++ b/release-notes/Extensions/Logging/1.0/1.0.0-preview1.md @@ -0,0 +1,20 @@ +# Release Notes + +## Preview Release 1.0.0-preview1.26064.3 - 2026-03-05 + +### Added + +- Initial release of `Microsoft.Data.SqlClient.Extensions.Logging`, providing shared logging infrastructure for use by `Microsoft.Data.SqlClient` and its extension packages. + ([#3626](https://github.com/dotnet/SqlClient/pull/3626), + [#3628](https://github.com/dotnet/SqlClient/pull/3628), + [#3967](https://github.com/dotnet/SqlClient/pull/3967)) + +## Target Platform Support + +- .NET Standard 2.0 + +### Dependencies + +#### .NET Standard 2.0 + +None. diff --git a/release-notes/Extensions/Logging/1.0/README.md b/release-notes/Extensions/Logging/1.0/README.md new file mode 100644 index 0000000000..0d4860dc5a --- /dev/null +++ b/release-notes/Extensions/Logging/1.0/README.md @@ -0,0 +1,8 @@ +# Microsoft.Data.SqlClient.Extensions.Logging 1.0 Releases + +The following `Microsoft.Data.SqlClient.Extensions.Logging` +1.0 releases have been shipped: + +| Release Date | Description | Notes | +| :-- | :-- | :--: | +| 2026-03-05 | 1.0.0-preview1.26064.3 | [Release Notes](1.0.0-preview1.md) | diff --git a/release-notes/README.md b/release-notes/README.md index c74a1bd0dc..4e2c67bc33 100644 --- a/release-notes/README.md +++ b/release-notes/README.md @@ -26,6 +26,7 @@ The latest stable release is ## Release Information +- [Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 7.0](add-ons/AzureKeyVaultProvider/7.0) - [Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 6.1](add-ons/AzureKeyVaultProvider/6.1) - [Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 6.0](add-ons/AzureKeyVaultProvider/6.0) - [Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 5.1](add-ons/AzureKeyVaultProvider/5.1) @@ -35,6 +36,33 @@ The latest stable release is - [Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 1.1](add-ons/AzureKeyVaultProvider/1.1) - [Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 1.0](add-ons/AzureKeyVaultProvider/1.0) +# Microsoft.Data.SqlClient.Extensions.Abstractions Release Notes + +The latest release is +[Microsoft.Data.SqlClient.Extensions.Abstractions 1.0](Extensions/Abstractions/1.0). + +## Release Information + +- [Microsoft.Data.SqlClient.Extensions.Abstractions 1.0](Extensions/Abstractions/1.0) + +# Microsoft.Data.SqlClient.Extensions.Azure Release Notes + +The latest release is +[Microsoft.Data.SqlClient.Extensions.Azure 1.0](Extensions/Azure/1.0). + +## Release Information + +- [Microsoft.Data.SqlClient.Extensions.Azure 1.0](Extensions/Azure/1.0) + +# Microsoft.Data.SqlClient.Extensions.Logging Release Notes + +The latest release is +[Microsoft.Data.SqlClient.Extensions.Logging 1.0](Extensions/Logging/1.0). + +## Release Information + +- [Microsoft.Data.SqlClient.Extensions.Logging 1.0](Extensions/Logging/1.0) + # Microsoft.SqlServer.Server Release Notes The latest stable release is [Microsoft.SqlServer.Server 1.0](MSqlServerServer/1.0). diff --git a/release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview1.md b/release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview1.md new file mode 100644 index 0000000000..7622f734e7 --- /dev/null +++ b/release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview1.md @@ -0,0 +1,52 @@ +# Release Notes + +## Preview Release 7.0.0-preview1.26064.3 - 2026-03-05 + +This is the first shipped preview of the AzureKeyVaultProvider 7.0 series. Although changes were made to the AKV provider during the 7.0.0-preview1, preview2, and preview3 development milestones, separate AKV packages were not published for those previews. All accumulated changes are included here. + +### Changed + +- Performance improvements for all built-in `SqlColumnEncryptionKeyStoreProvider` implementations, including `SqlColumnEncryptionAzureKeyVaultProvider`. + ([#3554](https://github.com/dotnet/SqlClient/pull/3554)) + +- Updated Dependencies + ([#3638](https://github.com/dotnet/SqlClient/pull/3638)): + - Updated `Azure.Core` to v1.49.0 + - Updated `Azure.Security.KeyVault.Keys` to v4.8.0 + - Updated `Microsoft.Extensions.Caching.Memory` to v9.0.9 (.NET 9.0) + +- Added dependency on `Microsoft.Data.SqlClient.Extensions.Logging` to align with the new extensions infrastructure introduced in `Microsoft.Data.SqlClient` 7.0.0-preview4.26064.3. + ([#3626](https://github.com/dotnet/SqlClient/pull/3626), + [#3628](https://github.com/dotnet/SqlClient/pull/3628), + [#3967](https://github.com/dotnet/SqlClient/pull/3967)) + +## Target Platform Support + +- .NET Framework 4.6.2+ (Windows ARM64, Windows x86, Windows x64) +- .NET 8.0+ (Windows x86, Windows x64, Windows ARM64, Windows ARM, Linux, macOS) + +### Dependencies + +#### .NET Framework + +- Azure.Core 1.49.0 +- Azure.Security.KeyVault.Keys 4.8.0 +- Microsoft.Data.SqlClient 7.0.0-preview4.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Extensions.Caching.Memory 8.0.1 + +#### .NET 8.0 + +- Azure.Core 1.49.0 +- Azure.Security.KeyVault.Keys 4.8.0 +- Microsoft.Data.SqlClient 7.0.0-preview4.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Extensions.Caching.Memory 8.0.1 + +#### .NET 9.0 + +- Azure.Core 1.49.0 +- Azure.Security.KeyVault.Keys 4.8.0 +- Microsoft.Data.SqlClient 7.0.0-preview4.26064.3 +- Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.26064.3 +- Microsoft.Extensions.Caching.Memory 9.0.9 diff --git a/release-notes/add-ons/AzureKeyVaultProvider/7.0/README.md b/release-notes/add-ons/AzureKeyVaultProvider/7.0/README.md new file mode 100644 index 0000000000..c63a0bc71f --- /dev/null +++ b/release-notes/add-ons/AzureKeyVaultProvider/7.0/README.md @@ -0,0 +1,8 @@ +# Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 7.0 Releases + +The following `Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider` +7.0 releases have been shipped: + +| Release Date | Description | Notes | +| :-- | :-- | :--: | +| 2026-03-05 | 7.0.0-preview1.26064.3 | [Release Notes](7.0.0-preview1.md) | diff --git a/release-notes/template/release-notes-template.md b/release-notes/template/release-notes-template.md index 51f2da1da2..4e3ebcb0c0 100644 --- a/release-notes/template/release-notes-template.md +++ b/release-notes/template/release-notes-template.md @@ -81,13 +81,13 @@ We thank the following public contributors. Their efforts toward this project ar ## Target Platform Support -(Look at target frameworks in the netcore and netfx project files.) +(Look at target frameworks in the project file for the package being released.) - [Target Framework Version] ([Supported Operating Systems]) ### Dependencies -(Use the dependencies listed at tools\specs\Microsoft.Data.SqlClient.nuspec) +(Use the dependencies listed in the package's NuGet spec under tools/specs/ or the project file.) #### [Target Framework Version]