├── .github └── workflows │ ├── arm64-tests.yml │ ├── arm64.yml │ ├── mssqlbase.yml │ ├── sqlinstance.yml │ └── tests.yml ├── LICENSE ├── README.md ├── samples ├── compile-go-sqlcmd │ ├── Dockerfile │ └── README.md ├── pwsh-arm64 │ ├── Dockerfile │ └── README.md └── stackoverflow │ ├── .dockerignore │ ├── .env │ ├── Dockerfile │ ├── Dockerfile.third │ ├── README.md │ ├── arch │ ├── README.md │ ├── amd64 │ │ └── Dockerfile │ └── arm64 │ │ └── Dockerfile │ ├── compose.ps1 │ ├── docker-compose.yml │ ├── scripts │ ├── configure.sh │ └── start-sql.sh │ ├── sql │ ├── AGCertificate2021_2121.cer │ ├── AGCertificate2021_2121.pvk │ ├── create-admin.sql │ ├── create-endpoint.sql │ ├── create-objects.sql │ ├── create-regserver.sql │ ├── mssql.conf │ ├── restore-db.sql │ ├── sapassword.env │ └── sqlcmd.env │ └── third │ ├── attach-db.sql │ ├── configure.sh │ └── start-sql.sh ├── sqlinstance ├── .dockerignore ├── .env ├── Dockerfile ├── arch │ ├── README.md │ ├── amd64 │ │ └── Dockerfile │ └── arm64 │ │ └── Dockerfile ├── compose.ps1 ├── docker-compose.yml ├── scripts │ ├── configure.sh │ ├── post-entrypoint.sh │ └── start-sql.sh └── sql │ ├── AGCertificate2021_2121.cer │ ├── AGCertificate2021_2121.pvk │ ├── create-admin.sql │ ├── create-endpoint.sql │ ├── create-objects.sql │ ├── create-regserver.sql │ ├── mssql.conf │ ├── restore-db.sql │ ├── sapassword.env │ └── sqlcmd.env └── tests ├── actions-arm64.ps1 └── actions.ps1 /.github/workflows/arm64-tests.yml: -------------------------------------------------------------------------------- 1 | name: Build and test arm64 2 | on: 3 | workflow_dispatch: 4 | defaults: 5 | run: 6 | shell: pwsh 7 | jobs: 8 | arm64tests: 9 | runs-on: self-hosted 10 | 11 | steps: 12 | - uses: actions/checkout@v2 13 | 14 | - name: Build docker images 15 | run: docker compose -f ./sqlinstance/docker-compose.yml up --force-recreate --build --remove-orphans -d 16 | 17 | - name: Stop newly built containers and remove volumes 18 | run: docker compose -f ./sqlinstance/docker-compose.yml down --volumes 19 | 20 | - name: Recreate the scenario from dbatools.io/docker 21 | run: | 22 | # create a shared network 23 | docker network create localnet 24 | # Expose engine then setup a shared path for migrations 25 | docker run -p 1433:1433 --volume shared:/shared:z --hostname mssql1 --name mssql1 --network localnet -d dbatools/sqlinstance 26 | # Expose second engine on different port and use the same shared path 27 | docker run -p 14333:1433 --volume shared:/shared:z --hostname mssql2 --name mssql2 --network localnet -d dbatools/sqlinstance2 28 | 29 | - name: Sleep while SQL Server starts 30 | run: Start-Sleep 10 31 | 32 | - name: Test that commands continue to work with new build 33 | run: | 34 | $null = Invoke-Pester ./tests/actions-arm64.ps1 -Output Detailed -PassThru 35 | 36 | - name: Cleanup runner 37 | if: always() 38 | run: | 39 | docker kill $(docker ps -q) 40 | docker rm -f $(docker ps -a -q) 41 | docker rmi $(docker images -q "dbatools\/sql*") 42 | docker volume prune -f 43 | docker builder prune -a -f 44 | docker network prune -f 45 | -------------------------------------------------------------------------------- /.github/workflows/arm64.yml: -------------------------------------------------------------------------------- 1 | name: Run self-hosted on arm64 2 | on: 3 | workflow_dispatch: 4 | jobs: 5 | arm64buildandpush: 6 | runs-on: self-hosted 7 | steps: 8 | - uses: actions/checkout@v2 9 | 10 | - name: Login to Docker Hub 11 | uses: docker/login-action@v1 12 | with: 13 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 14 | password: ${{ secrets.DOCKER_HUB_TOKEN }} 15 | 16 | - name: Build docker images 17 | run: | 18 | cd ./sqlinstance 19 | docker compose up -d 20 | 21 | - name: Tag images 22 | run: | 23 | docker tag dbatools/sqlinstance dbatools/sqlinstance:latest-arm64 24 | docker tag dbatools/sqlinstance2 dbatools/sqlinstance2:latest-arm64 25 | 26 | - name: Push images 27 | run: | 28 | docker push dbatools/sqlinstance:latest-arm64 29 | docker push dbatools/sqlinstance2:latest-arm64 30 | 31 | # push one multiarch image 32 | - name: Create and push multiarch manifest 33 | run: | 34 | docker manifest create dbatools/sqlinstance:latest --amend dbatools/sqlinstance:latest-amd64 --amend dbatools/sqlinstance:latest-arm64 35 | docker manifest create dbatools/sqlinstance2:latest --amend dbatools/sqlinstance2:latest-amd64 --amend dbatools/sqlinstance2:latest-arm64 36 | 37 | - name: Push manifest 38 | run: | 39 | docker manifest push docker.io/dbatools/sqlinstance:latest --purge 40 | docker manifest push docker.io/dbatools/sqlinstance2:latest --purge 41 | 42 | - name: View manifest 43 | run: | 44 | docker manifest inspect docker.io/dbatools/sqlinstance:latest 45 | docker manifest inspect docker.io/dbatools/sqlinstance2:latest 46 | 47 | - name: Stop newly built containers and remove volumes 48 | run: | 49 | cd ./sqlinstance 50 | docker compose down --volumes 51 | 52 | - name: Cleanup runner 53 | if: always() 54 | run: | 55 | docker kill $(docker ps -q) 56 | docker rm $(docker ps -a -q) 57 | docker system prune -a -f 58 | docker volume prune -f 59 | docker builder prune -a -f 60 | -------------------------------------------------------------------------------- /.github/workflows/mssqlbase.yml: -------------------------------------------------------------------------------- 1 | name: Deploy mssqlbase 2 | on: 3 | workflow_dispatch: 4 | # run each night 5 | schedule: 6 | - cron: "0 0 * * *" 7 | 8 | jobs: 9 | buildandpush: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Clone repository 13 | uses: actions/checkout@v2 14 | 15 | # https://github.com/docker/setup-qemu-action#usage 16 | - name: Set up QEMU 17 | uses: docker/setup-qemu-action@v1 18 | 19 | # https://github.com/marketplace/actions/docker-setup-buildx 20 | - name: Set up Docker Buildx 21 | uses: docker/setup-buildx-action@v1 22 | 23 | # https://github.com/docker/login-action#docker-hub 24 | - name: Login to Docker Hub 25 | uses: docker/login-action@v1 26 | with: 27 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 28 | password: ${{ secrets.DOCKER_HUB_TOKEN }} 29 | 30 | # Can't be all in one step bc it uses 31 | # two entirely different images 32 | - name: Build ARM64 and push to Docker Hub 33 | uses: docker/build-push-action@v2 34 | with: 35 | context: ./sqlinstance/arch/arm64 36 | platforms: linux/arm64 37 | push: true 38 | tags: dbatools/mssqlbase:latest-arm64 39 | 40 | - name: Build AMD64 and push to Docker Hub 41 | uses: docker/build-push-action@v2 42 | with: 43 | context: ./sqlinstance/arch/amd64 44 | platforms: linux/amd64 45 | push: true 46 | tags: dbatools/mssqlbase:latest-amd64 47 | 48 | # because it's two builds, the manifest has 49 | # to be created and pushed manually 50 | - name: Create and push manifest 51 | run: | 52 | docker manifest create dbatools/mssqlbase:latest --amend dbatools/mssqlbase:latest-amd64 --amend dbatools/mssqlbase:latest-arm64 53 | docker manifest push docker.io/dbatools/mssqlbase:latest --purge 54 | 55 | - name: View manifest 56 | run: docker manifest inspect docker.io/dbatools/mssqlbase:latest 57 | 58 | - uses: gautamkrishnar/keepalive-workflow@v1 59 | with: 60 | commit_message: keepalive to prevent workflow deactivation 61 | committer_username: github-actions[bot] 62 | committer_email: github-actions[bot]@users.noreply.github.com -------------------------------------------------------------------------------- /.github/workflows/sqlinstance.yml: -------------------------------------------------------------------------------- 1 | name: Deploy sqlinstance:latest 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: [main] 6 | 7 | jobs: 8 | buildandpush: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Clone repository 12 | uses: actions/checkout@v2 13 | 14 | - name: Login to Docker Hub 15 | uses: docker/login-action@v1 16 | with: 17 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 18 | password: ${{ secrets.DOCKER_HUB_TOKEN }} 19 | 20 | - name: Build docker images 21 | run: | 22 | cd ./sqlinstance 23 | docker compose up -d 24 | 25 | - name: Tag images 26 | run: | 27 | docker tag dbatools/sqlinstance dbatools/sqlinstance:latest-amd64 28 | docker tag dbatools/sqlinstance2 dbatools/sqlinstance2:latest-amd64 29 | 30 | - name: Push images 31 | run: | 32 | docker push dbatools/sqlinstance:latest-amd64 33 | docker push dbatools/sqlinstance2:latest-amd64 34 | 35 | # push one multiarch image 36 | - name: Create and push multiarch manifest 37 | run: | 38 | docker manifest create dbatools/sqlinstance:latest --amend dbatools/sqlinstance:latest-amd64 --amend dbatools/sqlinstance:latest-arm64 39 | docker manifest create dbatools/sqlinstance2:latest --amend dbatools/sqlinstance2:latest-amd64 --amend dbatools/sqlinstance2:latest-arm64 40 | 41 | - name: Push manifest 42 | run: | 43 | docker manifest push docker.io/dbatools/sqlinstance:latest --purge 44 | docker manifest push docker.io/dbatools/sqlinstance2:latest --purge 45 | 46 | - name: View manifest 47 | run: | 48 | docker manifest inspect docker.io/dbatools/sqlinstance:latest 49 | docker manifest inspect docker.io/dbatools/sqlinstance2:latest 50 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Build and test 2 | on: [push] 3 | defaults: 4 | run: 5 | shell: pwsh 6 | jobs: 7 | tests: 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v2 12 | 13 | - name: Build docker images 14 | run: docker compose -f ./sqlinstance/docker-compose.yml up --force-recreate --build --remove-orphans -d 15 | 16 | - name: Stop newly built containers and remove volumes 17 | run: docker compose -f ./sqlinstance/docker-compose.yml down --volumes 18 | 19 | - name: Recreate the scenario from dbatools.io/docker 20 | run: | 21 | # create a shared network 22 | docker network create localnet 23 | # Expose engine then setup a shared path for migrations 24 | docker run -p 1433:1433 --volume shared:/shared:z --hostname mssql1 --name mssql1 --network localnet -d dbatools/sqlinstance 25 | # Expose second engine on different port and use the same shared path 26 | docker run -p 14333:1433 --volume shared:/shared:z --hostname mssql2 --name mssql2 --network localnet -d dbatools/sqlinstance2 27 | 28 | - name: Install and cache dbatools 29 | uses: potatoqualitee/psmodulecache@v4 30 | with: 31 | modules-to-cache: dbatools 32 | 33 | - name: Test that commands continue to work with new build 34 | run: | 35 | $null = Invoke-Pester ./tests/actions.ps1 -Output Detailed -PassThru 36 | Get-DbatoolsError -All 37 | 38 | - name: Remove containers 39 | run: docker rm -vf mssql1 mssql2 40 | 41 | - name: Recreate the scenario from the env PR 42 | run: | 43 | docker run -p 1433:1433 --volume shared:/shared:z --name mssql1 --hostname mssql1 --network localnet --env MSSQL_DB=mydb1 -d dbatools/sqlinstance 44 | docker run -p 14333:1433 --volume shared:/shared:z --name mssql2 --hostname mssql2 --network localnet --env MSSQL_DB=mydb2 -d dbatools/sqlinstance2 45 | sleep 20 46 | 47 | - name: Test that commands continue to work with new build 48 | run: | 49 | $password = ConvertTo-SecureString "dbatools.IO" -AsPlainText -Force 50 | $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "sqladmin", $password 51 | 52 | Get-DbaDatabase -SqlInstance localhost -SqlCredential $cred -Database mydb1 | Should -Not -BeNullOrEmpty 53 | Get-DbaDatabase -SqlInstance localhost:14333 -SqlCredential $cred -Database mydb2 | Should -Not -BeNullOrEmpty -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Chrissy LeMaire 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker 2 | 3 | This repo holds the Docker compose code that was used to create the images featured on [dbatools.io/docker](https://dbatools.io/docker). 4 | 5 | It's intended not only to help test out dbatools, but to also explore the creation of SQL Server-based containers for your own environment. The compose code is heavily commented and the repo is a work in progress as I'm also learning. Suggestions for improvement are welcome! 6 | 7 | To read about the things I learned while creating these containers, along with tips and tricks, [visit the wiki](https://github.com/potatoqualitee/docker/wiki). 8 | 9 | ## Get started 10 | 11 | To get started and see the containers built in real-time, first clone this repo, then build the base images and containers using `docker-compose`. You can also use `docker compose` without the dash if you use Docker Desktop, as explained on '[Difference between "docker compose" and "docker-compose"](https://stackoverflow.com/questions/66514436/difference-between-docker-compose-and-docker-compose).' 12 | 13 | ```shell 14 | git clone https://www.github.com/potatoqualitee/docker 15 | cd docker\sqlinstance 16 | docker-compose up -d 17 | ``` 18 | 19 | This will pull the SQL Server images from Microsoft's repo, then add a bunch of test objects (databases, logins, jobs, etc) using bash and sql files in this repo, and then make them available for you to connect to on the default port 1433 for the first instance and port 14333 for the second instance. 20 | 21 | Note: If you're using ARM architecture (Apple M1 or Raspberry Pi), none of the High Availability commands will work, as ARM is only supported by SQL Edge, which is limited. 22 | 23 | ## Time to play 🎉 24 | 25 | Now we are setup to test commands against your two containers! You can login via [SQL Server Management Studio](https://sqlps.io/dl) or [Azure Data Studio](https://docs.microsoft.com/en-us/sql/azure-data-studio/download?view=sql-server-2017) if you’d like to take a look first. The server name is `localhost` for the first instance and `localhost,14333` for the second instance), the username is `sqladmin` and the password is `dbatools.IO` 26 | 27 | ![image](https://user-images.githubusercontent.com/8278033/142866226-35a5113b-4297-4e66-9c32-4d02e2f0a0d0.png) 28 | 29 | Note that dbatools supports both using commas and colons to designate a port. When you use a comma, however, you must also use quotes: `'localhost,14333'`. When using dbatools, we recommend just using `localhost:14333`. 30 | 31 | ```powershell 32 | $cred = Get-Credential sqladmin 33 | Connect-DbaInstance -SqlInstance localhost, localhost:14333 -SqlCredential $cred 34 | ``` 35 | If you'd like to test more commands, check out [dbatools and docker (updated!)](https://dbatools.io/docker) 36 | 37 | To stop the containers, run the following command in the docker\sqlinstance directory: 38 | 39 | ```shell 40 | docker compose down 41 | ``` 42 | 43 | And if you'd like to remove the persisent volume it created for the containers to share data, use `--volumes` 44 | 45 | ```shell 46 | docker compose down --volumes 47 | ``` 48 | 49 | ## Remove everything 50 | 51 | If you want to uninstall, or start from a "clean" installation, docker compose can remove all the containers and volumes in one command. 52 | 53 | ```shell 54 | docker builder prune -a -f 55 | docker compose down --remove-orphans --volumes 56 | docker rmi $(docker images -q "dbatools\/*") 57 | ``` 58 | 59 | ## Resources 60 | 61 | Some of the best resources I found included: 62 | 63 | * [Top 20 Dockerfile best practices (sysdig)](https://sysdig.com/blog/Dockerfile-best-practices) 64 | * [Multi-arch build and images, the simple way](https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/) 65 | 66 | Repos 67 | * [dbafromthecold/SqlServerAndContainersGuide](https://github.com/dbafromthecold/SqlServerAndContainersGuide/tree/master/Code/6.DockerCompose/Advanced) 68 | * [twright-msft/mssql-node-docker-demo-app](https://github.com/twright-msft/mssql-node-docker-demo-app) 69 | * [jessfraz/Dockerfiles](https://github.com/jessfraz/Dockerfiles) 70 | * [edemaine/kadira-compose](https://github.com/edemaine/kadira-compose) 71 | * [vicrem/mssql](https://github.com/vicrem/mssql/blob/master/docker-compose.yml) 72 | * [microsoft/go-sqlcmd](https://github.com/microsoft/go-sqlcmd/) 73 | * [microsoft/mssql-docker](https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples/mssql-customize) 74 | 75 | -------------------------------------------------------------------------------- /samples/compile-go-sqlcmd/Dockerfile: -------------------------------------------------------------------------------- 1 | # get it from the base image that matches your architecture 2 | FROM golang 3 | 4 | # clone the go-sqlcmd repo 5 | RUN git clone --depth 1 https://github.com/microsoft/go-sqlcmd 6 | 7 | # change directories and compile sqlcmd to /tmp/sqlcmd 8 | RUN cd go-sqlcmd && \ 9 | go build -o /tmp/sqlcmd ./cmd/sqlcmd 10 | 11 | # just to reiterate that it's at /tmp/sqlcmd 12 | RUN ls /tmp/sqlcmd 13 | 14 | # if you want to look around 15 | ENTRYPOINT /bin/sh -------------------------------------------------------------------------------- /samples/compile-go-sqlcmd/README.md: -------------------------------------------------------------------------------- 1 | 2 | # compile sqlcmd using go 3 | 4 | The included Dockerfile: 5 | 6 | * runs the golang base image that matches your architecture 7 | * clones the microsoft/go-sqlcmd repo 8 | * compiles sqlcmd to /tmp/sqlcmd 9 | 10 | A similar method was used to compile `sqlcmd` which is not included in SQL Server Edge ARM64 container, as SQL client tools are not available for ARM. 11 | 12 | Note: This method is no longer required for getting sqlcmd on ARM, because ARM is now included in the [go-sqlcmd release](https://github.com/microsoft/go-sqlcmd/releases). Nevertheless, it's an interesting and useful technique. 13 | 14 | ## get started 15 | 16 | Here's how you make it run and copy the resulting sqlcmd file 17 | 18 | ``` 19 | # clone this repo 20 | git clone --depth 1 https://github.com/sqlcollaborative/docker 21 | cd docker/samples/compile-go-sqlcmd 22 | 23 | # build the container 24 | docker build -t tempcontainer --no-cache . 25 | 26 | # run it interactively to look around 27 | docker run -it tempcontainer 28 | 29 | # run it non-interactively 30 | docker run -d --name tempcontainer tempcontainer 31 | 32 | # copy a file 33 | docker cp tempcontainer:/tmp/sqlcmd . 34 | 35 | # stop and remove your container 36 | docker rm -f tempcontainer 37 | ``` 38 | -------------------------------------------------------------------------------- /samples/pwsh-arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | # use the 730MB sdk image to build 2 | FROM mcr.microsoft.com/dotnet/sdk as builder 3 | 4 | # install the latest version of PowerShell 5 | RUN dotnet tool install -g PowerShell 6 | 7 | # discard all that builder data then just copy the required 8 | # changed files from "builder" to the smaller 180MB base image 9 | FROM mcr.microsoft.com/dotnet/runtime 10 | COPY --from=builder /root/.dotnet/tools/ /bin 11 | 12 | # run powershell 13 | ENTRYPOINT pwsh 14 | -------------------------------------------------------------------------------- /samples/pwsh-arm64/README.md: -------------------------------------------------------------------------------- 1 | 2 | # run pwsh in an arm64 container 3 | 4 | PowerShell does not yet have an arm64 tag for `mcr.microsoft.com/powershell`. To use PowerShell on your Apple M1 or Raspberry Pi, you can build this project. 5 | 6 | The included Dockerfile: 7 | 8 | * grabs a minimal dotnet container as the base 9 | * copies just pwsh from the larger sdk image 10 | 11 | Here's how to get started: 12 | 13 | ``` 14 | # clone this repo 15 | git clone --depth 1 https://github.com/sqlcollaborative/docker 16 | cd docker/samples/pwsh-arm64 17 | 18 | # build the container 19 | docker build -t pwsh . 20 | 21 | # run it interactively to look around 22 | # remove the container once you're done 23 | docker run -it pwsh -rm 24 | ``` -------------------------------------------------------------------------------- /samples/stackoverflow/.dockerignore: -------------------------------------------------------------------------------- 1 | # ignore the basics 2 | .cache 3 | .DS_Store 4 | .thumbsdb 5 | .git/ 6 | .gitattributes 7 | .gitignore 8 | .env 9 | .vscode/ 10 | 11 | ### Project ### 12 | .dockerignore 13 | Dockerfile 14 | LICENSE 15 | README.md 16 | *.ps1 17 | tests/ -------------------------------------------------------------------------------- /samples/stackoverflow/.env: -------------------------------------------------------------------------------- 1 | COMPOSE_PROJECT_NAME=dbatools -------------------------------------------------------------------------------- /samples/stackoverflow/Dockerfile: -------------------------------------------------------------------------------- 1 | ### 2 | # 3 | # temp/builder image: add users, logins, databases, etc 4 | # 5 | ### 6 | 7 | # get the latest SQL container and set it as the builder image 8 | FROM dbatools/mssqlbase as builder 9 | 10 | # designate the stocked sql server 11 | ARG PRIMARYSQL 12 | 13 | # switch to root to a bunch of stuff that requires elevated privs 14 | USER root 15 | 16 | # set the pwd and chown to the service account 17 | WORKDIR /tmp 18 | RUN chown mssql /tmp 19 | 20 | # copy scripts and make bash files executable 21 | # use copy instead of add, it's safer apparently 22 | COPY sql scripts /tmp/ 23 | RUN chmod +x /tmp/*.sh 24 | 25 | # convert CRLF to LF in case Windows or VS Code changed it 26 | RUN find . -type f \( -name "*.sql" -o -name "*.env" -o -name "*.sh" \) -exec sed -i 's/\r$//' {} \; 27 | 28 | # write a file that designates the primary server 29 | RUN if [ $PRIMARYSQL ]; then touch /tmp/primary; fi 30 | 31 | # switch to user mssql or the container will fail 32 | USER mssql 33 | 34 | # run initial setup scripts 35 | RUN /bin/bash /tmp/start-sql.sh 36 | 37 | ### 38 | # 39 | # final image: grab the good stuff, label 40 | # the image, and startup the sql instance 41 | # 42 | ### 43 | 44 | # copy the required changed files from "builder" 45 | # and use it to start from scratch 46 | FROM dbatools/mssqlbase 47 | COPY --from=builder /var/opt/mssql /var/opt/mssql 48 | COPY --from=builder /opt/mssql-tools/bin /opt/mssql-tools/bin 49 | 50 | # make a shared dir with the proper permissions 51 | USER root 52 | RUN mkdir /shared; chown mssql /shared 53 | 54 | # run a rootless container 55 | USER mssql 56 | ENTRYPOINT /opt/mssql/bin/sqlservr 57 | # CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait" 58 | 59 | # label the container 60 | LABEL org.opencontainers.image.vendor="dbatools" 61 | LABEL org.opencontainers.image.title="dbatools" 62 | LABEL org.opencontainers.image.url=https://dbatools.io/docker 63 | LABEL org.opencontainers.image.version=1.0 64 | LABEL org.label-schema.description="SQL Server instances with a sample objects, including Northwind and pubs. Ideal for test migrations." 65 | LABEL org.opencontainers.image.authors="Chrissy LeMaire " 66 | LABEL org.opencontainers.image.documentation=https://github.com/potatoqualitee/docker/blob/main/README.md 67 | LABEL org.opencontainers.image.source=https://github.com/potatoqualitee/docker 68 | -------------------------------------------------------------------------------- /samples/stackoverflow/Dockerfile.third: -------------------------------------------------------------------------------- 1 | ### 2 | # 3 | # temp/builder image: add users, logins, databases, etc 4 | # 5 | ### 6 | 7 | # get the latest SQL container and set it as the builder image 8 | FROM dbatools/mssqlbase as builder 9 | 10 | # switch to root to a bunch of stuff that requires elevated privs 11 | USER root 12 | 13 | # set the pwd and chown to the service account 14 | WORKDIR /tmp 15 | RUN apt-get -y update \ 16 | && apt-get install -y p7zip\ 17 | p7zip-full 18 | RUN chown mssql /tmp 19 | 20 | # copy scripts and make bash files executable 21 | # use copy instead of add, it's safer apparently 22 | COPY sql third /tmp/ 23 | RUN chmod +x /tmp/*.sh 24 | 25 | # convert CRLF to LF in case Windows or VS Code changed it 26 | RUN find . -type f \( -name "*.sql" -o -name "*.env" -o -name "*.sh" \) -exec sed -i 's/\r$//' {} \; 27 | 28 | # switch to user mssql or the container will fail 29 | USER mssql 30 | 31 | # run initial setup scripts 32 | RUN /bin/bash /tmp/start-sql.sh 33 | 34 | ### 35 | # 36 | # final image: grab the good stuff, label 37 | # the image, and startup the sql instance 38 | # 39 | ### 40 | 41 | # copy the required changed files from "builder" 42 | # and use it to start from scratch 43 | FROM dbatools/mssqlbase 44 | COPY --from=builder /var/opt/mssql /var/opt/mssql 45 | COPY --from=builder /opt/mssql-tools/bin /opt/mssql-tools/bin 46 | # COPY --from=builder /tmp /tmp 47 | 48 | # make a shared dir with the proper permissions 49 | USER root 50 | RUN mkdir /shared; chown mssql /shared 51 | RUN chown -R mssql /opt/ 52 | # RUN chown -R mssql /tmp 53 | 54 | # run a rootless container 55 | USER mssql 56 | ENTRYPOINT /opt/mssql/bin/sqlservr 57 | #CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait" 58 | 59 | # label the container 60 | LABEL org.opencontainers.image.vendor="dbatools" 61 | LABEL org.opencontainers.image.title="dbatools" 62 | LABEL org.opencontainers.image.url=https://dbatools.io/docker 63 | LABEL org.opencontainers.image.version=1.0 64 | LABEL org.label-schema.description="SQL Server instances with a sample objects, including Northwind and pubs. Ideal for test migrations." 65 | LABEL org.opencontainers.image.authors="Chrissy LeMaire " 66 | LABEL org.opencontainers.image.documentation=https://github.com/potatoqualitee/docker/blob/main/README.md 67 | LABEL org.opencontainers.image.source=https://github.com/potatoqualitee/docker 68 | -------------------------------------------------------------------------------- /samples/stackoverflow/README.md: -------------------------------------------------------------------------------- 1 | # StackOverflow 2 | 3 | This Docker compose has three instances -- the first two are the dbatools instances and the third one is a barebones version of 2019 with a 10 GB StackOverflow database. 4 | 5 | ## Get started 6 | 7 | To get started and see the containers built in real-time, first clone this repo, then build the base images and containers using `docker-compose`. You can also use `docker compose` without the dash if you use Docker Desktop, as explained on '[Difference between "docker compose" and "docker-compose"](https://stackoverflow.com/questions/66514436/difference-between-docker-compose-and-docker-compose).' 8 | 9 | ```shell 10 | git clone https://www.github.com/potatoqualitee/docker 11 | cd docker\samples\stackoverflow 12 | docker-compose up -d 13 | ``` 14 | 15 | The first time this runs it'll take like 10 minutes, but each subsequent time will be faster. 16 | 17 | ## Logging in 18 | 19 | All three instances can be logged into by using the `sqladmin` as the username and `dbatools.IO` as the password. 20 | 21 | | Instance | Port | User databases | SSMS | dbatools | 22 | |:----------|:-------------|:------|:------|:------| 23 | | mssql1 | 1433 | Northwind, pubs | localhost | localhost | 24 | | mssql2 | 14333 | N/A | localhost,14333 | localhost:14333 or 'localhost,14333' | 25 | | mssql3 | 14334 | StackOverflow | localhost,14334 | localhost:14334 or 'locahost,14334' | 26 | 27 | ![image](https://user-images.githubusercontent.com/8278033/162917740-96e379fb-541e-4c22-8107-841c4de84767.png) 28 | 29 | ### PowerShell 30 | 31 | ```powershell 32 | # Set credential 33 | $cred = Get-Credential sqladmin 34 | 35 | # First instance 36 | $server1 = Connect-DbaInstance -SqlInstance localhost -SqlCredential $cred 37 | 38 | # Second instance 39 | $server2 = Connect-DbaInstance -SqlInstance localhost:14333 -SqlCredential $cred 40 | 41 | # Third instance with StackOverflow Database 42 | $server3 = Connect-DbaInstance -SqlInstance localhost:14334 -SqlCredential $cred 43 | ``` 44 | 45 | ### SSMS 46 | 47 | ![image](https://user-images.githubusercontent.com/8278033/162914519-b8e312fe-8e47-414a-8fe2-6123acf80084.png) 48 | 49 | -------------------------------------------------------------------------------- /samples/stackoverflow/arch/README.md: -------------------------------------------------------------------------------- 1 | # The best SQL Server for each platform 2 | 3 | Make an alias image for Microsoft's SQL Server images. For x64, use SQL Server 2019 because it supports more things like HA. 4 | 5 | For ARM, use SQL Server Edge because SQL Server 2019 doesn't have an ARM image. 6 | 7 | * [Linux supported features](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019) 8 | * [Edge supported features](https://docs.microsoft.com/en-us/azure/azure-sql-edge/features) 9 | 10 | Add this image to Docker Hub to make builds and deployments simpler. 11 | 12 | My notes for pushing to Docker Hub: 13 | 14 | ``` 15 | # build dat 16 | docker buildx build -t dbatools/mssqlbase:latest-amd64 ./amd64 17 | docker buildx build -t dbatools/mssqlbase:latest-arm64 ./arm64 18 | 19 | docker push dbatools/mssqlbase:latest-arm64 20 | docker push dbatools/mssqlbase:latest-amd64 21 | 22 | # Create manifests that support multiple architectures 23 | docker manifest create dbatools/mssqlbase:latest --amend dbatools/mssqlbase:latest-amd64 --amend dbatools/mssqlbase:latest-arm64 24 | 25 | # view it if you want 26 | docker manifest inspect docker.io/dbatools/mssqlbase:latest 27 | 28 | # push out to docker 29 | docker manifest push docker.io/dbatools/mssqlbase:latest --purge 30 | ``` -------------------------------------------------------------------------------- /samples/stackoverflow/arch/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | # Make an alias for Microsoft's SQL Server Images 2 | # For x64, use SQL Server 2019 because it supports more things 3 | # like HA. For ARM, use SQL Server Edge because SQL Server 2019 doesn't have an ARM image. 4 | # Linux supported features: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019 5 | # Edge supported features: https://docs.microsoft.com/en-us/azure/azure-sql-edge/features 6 | 7 | FROM --platform=amd64 mcr.microsoft.com/mssql/server:2019-latest -------------------------------------------------------------------------------- /samples/stackoverflow/arch/arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | # Make an alias for Microsoft's SQL Server Images 2 | # For x64, use SQL Server 2019 because it supports more things 3 | # like HA. For ARM, use SQL Server Edge because SQL Server 2019 doesn't have an ARM image. 4 | # Linux supported features: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019 5 | # Edge supported features: https://docs.microsoft.com/en-us/azure/azure-sql-edge/features 6 | 7 | FROM --platform=arm64 mcr.microsoft.com/azure-sql-edge -------------------------------------------------------------------------------- /samples/stackoverflow/compose.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | This script helps demonstrate how our images on docker hub are built. 3 | 4 | Some commands, like docker push, require special permissions. 5 | 6 | #> 7 | 8 | # rebuild the whole thing with no caches 9 | docker compose down --volumes 10 | docker volume prune -f 11 | docker image prune -f 12 | docker builder prune -a -f 13 | docker compose up --force-recreate --build --remove-orphans -d 14 | 15 | # push out to docker hub 16 | docker push dbatools/sqlinstance:latest-amd64 17 | docker push dbatools/sqlinstance2:latest-amd64 18 | 19 | # Remove manifest cache 20 | Remove-Item $HOME/.docker/manifests -Recurse -Force 21 | 22 | # Create manifests that support multiple architectures 23 | docker manifest create dbatools/sqlinstance:latest --amend dbatools/sqlinstance:latest-amd64 --amend dbatools/sqlinstance:latest-arm64 24 | docker manifest create dbatools/sqlinstance2:latest --amend dbatools/sqlinstance2:latest-amd64 --amend dbatools/sqlinstance2:latest-arm64 25 | 26 | # view it if you want 27 | docker manifest inspect docker.io/dbatools/sqlinstance:latest 28 | docker manifest inspect docker.io/dbatools/sqlinstance2:latest 29 | 30 | # push out to docker 31 | docker manifest push docker.io/dbatools/sqlinstance:latest --purge 32 | docker manifest push docker.io/dbatools/sqlinstance2:latest --purge 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | <# 41 | 42 | 43 | FOR ARM DEPLOYMENTS ON M1 or Raspberry Pi 44 | 45 | 46 | #> 47 | # rebuild the whole thing with no caches 48 | docker compose down --volumes 49 | docker volume prune -f 50 | docker image prune -f 51 | docker builder prune -a -f 52 | docker compose up --force-recreate --build --remove-orphans -d 53 | 54 | # retag image 55 | docker tag dbatools/sqlinstance dbatools/sqlinstance:latest-arm64 56 | docker tag dbatools/sqlinstance2 dbatools/sqlinstance2:latest-arm64 57 | 58 | # push out to docker hub 59 | docker push dbatools/sqlinstance:latest-arm64 60 | docker push dbatools/sqlinstance2:latest-arm64 61 | 62 | # Remove manifest cache 63 | Remove-Item $HOME/.docker/manifests -Recurse -Force 64 | 65 | # Create manifests that support multiple architectures 66 | docker manifest create dbatools/sqlinstance:latest --amend dbatools/sqlinstance:latest-amd64 --amend dbatools/sqlinstance:latest-arm64 67 | docker manifest create dbatools/sqlinstance2:latest --amend dbatools/sqlinstance2:latest-amd64 --amend dbatools/sqlinstance2:latest-arm64 68 | 69 | # view it if you want 70 | docker manifest inspect docker.io/dbatools/sqlinstance:latest 71 | docker manifest inspect docker.io/dbatools/sqlinstance2:latest 72 | 73 | # push out to docker 74 | docker manifest push docker.io/dbatools/sqlinstance:latest --purge 75 | docker manifest push docker.io/dbatools/sqlinstance2:latest --purge 76 | 77 | 78 | 79 | <# 80 | # Clean up! 81 | This is super destructive as it will remove all images and containers and volumes. You probably don't want to run this. 82 | 83 | docker compose down 84 | docker stop $(docker ps -a -q) 85 | docker rm $(docker ps -a -q) 86 | docker rmi $(docker images -q) 87 | "y" | docker system prune -a 88 | "y" | docker volume prune 89 | "y" | docker builder prune -a 90 | dockerdo -Wait -NoShush 91 | 92 | #> -------------------------------------------------------------------------------- /samples/stackoverflow/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | mssql1: 4 | restart: on-failure 5 | networks: 6 | - localnet 7 | container_name: mssql1 8 | hostname: mssql1 9 | image: dbatools/sqlinstance 10 | build: 11 | context: . 12 | labels: 13 | org.label-schema.docker.cmd: "docker run -p 1433:1433 --volume shared:/shared:z --name mssql1 --hostname mssql1 --network localnet -d dbatools/sqlinstance" 14 | args: 15 | PRIMARYSQL: "TRUE" 16 | ports: 17 | - "1433:1433" 18 | env_file: 19 | - sql/sapassword.env 20 | volumes: 21 | - shared:/shared:z 22 | mssql2: 23 | restart: on-failure 24 | networks: 25 | - localnet 26 | container_name: mssql2 27 | hostname: mssql2 28 | image: dbatools/sqlinstance2 29 | build: 30 | context: . 31 | labels: 32 | org.label-schema.docker.cmd: "docker run -p 14333:1433 --volume shared:/shared:z --name mssql2 --hostname mssql2 --network localnet -d dbatools/sqlinstance2" 33 | ports: 34 | - "14333:1433" 35 | env_file: 36 | - sql/sapassword.env 37 | volumes: 38 | - shared:/shared:z 39 | mssql3: 40 | restart: on-failure 41 | networks: 42 | - localnet 43 | container_name: mssql3 44 | hostname: mssql3 45 | image: dbatools/sqlinstance3 46 | build: 47 | context: . 48 | dockerfile: Dockerfile.third 49 | labels: 50 | org.label-schema.docker.cmd: "docker run -p 14334:1433 --volume shared:/shared:z --name mssql3 --hostname mssql3 --network localnet -d dbatools/sqlinstance2" 51 | ports: 52 | - "14334:1433" 53 | env_file: 54 | - sql/sapassword.env 55 | volumes: 56 | - shared:/shared:z 57 | 58 | networks: 59 | localnet: null 60 | volumes: 61 | shared: null 62 | -------------------------------------------------------------------------------- /samples/stackoverflow/scripts/configure.sh: -------------------------------------------------------------------------------- 1 | # loop until sql server is up and ready 2 | for i in {1..50}; 3 | do 4 | sqlcmd -S localhost -d master -Q "SELECT @@VERSION" 5 | if [ $? -ne 0 ];then 6 | sleep 2 7 | fi 8 | done 9 | 10 | # create sqladmin with dbatools.IO password and disable sa 11 | sqlcmd -S localhost -d master -i /tmp/create-admin.sql 12 | 13 | # change the default login to sqladmin instead of sa 14 | export SQLCMDUSER=sqladmin 15 | 16 | # prep to rename the server to be mssql1 or mssql2 17 | sqlcmd -d master -Q "EXEC sp_dropserver @@SERVERNAME" 18 | 19 | # if it's the primary server, restore pubs and northwind and create a bunch of objects 20 | if [ -f "/tmp/primary" ]; then 21 | sqlcmd -S localhost -d master -Q "EXEC sp_addserver 'mssql1', local" 22 | # Download instead of including it in the repo -- it reduces 23 | # the size of the context and makes the secondary image smaller 24 | wget https://github.com/sqlcollaborative/docker/raw/a61d8e1ffb150cae767c27737ad07e730d4e76dd/sqlinstance/sql/northwind.bak 25 | wget https://github.com/sqlcollaborative/docker/raw/a61d8e1ffb150cae767c27737ad07e730d4e76dd/sqlinstance/sql/pubs.bak 26 | sqlcmd -S localhost -d master -i /tmp/restore-db.sql 27 | sqlcmd -S localhost -d master -i /tmp/create-objects.sql 28 | sqlcmd -S localhost -d master -i /tmp/create-regserver.sql 29 | else 30 | sqlcmd -S localhost -d master -Q "EXEC sp_addserver 'mssql2', local" 31 | fi 32 | 33 | # import the certificate and creates endpoint 34 | sqlcmd -S localhost -d master -i /tmp/create-endpoint.sql -------------------------------------------------------------------------------- /samples/stackoverflow/scripts/start-sql.sh: -------------------------------------------------------------------------------- 1 | # load up environment variables 2 | export $(xargs < /tmp/sapassword.env) 3 | export $(xargs < /tmp/sqlcmd.env) 4 | export PATH=$PATH:/opt/mssql-tools/bin 5 | 6 | # set the configs 7 | cp /tmp/mssql.conf /var/opt/mssql/mssql.conf 8 | 9 | # check for arm64 which does not support sqlcmd 10 | arch=$(lscpu | awk '/Architecture:/{print $2}') 11 | if [ "$arch" = "aarch64" ]; then 12 | wget https://github.com/microsoft/go-sqlcmd/releases/download/v0.2.0/sqlcmd-v0.2.0-linux-arm64.tar.bz2 13 | tar -xvf sqlcmd-v0.2.0-linux-arm64.tar.bz2 14 | mkdir /opt/mssql-tools /opt/mssql-tools/bin 15 | cp sqlcmd /opt/mssql-tools/bin 16 | chmod +x /opt/mssql-tools/bin/sqlcmd 17 | fi 18 | 19 | # startup, wait for it to finish starting 20 | # then run the setup script 21 | /opt/mssql/bin/sqlservr & sleep 20 & /tmp/configure.sh -------------------------------------------------------------------------------- /samples/stackoverflow/sql/AGCertificate2021_2121.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataplat/docker/4fe644fb22ee8bf785f361fbd70c47c79a4d9a6a/samples/stackoverflow/sql/AGCertificate2021_2121.cer -------------------------------------------------------------------------------- /samples/stackoverflow/sql/AGCertificate2021_2121.pvk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataplat/docker/4fe644fb22ee8bf785f361fbd70c47c79a4d9a6a/samples/stackoverflow/sql/AGCertificate2021_2121.pvk -------------------------------------------------------------------------------- /samples/stackoverflow/sql/create-admin.sql: -------------------------------------------------------------------------------- 1 | -- create a sql admin account that's not sa 2 | -- then disable sa, because it feels right 3 | CREATE LOGIN [sqladmin] WITH PASSWORD = 0x02004655C1D65FA47CC10F4544048D810E5820A1978DF8750708B3AAE6F039240AD275961BFD9FBCE961ED84B69B4B2A93D62C4C32AF953312EE5B3C189901D92D52438E9E10 HASHED, SID = 0x21A63BA3525821498FDED3037F96A293, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 4 | 5 | GO 6 | 7 | ALTER SERVER ROLE [sysadmin] ADD MEMBER [sqladmin] 8 | 9 | GO 10 | 11 | ALTER LOGIN [sa] DISABLE -------------------------------------------------------------------------------- /samples/stackoverflow/sql/create-endpoint.sql: -------------------------------------------------------------------------------- 1 | -- Create an endpoint by importing a cert that lasts 100 years 2 | -- And do it on both servers 3 | -- This allows the two endpoints to talk to each other 4 | CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'dbatools.IO' 5 | GO 6 | 7 | CREATE CERTIFICATE AGCertificate2021_2121 FROM FILE ='/tmp/AGCertificate2021_2121.cer' WITH PRIVATE KEY(FILE='/tmp/AGCertificate2021_2121.pvk', DECRYPTION BY PASSWORD='dbatools.IO') 8 | GO 9 | 10 | CREATE ENDPOINT [hadr_endpoint] 11 | STATE=STARTED 12 | AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) 13 | FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = CERTIFICATE [AGCertificate2021_2121] 14 | , ENCRYPTION = REQUIRED ALGORITHM AES) 15 | GO -------------------------------------------------------------------------------- /samples/stackoverflow/sql/create-objects.sql: -------------------------------------------------------------------------------- 1 | -- create a boatload of things to migrate 2 | 3 | -- backup device 4 | EXEC master.dbo.sp_addumpdevice @devtype = N'disk', @logicalname = N'Old School', @physicalname = N'\\nas\sqlbackups\Old School.bak' 5 | GO 6 | 7 | -- custom errors 8 | EXEC master.dbo.sp_addmessage @msgnum=60000, @lang=N'us_english', 9 | @severity=16, 10 | @msgtext=N'The item named %s already exists in %s.', 11 | @with_log=false 12 | GO 13 | 14 | -- mail 15 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'AccountRetryAttempts', @parameter_value=N'1', @description=N'Number of retry attempts for a mail server' 16 | GO 17 | 18 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'AccountRetryDelay', @parameter_value=N'60', @description=N'Delay between each retry attempt to mail server' 19 | GO 20 | 21 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'DatabaseMailExeMinimumLifeTime', @parameter_value=N'600', @description=N'Minimum process lifetime in seconds' 22 | GO 23 | 24 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'DefaultAttachmentEncoding', @parameter_value=N'MIME', @description=N'Default attachment encoding' 25 | GO 26 | 27 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'LoggingLevel', @parameter_value=N'2', @description=N'Database Mail logging level: normal - 1, extended - 2 (default), verbose - 3' 28 | GO 29 | 30 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'MaxFileSize', @parameter_value=N'1000000', @description=N'Default maximum file size' 31 | GO 32 | 33 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'ProhibitedExtensions', @parameter_value=N'exe,dll,vbs,js', @description=N'Extensions not allowed in outgoing mails' 34 | GO 35 | 36 | EXEC msdb.dbo.sysmail_add_account_sp @account_name=N'The DBA Team', 37 | @email_address=N'dbadistro@ad.local', 38 | @display_name=N'The DBA Team' 39 | GO 40 | 41 | EXEC msdb.dbo.sysmail_add_profile_sp @profile_name=N'The DBA Team' 42 | GO 43 | 44 | EXEC msdb.dbo.sysmail_add_profileaccount_sp @profile_name=N'The DBA Team', @account_name=N'The DBA Team', @sequence_number=1 45 | GO 46 | 47 | EXEC msdb.dbo.sysmail_add_principalprofile_sp @principal_name=N'guest', @profile_name=N'The DBA Team', @is_default=1 48 | GO 49 | 50 | EXEC msdb.dbo.sysmail_update_account_sp @account_name=N'The DBA Team', @description=N'', @email_address=N'dbadistro@ad.local', @display_name=N'The DBA Team', @replyto_address=N'', @mailserver_name=N'smtp.ad.local', @mailserver_type=N'SMTP', @port=25, @username=N'', @password=N'', @use_default_credentials=0, @enable_ssl=0 51 | GO 52 | 53 | -- extended events 54 | 55 | CREATE EVENT SESSION [AlwaysOn_health_new] ON SERVER 56 | ADD EVENT sqlserver.alwayson_ddl_executed, 57 | ADD EVENT sqlserver.availability_group_lease_expired, 58 | ADD EVENT sqlserver.availability_replica_automatic_failover_validation, 59 | ADD EVENT sqlserver.availability_replica_manager_state_change, 60 | ADD EVENT sqlserver.availability_replica_state, 61 | ADD EVENT sqlserver.availability_replica_state_change, 62 | ADD EVENT sqlserver.error_reported( 63 | WHERE ([error_number]=(9691) OR [error_number]=(35204) OR [error_number]=(9693) OR [error_number]=(26024) OR [error_number]=(28047) OR [error_number]=(26023) OR [error_number]=(9692) OR [error_number]=(28034) OR [error_number]=(28036) OR [error_number]=(28048) OR [error_number]=(28080) OR [error_number]=(28091) OR [error_number]=(26022) OR [error_number]=(9642) OR [error_number]=(35201) OR [error_number]=(35202) OR [error_number]=(35206) OR [error_number]=(35207) OR [error_number]=(26069) OR [error_number]=(26070) OR [error_number]>(41047) AND [error_number]<(41056) OR [error_number]=(41142) OR [error_number]=(41144) OR [error_number]=(1480) OR [error_number]=(823) OR [error_number]=(824) OR [error_number]=(829) OR [error_number]=(35264) OR [error_number]=(35265) OR [error_number]=(41188) OR [error_number]=(41189))), 64 | ADD EVENT sqlserver.hadr_db_partner_set_sync_state, 65 | ADD EVENT sqlserver.lock_redo_blocked 66 | ADD TARGET package0.event_file(SET filename=N'AlwaysOn_health.xel',max_file_size=(5),max_rollover_files=(4)) 67 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) 68 | GO 69 | CREATE EVENT SESSION [Login Tracker] ON SERVER 70 | ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(0) 71 | ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.server_instance_name,sqlserver.server_principal_name) 72 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_app_name],N'%dbatools%') AND NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_app_name],N'%management studio%') AND [sqlserver].[not_equal_i_sql_unicode_string]([sqlserver].[database_name],N'tempdb'))) 73 | ADD TARGET package0.event_file(SET filename=N'Login Tracker',max_file_size=(10)) 74 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON) 75 | GO 76 | CREATE EVENT SESSION [QuickSessionStandard] ON SERVER 77 | ADD EVENT sqlserver.attention( 78 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 79 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))), 80 | ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1) 81 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)), 82 | ADD EVENT sqlserver.login(SET collect_options_text=(1) 83 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)), 84 | ADD EVENT sqlserver.logout( 85 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)), 86 | ADD EVENT sqlserver.rpc_completed( 87 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 88 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))), 89 | ADD EVENT sqlserver.sql_batch_completed( 90 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 91 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))), 92 | ADD EVENT sqlserver.sql_batch_starting( 93 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 94 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))) 95 | WITH (MAX_MEMORY=8192 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF) 96 | GO 97 | CREATE EVENT SESSION [system_health_new] ON SERVER 98 | ADD EVENT sqlclr.clr_allocation_failure( 99 | ACTION(package0.callstack,sqlserver.session_id)), 100 | ADD EVENT sqlclr.clr_virtual_alloc_failure( 101 | ACTION(package0.callstack,sqlserver.session_id)), 102 | ADD EVENT sqlos.memory_broker_ring_buffer_recorded, 103 | ADD EVENT sqlos.memory_node_oom_ring_buffer_recorded( 104 | ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack)), 105 | ADD EVENT sqlos.process_killed( 106 | ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username)), 107 | ADD EVENT sqlos.scheduler_monitor_deadlock_ring_buffer_recorded, 108 | ADD EVENT sqlos.scheduler_monitor_non_yielding_iocp_ring_buffer_recorded, 109 | ADD EVENT sqlos.scheduler_monitor_non_yielding_ring_buffer_recorded, 110 | ADD EVENT sqlos.scheduler_monitor_non_yielding_rm_ring_buffer_recorded, 111 | ADD EVENT sqlos.scheduler_monitor_stalled_dispatcher_ring_buffer_recorded, 112 | ADD EVENT sqlos.scheduler_monitor_system_health_ring_buffer_recorded, 113 | ADD EVENT sqlos.wait_info( 114 | ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text) 115 | WHERE ([duration]>(15000) AND ([wait_type]>=N'LATCH_NL' AND ([wait_type]>=N'PAGELATCH_NL' AND [wait_type]<=N'PAGELATCH_DT' OR [wait_type]<=N'LATCH_DT' OR [wait_type]>=N'PAGEIOLATCH_NL' AND [wait_type]<=N'PAGEIOLATCH_DT' OR [wait_type]>=N'IO_COMPLETION' AND [wait_type]<=N'NETWORK_IO' OR [wait_type]=N'RESOURCE_SEMAPHORE' OR [wait_type]=N'SOS_WORKER' OR [wait_type]>=N'FCB_REPLICA_WRITE' AND [wait_type]<=N'WRITELOG' OR [wait_type]=N'CMEMTHREAD' OR [wait_type]=N'TRACEWRITE' OR [wait_type]=N'RESOURCE_SEMAPHORE_MUTEX') OR [duration]>(30000) AND [wait_type]<=N'LCK_M_RX_X'))), 116 | ADD EVENT sqlos.wait_info_external( 117 | ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text) 118 | WHERE ([duration]>(5000) AND ([wait_type]>=N'PREEMPTIVE_OS_GENERICOPS' AND [wait_type]<=N'PREEMPTIVE_OS_ENCRYPTMESSAGE' OR [wait_type]>=N'PREEMPTIVE_OS_INITIALIZESECURITYCONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_QUERYSECURITYCONTEXTTOKEN' OR [wait_type]>=N'PREEMPTIVE_OS_AUTHZGETINFORMATIONFROMCONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_REVERTTOSELF' OR [wait_type]>=N'PREEMPTIVE_OS_CRYPTACQUIRECONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_DEVICEOPS' OR [wait_type]>=N'PREEMPTIVE_OS_NETGROUPGETUSERS' AND [wait_type]<=N'PREEMPTIVE_OS_NETUSERMODALSGET' OR [wait_type]>=N'PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICYFREE' AND [wait_type]<=N'PREEMPTIVE_OS_DOMAINSERVICESOPS' OR [wait_type]=N'PREEMPTIVE_OS_VERIFYSIGNATURE' OR [duration]>(45000) AND ([wait_type]>=N'PREEMPTIVE_OS_SETNAMEDSECURITYINFO' AND [wait_type]<=N'PREEMPTIVE_CLUSAPI_CLUSTERRESOURCECONTROL' OR [wait_type]>=N'PREEMPTIVE_OS_RSFXDEVICEOPS' AND [wait_type]<=N'PREEMPTIVE_OS_DSGETDCNAME' OR [wait_type]>=N'PREEMPTIVE_OS_DTCOPS' AND [wait_type]<=N'PREEMPTIVE_DTC_ABORT' OR [wait_type]>=N'PREEMPTIVE_OS_CLOSEHANDLE' AND [wait_type]<=N'PREEMPTIVE_OS_FINDFILE' OR [wait_type]>=N'PREEMPTIVE_OS_GETCOMPRESSEDFILESIZE' AND [wait_type]<=N'PREEMPTIVE_ODBCOPS' OR [wait_type]>=N'PREEMPTIVE_OS_DISCONNECTNAMEDPIPE' AND [wait_type]<=N'PREEMPTIVE_CLOSEBACKUPMEDIA' OR [wait_type]=N'PREEMPTIVE_OS_AUTHENTICATIONOPS' OR [wait_type]=N'PREEMPTIVE_OS_FREECREDENTIALSHANDLE' OR [wait_type]=N'PREEMPTIVE_OS_AUTHORIZATIONOPS' OR [wait_type]=N'PREEMPTIVE_COM_COCREATEINSTANCE' OR [wait_type]=N'PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICY' OR [wait_type]=N'PREEMPTIVE_VSS_CREATESNAPSHOT')))), 119 | ADD EVENT sqlserver.connectivity_ring_buffer_recorded(SET collect_call_stack=(1)), 120 | ADD EVENT sqlserver.error_reported( 121 | ACTION(package0.callstack,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack) 122 | WHERE ([severity]>=(20) OR ([error_number]=(17803) OR [error_number]=(701) OR [error_number]=(802) OR [error_number]=(8645) OR [error_number]=(8651) OR [error_number]=(8657) OR [error_number]=(8902) OR [error_number]=(41354) OR [error_number]=(41355) OR [error_number]=(41367) OR [error_number]=(41384) OR [error_number]=(41336) OR [error_number]=(41309) OR [error_number]=(41312) OR [error_number]=(41313)))), 123 | ADD EVENT sqlserver.security_error_ring_buffer_recorded(SET collect_call_stack=(1)), 124 | ADD EVENT sqlserver.sp_server_diagnostics_component_result(SET collect_data=(1) 125 | WHERE ([sqlserver].[is_system]=(1) AND [component]<>(4))), 126 | ADD EVENT sqlserver.sql_exit_invoked( 127 | ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username)), 128 | ADD EVENT sqlserver.xml_deadlock_report 129 | ADD TARGET package0.event_file(SET filename=N'system_health.xel',max_file_size=(5),max_rollover_files=(4)), 130 | ADD TARGET package0.ring_buffer(SET max_events_limit=(5000),max_memory=(4096)) 131 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=120 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON) 132 | GO 133 | CREATE EVENT SESSION [telemetry_xevents_new] ON SERVER 134 | ADD EVENT qds.query_store_db_diagnostics, 135 | ADD EVENT sqlserver.alter_column_event, 136 | ADD EVENT sqlserver.always_encrypted_query_count, 137 | ADD EVENT sqlserver.auto_stats, 138 | ADD EVENT sqlserver.cardinality_estimation_version_usage, 139 | ADD EVENT sqlserver.column_store_index_build_low_memory, 140 | ADD EVENT sqlserver.column_store_index_build_throttle, 141 | ADD EVENT sqlserver.columnstore_delete_buffer_flush_failed, 142 | ADD EVENT sqlserver.columnstore_delta_rowgroup_closed, 143 | ADD EVENT sqlserver.columnstore_index_reorg_failed, 144 | ADD EVENT sqlserver.columnstore_log_exception, 145 | ADD EVENT sqlserver.columnstore_rowgroup_merge_failed, 146 | ADD EVENT sqlserver.columnstore_tuple_mover_delete_buffer_truncate_timed_out, 147 | ADD EVENT sqlserver.columnstore_tuple_mover_end_compress, 148 | ADD EVENT sqlserver.create_index_event, 149 | ADD EVENT sqlserver.data_masking_ddl_column_definition, 150 | ADD EVENT sqlserver.data_masking_traffic, 151 | ADD EVENT sqlserver.data_masking_traffic_masked_only, 152 | ADD EVENT sqlserver.database_cmptlevel_change, 153 | ADD EVENT sqlserver.database_created, 154 | ADD EVENT sqlserver.database_dropped, 155 | ADD EVENT sqlserver.error_reported( 156 | WHERE ([severity]>=(16) OR ([error_number]=(18456) OR [error_number]=(17803) OR [error_number]=(701) OR [error_number]=(802) OR [error_number]=(8645) OR [error_number]=(8651) OR [error_number]=(8657) OR [error_number]=(8902) OR [error_number]=(41354) OR [error_number]=(41355) OR [error_number]=(41367) OR [error_number]=(41384) OR [error_number]=(41336) OR [error_number]=(41309) OR [error_number]=(41312) OR [error_number]=(41313) OR [error_number]=(33065) OR [error_number]=(33066)))), 157 | ADD EVENT sqlserver.graph_match_query_compiled, 158 | ADD EVENT sqlserver.index_build_error_event, 159 | ADD EVENT sqlserver.index_defragmentation, 160 | ADD EVENT sqlserver.interleaved_exec_status, 161 | ADD EVENT sqlserver.json_function_compiled( 162 | ACTION(sqlserver.database_id)), 163 | ADD EVENT sqlserver.missing_column_statistics, 164 | ADD EVENT sqlserver.missing_join_predicate, 165 | ADD EVENT sqlserver.natively_compiled_module_inefficiency_detected, 166 | ADD EVENT sqlserver.natively_compiled_proc_slow_parameter_passing, 167 | ADD EVENT sqlserver.query_memory_grant_blocking, 168 | ADD EVENT sqlserver.query_optimizer_compatibility_level_hint_usage, 169 | ADD EVENT sqlserver.reason_many_foreign_keys_operator_not_used, 170 | ADD EVENT sqlserver.rls_query_count, 171 | ADD EVENT sqlserver.sequence_function_used( 172 | ACTION(sqlserver.database_id)), 173 | ADD EVENT sqlserver.server_memory_change, 174 | ADD EVENT sqlserver.server_start_stop, 175 | ADD EVENT sqlserver.stretch_database_disable_completed, 176 | ADD EVENT sqlserver.stretch_database_enable_completed, 177 | ADD EVENT sqlserver.stretch_database_reauthorize_completed, 178 | ADD EVENT sqlserver.stretch_index_reconciliation_codegen_completed, 179 | ADD EVENT sqlserver.stretch_query_telemetry, 180 | ADD EVENT sqlserver.stretch_remote_column_execution_completed, 181 | ADD EVENT sqlserver.stretch_remote_column_reconciliation_codegen_completed, 182 | ADD EVENT sqlserver.stretch_remote_error, 183 | ADD EVENT sqlserver.stretch_remote_index_execution_completed, 184 | ADD EVENT sqlserver.stretch_table_alter_ddl, 185 | ADD EVENT sqlserver.stretch_table_codegen_completed, 186 | ADD EVENT sqlserver.stretch_table_create_ddl, 187 | ADD EVENT sqlserver.stretch_table_data_reconciliation_results_event, 188 | ADD EVENT sqlserver.stretch_table_hinted_admin_delete_event, 189 | ADD EVENT sqlserver.stretch_table_hinted_admin_update_event, 190 | ADD EVENT sqlserver.stretch_table_predicate_not_specified, 191 | ADD EVENT sqlserver.stretch_table_predicate_specified, 192 | ADD EVENT sqlserver.stretch_table_query_error, 193 | ADD EVENT sqlserver.stretch_table_remote_creation_completed, 194 | ADD EVENT sqlserver.stretch_table_row_migration_results_event, 195 | ADD EVENT sqlserver.stretch_table_row_unmigration_results_event, 196 | ADD EVENT sqlserver.stretch_table_unprovision_completed, 197 | ADD EVENT sqlserver.stretch_table_validation_error, 198 | ADD EVENT sqlserver.string_escape_compiled( 199 | ACTION(sqlserver.database_id)), 200 | ADD EVENT sqlserver.temporal_ddl_period_add, 201 | ADD EVENT sqlserver.temporal_ddl_period_drop, 202 | ADD EVENT sqlserver.temporal_ddl_schema_check_fail, 203 | ADD EVENT sqlserver.temporal_ddl_system_versioning, 204 | ADD EVENT sqlserver.temporal_dml_transaction_fail, 205 | ADD EVENT sqlserver.window_function_used( 206 | ACTION(sqlserver.database_id)), 207 | ADD EVENT sqlserver.xtp_alter_table, 208 | ADD EVENT sqlserver.xtp_db_delete_only_mode_updatedhktrimlsn, 209 | ADD EVENT sqlserver.xtp_stgif_container_added, 210 | ADD EVENT sqlserver.xtp_stgif_container_deleted, 211 | ADD EVENT XtpCompile.cl_duration, 212 | ADD EVENT XtpEngine.parallel_alter_stats, 213 | ADD EVENT XtpEngine.serial_alter_stats, 214 | ADD EVENT XtpEngine.xtp_db_delete_only_mode_enter, 215 | ADD EVENT XtpEngine.xtp_db_delete_only_mode_exit, 216 | ADD EVENT XtpEngine.xtp_db_delete_only_mode_update, 217 | ADD EVENT XtpEngine.xtp_physical_db_restarted 218 | ADD TARGET package0.ring_buffer(SET occurrence_number=(100)) 219 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=120 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON) 220 | GO 221 | 222 | -- logins 223 | 224 | 225 | USE master 226 | 227 | GO 228 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'app1') CREATE LOGIN [app1] WITH PASSWORD = 0x0100782FBD65E30E772B02685C41E3F69FC1E639EC77F5F4061A HASHED, SID = 0x63F51E14DBA20942AF361A3300193A7B, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 229 | GO 230 | 231 | USE master 232 | 233 | GO 234 | Grant CONNECT SQL TO [app1] AS [sa] 235 | GO 236 | 237 | USE master 238 | 239 | GO 240 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'appAdmin') CREATE LOGIN [appAdmin] WITH PASSWORD = 0x010078D465BE65DAF3B59593301B62F6199E86E70E83A542E19F HASHED, SID = 0x9243AF88BBE7B74EB83607393A9BB427, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 241 | GO 242 | 243 | USE master 244 | 245 | GO 246 | Grant CONNECT SQL TO [appAdmin] AS [sa] 247 | GO 248 | 249 | USE master 250 | 251 | GO 252 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'BUILTIN\Administrators') CREATE LOGIN [BUILTIN\Administrators] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english] 253 | GO 254 | ALTER SERVER ROLE [sysadmin] ADD MEMBER [BUILTIN\Administrators] 255 | GO 256 | 257 | USE master 258 | 259 | GO 260 | Grant CONNECT SQL TO [BUILTIN\Administrators] AS [sa] 261 | GO 262 | 263 | USE master 264 | 265 | GO 266 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'distributor_admin') CREATE LOGIN [distributor_admin] WITH PASSWORD = 0x0200A1E37336367DCA8A0D57373A5125982D7F774312E358C06DDD295A79FDC9F26509D7E95BF8D599EB0731F15D13272C5E2F504BC0B2C302BDC19F9697EAD3B442A7451083 HASHED, SID = 0x6EFAF247DFA6824EA9BA9B3ACC5949E6, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 267 | GO 268 | ALTER SERVER ROLE [sysadmin] ADD MEMBER [distributor_admin] 269 | GO 270 | 271 | USE master 272 | 273 | GO 274 | Grant CONNECT SQL TO [distributor_admin] AS [sa] 275 | GO 276 | 277 | USE master 278 | 279 | GO 280 | 281 | USE master 282 | 283 | GO 284 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'storageuser') CREATE LOGIN [storageuser] WITH PASSWORD = 0x01003A2F024897F4A96E4AC4167E6431FBB0E26A9A987644D720 HASHED, SID = 0xEA947BDFB542FC4B816012ADE47D1651, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 285 | GO 286 | 287 | USE master 288 | 289 | GO 290 | Grant CONNECT SQL TO [storageuser] AS [sa] 291 | GO 292 | 293 | USE master 294 | 295 | GO 296 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'testlogin') CREATE LOGIN [testlogin] WITH PASSWORD = 0x02002E0CB89BE6A3118A65BE3B9BA53C98854361125B5722FAC66E9E32A6A996537E6E3556BCC09C4D0807650FD6753AA61881DAEE0C4AE962856EA17E0DDF2DFABBFC65BC34 HASHED, SID = 0x7612E56A4CAB2C468A7D24736564C6F7, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [Dansk] 297 | GO 298 | 299 | USE master 300 | 301 | GO 302 | Grant CONNECT SQL TO [testlogin] AS [sa] 303 | GO 304 | 305 | USE master 306 | 307 | GO 308 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'TestOrphan1') CREATE LOGIN [TestOrphan1] WITH PASSWORD = 0x0100479BFEEE79E83E8B847AAF33CD9A04B439ED43476C20BDDE HASHED, SID = 0xF1BACB136DD3764C9CE200E49041A0C2, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 309 | GO 310 | 311 | USE master 312 | 313 | GO 314 | Grant CONNECT SQL TO [TestOrphan1] AS [sa] 315 | GO 316 | 317 | USE master 318 | 319 | GO 320 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'TestOrphan2') CREATE LOGIN [TestOrphan2] WITH PASSWORD = 0x01000698EFA5455FE8F1C91429ECA4FE9CBFEFB953F1C08F96D5 HASHED, SID = 0x299C2102F657B4458F75653CB19A54A3, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 321 | GO 322 | 323 | USE master 324 | 325 | GO 326 | Grant CONNECT SQL TO [TestOrphan2] AS [sa] 327 | GO 328 | 329 | USE master 330 | 331 | GO 332 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'testuser2') CREATE LOGIN [testuser2] WITH PASSWORD = 0x0200DB112FF49345FC8DBE87F1F093429E5FCB4197F1E18D92D1594172843CE5CDA3B3DF269E2962D977EB60DFC855EAB774085069B43C408B3228A8EC20D4F2CE9775A0C0D7 HASHED, SID = 0xF959ADF337EF1149977812AD7969837C, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 333 | GO 334 | ALTER LOGIN [testuser2] DISABLE 335 | GO 336 | DENY CONNECT SQL TO [testuser2] 337 | GO 338 | ALTER SERVER ROLE [setupadmin] ADD MEMBER [testuser2] 339 | GO 340 | 341 | USE master 342 | 343 | GO 344 | Deny CONNECT SQL TO [testuser2] AS [sa] 345 | GO 346 | 347 | USE master 348 | 349 | GO 350 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'webuser') CREATE LOGIN [webuser] WITH PASSWORD = 0x0100162F297ABC8257F6431EA4FC8B776D42EFE04D6023211A08 HASHED, SID = 0x199A7A25579A3E4193A59299130DB683, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 351 | GO 352 | ALTER SERVER ROLE [dbcreator] ADD MEMBER [webuser] 353 | GO 354 | ALTER SERVER ROLE [processadmin] ADD MEMBER [webuser] 355 | GO 356 | 357 | USE master 358 | 359 | GO 360 | Grant CONNECT SQL TO [webuser] AS [sa] 361 | GO 362 | 363 | -- policy management 364 | 365 | Declare @condition_id int 366 | EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'AppRoles', @description=N'', @facet=N'ApplicationRole', @expression=N' 367 | Bool 368 | EQ 369 | 2 370 | 371 | DateTime 372 | DateLastModified 373 | 374 | 375 | DateTime 376 | DateTime 377 | DateTime 378 | 1 379 | 380 | String 381 | System.String 382 | 2016-05-03T00:00:00.0000000 383 | 384 | 385 | ', @is_name_condition=0, @obj_name=N'', @condition_id=@condition_id OUTPUT 386 | Select @condition_id 387 | 388 | GO 389 | 390 | Declare @object_set_id int 391 | EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'xp_cmdshell must be disabled_ObjectSet', @facet=N'ApplicationRole', @object_set_id=@object_set_id OUTPUT 392 | Select @object_set_id 393 | Declare @target_set_id int 394 | EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'xp_cmdshell must be disabled_ObjectSet', @type_skeleton=N'Server/Database/ApplicationRole', @type=N'APPLICATION ROLE', @enabled=True, @target_set_id=@target_set_id OUTPUT 395 | Select @target_set_id 396 | 397 | EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/ApplicationRole', @level_name=N'ApplicationRole', @condition_name=N'', @target_set_level_id=0 398 | EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0 399 | 400 | GO 401 | 402 | Declare @policy_id int 403 | EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'xp_cmdshell must be disabled', @condition_name=N'AppRoles', @policy_category=N'', @description=N'', @help_text=N'', @help_link=N'', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=2, @is_enabled=True, @policy_id=@policy_id OUTPUT, @root_condition_name=N'', @object_set=N'xp_cmdshell must be disabled_ObjectSet' 404 | Select @policy_id 405 | 406 | GO 407 | 408 | 409 | -- Resource Gov, I dunno 410 | 411 | 412 | ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL); 413 | GO 414 | 415 | ALTER RESOURCE GOVERNOR WITH (MAX_OUTSTANDING_IO_PER_VOLUME = DEFAULT); 416 | GO 417 | 418 | ALTER RESOURCE GOVERNOR RECONFIGURE; 419 | GO 420 | 421 | -- some roles 422 | 423 | 424 | CREATE SERVER ROLE [Endpoint-Admins] 425 | GO 426 | 427 | ALTER SERVER ROLE [dbcreator] ADD MEMBER [Endpoint-Admins] 428 | GO 429 | 430 | -- triggers 431 | 432 | CREATE TRIGGER [tr_MScdc_db_ddl_event] on all server for ALTER_DATABASE, DROP_DATABASE 433 | as 434 | set ANSI_NULLS ON 435 | set ANSI_PADDING ON 436 | set ANSI_WARNINGS ON 437 | set ARITHABORT ON 438 | set CONCAT_NULL_YIELDS_NULL ON 439 | set NUMERIC_ROUNDABORT OFF 440 | set QUOTED_IDENTIFIER ON 441 | 442 | declare @EventData xml, @retcode int 443 | set @EventData=EventData() 444 | if object_id('sys.sp_MScdc_db_ddl_event' ) is not null 445 | begin 446 | exec @retcode = sys.sp_MScdc_db_ddl_event @EventData 447 | if @@error <> 0 or @retcode <> 0 448 | begin 449 | rollback tran 450 | end 451 | end 452 | 453 | GO 454 | 455 | GO 456 | ENABLE TRIGGER [tr_MScdc_db_ddl_event] ON ALL SERVER 457 | GO 458 | 459 | -- spconfigure 460 | 461 | EXEC sp_configure 'show advanced options' , 1; RECONFIGURE WITH OVERRIDE 462 | EXEC sp_configure 'recovery interval (min)' , 0; 463 | EXEC sp_configure 'allow updates' , 0; 464 | EXEC sp_configure 'user connections' , 0; 465 | EXEC sp_configure 'locks' , 0; 466 | EXEC sp_configure 'open objects' , 0; 467 | EXEC sp_configure 'fill factor (%)' , 0; 468 | EXEC sp_configure 'disallow results from triggers' , 0; 469 | EXEC sp_configure 'nested triggers' , 1; 470 | EXEC sp_configure 'server trigger recursion' , 1; 471 | EXEC sp_configure 'remote access' , 1; 472 | EXEC sp_configure 'default language' , 0; 473 | EXEC sp_configure 'cross db ownership chaining' , 0; 474 | EXEC sp_configure 'max worker threads' , 0; 475 | EXEC sp_configure 'network packet size (B)' , 4096; 476 | EXEC sp_configure 'show advanced options' , 1; 477 | EXEC sp_configure 'remote proc trans' , 0; 478 | EXEC sp_configure 'c2 audit mode' , 0; 479 | EXEC sp_configure 'default full-text language' , 1033; 480 | EXEC sp_configure 'two digit year cutoff' , 2049; 481 | EXEC sp_configure 'index create memory (KB)' , 0; 482 | EXEC sp_configure 'remote login timeout (s)' , 20; 483 | EXEC sp_configure 'remote query timeout (s)' , 600; 484 | EXEC sp_configure 'cursor threshold' , -1; 485 | EXEC sp_configure 'user options' , 0; 486 | EXEC sp_configure 'affinity mask' , 0; 487 | EXEC sp_configure 'max text repl size (B)' , 65536; 488 | EXEC sp_configure 'media retention' , 0; 489 | EXEC sp_configure 'cost threshold for parallelism' , 5; 490 | EXEC sp_configure 'max degree of parallelism' , 2; 491 | EXEC sp_configure 'min memory per query (KB)' , 1024; 492 | EXEC sp_configure 'query wait (s)' , -1; 493 | EXEC sp_configure 'min server memory (MB)' , 0; 494 | EXEC sp_configure 'max server memory (MB)' , 3072; 495 | EXEC sp_configure 'query governor cost limit' , 0; 496 | EXEC sp_configure 'lightweight pooling' , 0; 497 | EXEC sp_configure 'scan for startup procs' , 0; 498 | EXEC sp_configure 'affinity64 mask' , 0; 499 | EXEC sp_configure 'affinity I/O mask' , 0; 500 | EXEC sp_configure 'affinity64 I/O mask' , 0; 501 | EXEC sp_configure 'transform noise words' , 0; 502 | EXEC sp_configure 'precompute rank' , 0; 503 | EXEC sp_configure 'PH timeout (s)' , 60; 504 | EXEC sp_configure 'clr enabled' , 1; 505 | EXEC sp_configure 'max full-text crawl range' , 4; 506 | EXEC sp_configure 'ft notify bandwidth (min)' , 0; 507 | EXEC sp_configure 'ft notify bandwidth (max)' , 100; 508 | EXEC sp_configure 'ft crawl bandwidth (min)' , 0; 509 | EXEC sp_configure 'ft crawl bandwidth (max)' , 100; 510 | EXEC sp_configure 'default trace enabled' , 1; 511 | EXEC sp_configure 'blocked process threshold (s)' , 5; 512 | EXEC sp_configure 'in-doubt xact resolution' , 0; 513 | EXEC sp_configure 'remote admin connections' , 0; 514 | EXEC sp_configure 'common criteria compliance enabled' , 0; 515 | EXEC sp_configure 'EKM provider enabled' , 0; 516 | EXEC sp_configure 'backup compression default' , 0; 517 | EXEC sp_configure 'optimize for ad hoc workloads' , 1; 518 | EXEC sp_configure 'access check cache bucket count' , 0; 519 | EXEC sp_configure 'access check cache quota' , 0; 520 | EXEC sp_configure 'backup checksum default' , 0; 521 | EXEC sp_configure 'automatic soft-NUMA disabled' , 0; 522 | EXEC sp_configure 'external scripts enabled' , 0; 523 | EXEC sp_configure 'clr strict security' , 1; 524 | EXEC sp_configure 'Agent XPs' , 1; 525 | EXEC sp_configure 'Database Mail XPs' , 0; 526 | EXEC sp_configure 'Ad Hoc Distributed Queries' , 0; 527 | EXEC sp_configure 'Replication XPs' , 0; 528 | EXEC sp_configure 'contained database authentication' , 1; 529 | EXEC sp_configure 'hadoop connectivity' , 0; 530 | EXEC sp_configure 'polybase network encryption' , 1; 531 | EXEC sp_configure 'remote data archive' , 0; 532 | EXEC sp_configure 'allow polybase export' , 0; 533 | 534 | -- tons of agent stuff 535 | 536 | EXEC msdb.dbo.sp_add_operator @name=N'MSXOperator', 537 | @enabled=1, 538 | @weekday_pager_start_time=90000, 539 | @weekday_pager_end_time=180000, 540 | @saturday_pager_start_time=90000, 541 | @saturday_pager_end_time=180000, 542 | @sunday_pager_start_time=90000, 543 | @sunday_pager_end_time=180000, 544 | @pager_days=0, 545 | @email_address=N'dbadistro@ad.local', 546 | @category_name=N'[Uncategorized]' 547 | GO 548 | 549 | EXEC msdb.dbo.sp_add_operator @name=N'The DBA Team', 550 | @enabled=1, 551 | @weekday_pager_start_time=90000, 552 | @weekday_pager_end_time=180000, 553 | @saturday_pager_start_time=90000, 554 | @saturday_pager_end_time=180000, 555 | @sunday_pager_start_time=90000, 556 | @sunday_pager_end_time=180000, 557 | @pager_days=0, 558 | @email_address=N'dbadistro@ad.local', 559 | @category_name=N'[Uncategorized]' 560 | GO 561 | 562 | EXEC msdb.dbo.sp_add_alert @name=N'Error Number 823', 563 | @message_id=823, 564 | @severity=0, 565 | @enabled=0, 566 | @delay_between_responses=60, 567 | @include_event_description_in=1, 568 | @category_name=N'[Uncategorized]', 569 | @job_id=N'00000000-0000-0000-0000-000000000000' 570 | GO 571 | 572 | EXEC msdb.dbo.sp_add_alert @name=N'Error Number 824', 573 | @message_id=824, 574 | @severity=0, 575 | @enabled=0, 576 | @delay_between_responses=60, 577 | @include_event_description_in=1, 578 | @category_name=N'[Uncategorized]', 579 | @job_id=N'00000000-0000-0000-0000-000000000000' 580 | GO 581 | 582 | EXEC msdb.dbo.sp_add_alert @name=N'Error Number 825', 583 | @message_id=825, 584 | @severity=0, 585 | @enabled=0, 586 | @delay_between_responses=60, 587 | @include_event_description_in=1, 588 | @category_name=N'[Uncategorized]', 589 | @job_id=N'00000000-0000-0000-0000-000000000000' 590 | GO 591 | 592 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Long merge over dialup connection (Threshold: mergeslowrunduration)', 593 | @message_id=14163, 594 | @severity=0, 595 | @enabled=1, 596 | @delay_between_responses=30, 597 | @include_event_description_in=5, 598 | @category_name=N'Replication', 599 | @job_id=N'00000000-0000-0000-0000-000000000000' 600 | GO 601 | 602 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Long merge over LAN connection (Threshold: mergefastrunduration)', 603 | @message_id=14162, 604 | @severity=0, 605 | @enabled=1, 606 | @delay_between_responses=30, 607 | @include_event_description_in=5, 608 | @category_name=N'Replication', 609 | @job_id=N'00000000-0000-0000-0000-000000000000' 610 | GO 611 | 612 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Slow merge over dialup connection (Threshold: mergeslowrunspeed)', 613 | @message_id=14165, 614 | @severity=0, 615 | @enabled=1, 616 | @delay_between_responses=30, 617 | @include_event_description_in=5, 618 | @category_name=N'Replication', 619 | @job_id=N'00000000-0000-0000-0000-000000000000' 620 | GO 621 | 622 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Slow merge over LAN connection (Threshold: mergefastrunspeed)', 623 | @message_id=14164, 624 | @severity=0, 625 | @enabled=1, 626 | @delay_between_responses=30, 627 | @include_event_description_in=5, 628 | @category_name=N'Replication', 629 | @job_id=N'00000000-0000-0000-0000-000000000000' 630 | GO 631 | 632 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Subscription expiration (Threshold: expiration)', 633 | @message_id=14160, 634 | @severity=0, 635 | @enabled=1, 636 | @delay_between_responses=30, 637 | @include_event_description_in=5, 638 | @category_name=N'Replication', 639 | @job_id=N'00000000-0000-0000-0000-000000000000' 640 | GO 641 | 642 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Transactional replication latency (Threshold: latency)', 643 | @message_id=14161, 644 | @severity=0, 645 | @enabled=1, 646 | @delay_between_responses=30, 647 | @include_event_description_in=5, 648 | @category_name=N'Replication', 649 | @job_id=N'00000000-0000-0000-0000-000000000000' 650 | GO 651 | 652 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent custom shutdown', 653 | @message_id=20578, 654 | @severity=0, 655 | @enabled=0, 656 | @delay_between_responses=0, 657 | @include_event_description_in=5, 658 | @category_name=N'Replication', 659 | @job_id=N'00000000-0000-0000-0000-000000000000' 660 | GO 661 | 662 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent failure', 663 | @message_id=14151, 664 | @severity=0, 665 | @enabled=0, 666 | @delay_between_responses=0, 667 | @include_event_description_in=5, 668 | @category_name=N'Replication', 669 | @job_id=N'00000000-0000-0000-0000-000000000000' 670 | GO 671 | 672 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent retry', 673 | @message_id=14152, 674 | @severity=0, 675 | @enabled=0, 676 | @delay_between_responses=0, 677 | @include_event_description_in=5, 678 | @category_name=N'Replication', 679 | @job_id=N'00000000-0000-0000-0000-000000000000' 680 | GO 681 | 682 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent success', 683 | @message_id=14150, 684 | @severity=0, 685 | @enabled=0, 686 | @delay_between_responses=0, 687 | @include_event_description_in=5, 688 | @category_name=N'Replication', 689 | @job_id=N'00000000-0000-0000-0000-000000000000' 690 | GO 691 | 692 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: Subscriber has failed data validation', 693 | @message_id=20574, 694 | @severity=0, 695 | @enabled=0, 696 | @delay_between_responses=0, 697 | @include_event_description_in=5, 698 | @category_name=N'Replication', 699 | @job_id=N'00000000-0000-0000-0000-000000000000' 700 | GO 701 | 702 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: Subscriber has passed data validation', 703 | @message_id=20575, 704 | @severity=0, 705 | @enabled=0, 706 | @delay_between_responses=0, 707 | @include_event_description_in=5, 708 | @category_name=N'Replication', 709 | @job_id=N'00000000-0000-0000-0000-000000000000' 710 | GO 711 | 712 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: Subscription reinitialized after validation failure', 713 | @message_id=20572, 714 | @severity=0, 715 | @enabled=0, 716 | @delay_between_responses=0, 717 | @include_event_description_in=5, 718 | @category_name=N'Replication', 719 | @job_id=N'00000000-0000-0000-0000-000000000000' 720 | GO 721 | 722 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 016', 723 | @message_id=0, 724 | @severity=16, 725 | @enabled=0, 726 | @delay_between_responses=60, 727 | @include_event_description_in=1, 728 | @category_name=N'[Uncategorized]', 729 | @job_id=N'00000000-0000-0000-0000-000000000000' 730 | GO 731 | 732 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 017', 733 | @message_id=0, 734 | @severity=17, 735 | @enabled=0, 736 | @delay_between_responses=60, 737 | @include_event_description_in=1, 738 | @category_name=N'[Uncategorized]', 739 | @job_id=N'00000000-0000-0000-0000-000000000000' 740 | GO 741 | 742 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 018', 743 | @message_id=0, 744 | @severity=18, 745 | @enabled=0, 746 | @delay_between_responses=60, 747 | @include_event_description_in=1, 748 | @category_name=N'[Uncategorized]', 749 | @job_id=N'00000000-0000-0000-0000-000000000000' 750 | GO 751 | 752 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 019', 753 | @message_id=0, 754 | @severity=19, 755 | @enabled=0, 756 | @delay_between_responses=60, 757 | @include_event_description_in=1, 758 | @category_name=N'[Uncategorized]', 759 | @job_id=N'00000000-0000-0000-0000-000000000000' 760 | GO 761 | 762 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 020', 763 | @message_id=0, 764 | @severity=20, 765 | @enabled=0, 766 | @delay_between_responses=60, 767 | @include_event_description_in=1, 768 | @category_name=N'[Uncategorized]', 769 | @job_id=N'00000000-0000-0000-0000-000000000000' 770 | GO 771 | 772 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 021', 773 | @message_id=0, 774 | @severity=21, 775 | @enabled=1, 776 | @delay_between_responses=60, 777 | @include_event_description_in=1, 778 | @category_name=N'[Uncategorized]', 779 | @job_id=N'00000000-0000-0000-0000-000000000000' 780 | GO 781 | 782 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 022', 783 | @message_id=0, 784 | @severity=22, 785 | @enabled=1, 786 | @delay_between_responses=60, 787 | @include_event_description_in=1, 788 | @category_name=N'[Uncategorized]', 789 | @job_id=N'00000000-0000-0000-0000-000000000000' 790 | GO 791 | 792 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 023', 793 | @message_id=0, 794 | @severity=23, 795 | @enabled=1, 796 | @delay_between_responses=60, 797 | @include_event_description_in=1, 798 | @category_name=N'[Uncategorized]', 799 | @job_id=N'00000000-0000-0000-0000-000000000000' 800 | GO 801 | 802 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 024', 803 | @message_id=0, 804 | @severity=24, 805 | @enabled=1, 806 | @delay_between_responses=60, 807 | @include_event_description_in=1, 808 | @category_name=N'[Uncategorized]', 809 | @job_id=N'00000000-0000-0000-0000-000000000000' 810 | GO 811 | 812 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 025', 813 | @message_id=0, 814 | @severity=25, 815 | @enabled=1, 816 | @delay_between_responses=60, 817 | @include_event_description_in=1, 818 | @category_name=N'[Uncategorized]', 819 | @job_id=N'00000000-0000-0000-0000-000000000000' 820 | GO 821 | 822 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_10min', 823 | @enabled=1, 824 | @freq_type=4, 825 | @freq_interval=1, 826 | @freq_subday_type=4, 827 | @freq_subday_interval=10, 828 | @freq_relative_interval=0, 829 | @freq_recurrence_factor=0, 830 | @active_start_date=20180914, 831 | @active_end_date=99991231, 832 | @active_start_time=0, 833 | @active_end_time=235959, 834 | @schedule_uid=N'7a263d89-1223-48a1-a9f5-7b63e8c4f336' 835 | GO 836 | 837 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_10min', 838 | @enabled=1, 839 | @freq_type=4, 840 | @freq_interval=1, 841 | @freq_subday_type=4, 842 | @freq_subday_interval=10, 843 | @freq_relative_interval=0, 844 | @freq_recurrence_factor=0, 845 | @active_start_date=20100402, 846 | @active_end_date=99991231, 847 | @active_start_time=0, 848 | @active_end_time=235959, 849 | @schedule_uid=N'41a6d121-6b6c-4899-98de-acf704d14f5d' 850 | GO 851 | 852 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_15min', 853 | @enabled=1, 854 | @freq_type=4, 855 | @freq_interval=1, 856 | @freq_subday_type=4, 857 | @freq_subday_interval=15, 858 | @freq_relative_interval=0, 859 | @freq_recurrence_factor=0, 860 | @active_start_date=20100402, 861 | @active_end_date=99991231, 862 | @active_start_time=0, 863 | @active_end_time=235959, 864 | @schedule_uid=N'0772cf28-c787-435e-a5ed-dda1a86df02d' 865 | GO 866 | 867 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_15min', 868 | @enabled=1, 869 | @freq_type=4, 870 | @freq_interval=1, 871 | @freq_subday_type=4, 872 | @freq_subday_interval=15, 873 | @freq_relative_interval=0, 874 | @freq_recurrence_factor=0, 875 | @active_start_date=20180914, 876 | @active_end_date=99991231, 877 | @active_start_time=0, 878 | @active_end_time=235959, 879 | @schedule_uid=N'0a6139ff-a28c-48d1-8dca-47e24a87f5eb' 880 | GO 881 | 882 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_30min', 883 | @enabled=1, 884 | @freq_type=4, 885 | @freq_interval=1, 886 | @freq_subday_type=4, 887 | @freq_subday_interval=30, 888 | @freq_relative_interval=0, 889 | @freq_recurrence_factor=0, 890 | @active_start_date=20180914, 891 | @active_end_date=99991231, 892 | @active_start_time=0, 893 | @active_end_time=235959, 894 | @schedule_uid=N'6da2a147-9c77-4146-9932-c640ec187d01' 895 | GO 896 | 897 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_30min', 898 | @enabled=1, 899 | @freq_type=4, 900 | @freq_interval=1, 901 | @freq_subday_type=4, 902 | @freq_subday_interval=30, 903 | @freq_relative_interval=0, 904 | @freq_recurrence_factor=0, 905 | @active_start_date=20100402, 906 | @active_end_date=99991231, 907 | @active_start_time=0, 908 | @active_end_time=235959, 909 | @schedule_uid=N'c40e90de-5ecc-4b89-9df8-424dd6160a0a' 910 | GO 911 | 912 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_5min', 913 | @enabled=1, 914 | @freq_type=4, 915 | @freq_interval=1, 916 | @freq_subday_type=4, 917 | @freq_subday_interval=5, 918 | @freq_relative_interval=0, 919 | @freq_recurrence_factor=0, 920 | @active_start_date=20100402, 921 | @active_end_date=99991231, 922 | @active_start_time=0, 923 | @active_end_time=235959, 924 | @schedule_uid=N'a575ffd0-98a0-4d0e-b43c-b63482fb5b00' 925 | GO 926 | 927 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_5min', 928 | @enabled=1, 929 | @freq_type=4, 930 | @freq_interval=1, 931 | @freq_subday_type=4, 932 | @freq_subday_interval=5, 933 | @freq_relative_interval=0, 934 | @freq_recurrence_factor=0, 935 | @active_start_date=20180914, 936 | @active_end_date=99991231, 937 | @active_start_time=0, 938 | @active_end_time=235959, 939 | @schedule_uid=N'e9d74ad4-c27d-4d6c-8c17-439572742a97' 940 | GO 941 | 942 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_60min', 943 | @enabled=1, 944 | @freq_type=4, 945 | @freq_interval=1, 946 | @freq_subday_type=4, 947 | @freq_subday_interval=60, 948 | @freq_relative_interval=0, 949 | @freq_recurrence_factor=0, 950 | @active_start_date=20100402, 951 | @active_end_date=99991231, 952 | @active_start_time=0, 953 | @active_end_time=235959, 954 | @schedule_uid=N'fd8ac6c3-1b03-4781-8e63-e4b2fa680995' 955 | GO 956 | 957 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_60min', 958 | @enabled=1, 959 | @freq_type=4, 960 | @freq_interval=1, 961 | @freq_subday_type=4, 962 | @freq_subday_interval=60, 963 | @freq_relative_interval=0, 964 | @freq_recurrence_factor=0, 965 | @active_start_date=20180914, 966 | @active_end_date=99991231, 967 | @active_start_time=0, 968 | @active_end_time=235959, 969 | @schedule_uid=N'89b3db93-fe2a-4ae7-bc88-fa0bcca45f29' 970 | GO 971 | 972 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_6h', 973 | @enabled=1, 974 | @freq_type=4, 975 | @freq_interval=1, 976 | @freq_subday_type=8, 977 | @freq_subday_interval=6, 978 | @freq_relative_interval=0, 979 | @freq_recurrence_factor=0, 980 | @active_start_date=20180914, 981 | @active_end_date=99991231, 982 | @active_start_time=0, 983 | @active_end_time=235959, 984 | @schedule_uid=N'66aa8120-b988-433d-a766-0d05ba17831c' 985 | GO 986 | 987 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_6h', 988 | @enabled=1, 989 | @freq_type=4, 990 | @freq_interval=1, 991 | @freq_subday_type=8, 992 | @freq_subday_interval=6, 993 | @freq_relative_interval=0, 994 | @freq_recurrence_factor=0, 995 | @active_start_date=20100402, 996 | @active_end_date=99991231, 997 | @active_start_time=0, 998 | @active_end_time=235959, 999 | @schedule_uid=N'6a04ee27-167a-47a1-aecb-2317d8229028' 1000 | GO 1001 | 1002 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'RunAsSQLAgentServiceStartSchedule', 1003 | @enabled=1, 1004 | @freq_type=64, 1005 | @freq_interval=0, 1006 | @freq_subday_type=0, 1007 | @freq_subday_interval=0, 1008 | @freq_relative_interval=0, 1009 | @freq_recurrence_factor=0, 1010 | @active_start_date=20100402, 1011 | @active_end_date=99991231, 1012 | @active_start_time=0, 1013 | @active_end_time=235959, 1014 | @schedule_uid=N'a8240410-145c-459f-99c1-05df5b707256' 1015 | GO 1016 | 1017 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'RunAsSQLAgentServiceStartSchedule', 1018 | @enabled=1, 1019 | @freq_type=64, 1020 | @freq_interval=0, 1021 | @freq_subday_type=0, 1022 | @freq_subday_interval=0, 1023 | @freq_relative_interval=0, 1024 | @freq_recurrence_factor=0, 1025 | @active_start_date=20180914, 1026 | @active_end_date=99991231, 1027 | @active_start_time=0, 1028 | @active_end_time=235959, 1029 | @schedule_uid=N'3f66a6ae-280d-4aff-9691-c9028d272b27' 1030 | GO 1031 | 1032 | BEGIN TRANSACTION 1033 | DECLARE @ReturnCode INT 1034 | SELECT @ReturnCode = 0 1035 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1036 | BEGIN 1037 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1038 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1039 | 1040 | END 1041 | 1042 | DECLARE @jobId BINARY(16) 1043 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'CommandLog Cleanup', 1044 | @enabled=1, 1045 | @notify_level_eventlog=2, 1046 | @notify_level_email=0, 1047 | @notify_level_netsend=0, 1048 | @notify_level_page=0, 1049 | @delete_level=0, 1050 | @description=N'Source: https://ola.hallengren.com', 1051 | @category_name=N'Database Maintenance', 1052 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1053 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1054 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'CommandLog Cleanup', 1055 | @step_id=1, 1056 | @cmdexec_success_code=0, 1057 | @on_success_action=1, 1058 | @on_success_step_id=0, 1059 | @on_fail_action=2, 1060 | @on_fail_step_id=0, 1061 | @retry_attempts=0, 1062 | @retry_interval=0, 1063 | @os_run_priority=0, @subsystem=N'TSQL', 1064 | @command=N'DELETE FROM [dbo].[CommandLog] 1065 | WHERE StartTime < DATEADD(dd,-30,GETDATE())', 1066 | @database_name=N'master', 1067 | @flags=0 1068 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1069 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1070 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1071 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1072 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1073 | COMMIT TRANSACTION 1074 | GOTO EndSave 1075 | QuitWithRollback: 1076 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1077 | EndSave: 1078 | 1079 | GO 1080 | 1081 | BEGIN TRANSACTION 1082 | DECLARE @ReturnCode INT 1083 | SELECT @ReturnCode = 0 1084 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1085 | BEGIN 1086 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1087 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1088 | 1089 | END 1090 | 1091 | DECLARE @jobId BINARY(16) 1092 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - SYSTEM_DATABASES - FULL', 1093 | @enabled=1, 1094 | @notify_level_eventlog=2, 1095 | @notify_level_email=0, 1096 | @notify_level_netsend=0, 1097 | @notify_level_page=0, 1098 | @delete_level=0, 1099 | @description=N'Source: https://ola.hallengren.com', 1100 | @category_name=N'Database Maintenance', 1101 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1102 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1103 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - SYSTEM_DATABASES - FULL', 1104 | @step_id=1, 1105 | @cmdexec_success_code=0, 1106 | @on_success_action=1, 1107 | @on_success_step_id=0, 1108 | @on_fail_action=2, 1109 | @on_fail_step_id=0, 1110 | @retry_attempts=0, 1111 | @retry_interval=0, 1112 | @os_run_priority=0, @subsystem=N'TSQL', 1113 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1114 | @Databases = ''SYSTEM_DATABASES'', 1115 | @Directory = N''\\nas\sqlbackups'', 1116 | @BackupType = ''FULL'', 1117 | @Verify = ''Y'', 1118 | @CleanupTime = NULL, 1119 | @CheckSum = ''Y'', 1120 | @LogToTable = ''N''', 1121 | @database_name=N'master', 1122 | @flags=0 1123 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1124 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1125 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1126 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1127 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1128 | COMMIT TRANSACTION 1129 | GOTO EndSave 1130 | QuitWithRollback: 1131 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1132 | EndSave: 1133 | 1134 | GO 1135 | 1136 | BEGIN TRANSACTION 1137 | DECLARE @ReturnCode INT 1138 | SELECT @ReturnCode = 0 1139 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1140 | BEGIN 1141 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1142 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1143 | 1144 | END 1145 | 1146 | DECLARE @jobId BINARY(16) 1147 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - USER_DATABASES - DIFF', 1148 | @enabled=1, 1149 | @notify_level_eventlog=2, 1150 | @notify_level_email=0, 1151 | @notify_level_netsend=0, 1152 | @notify_level_page=0, 1153 | @delete_level=0, 1154 | @description=N'Source: https://ola.hallengren.com', 1155 | @category_name=N'Database Maintenance', 1156 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1157 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1158 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - USER_DATABASES - DIFF', 1159 | @step_id=1, 1160 | @cmdexec_success_code=0, 1161 | @on_success_action=1, 1162 | @on_success_step_id=0, 1163 | @on_fail_action=2, 1164 | @on_fail_step_id=0, 1165 | @retry_attempts=0, 1166 | @retry_interval=0, 1167 | @os_run_priority=0, @subsystem=N'TSQL', 1168 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1169 | @Databases = ''USER_DATABASES'', 1170 | @Directory = N''\\nas\sqlbackups'', 1171 | @BackupType = ''DIFF'', 1172 | @Verify = ''Y'', 1173 | @CleanupTime = NULL, 1174 | @CheckSum = ''Y'', 1175 | @LogToTable = ''N''', 1176 | @database_name=N'master', 1177 | @flags=0 1178 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1179 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1180 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1181 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1182 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1183 | COMMIT TRANSACTION 1184 | GOTO EndSave 1185 | QuitWithRollback: 1186 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1187 | EndSave: 1188 | 1189 | GO 1190 | 1191 | BEGIN TRANSACTION 1192 | DECLARE @ReturnCode INT 1193 | SELECT @ReturnCode = 0 1194 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1195 | BEGIN 1196 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1197 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1198 | 1199 | END 1200 | 1201 | DECLARE @jobId BINARY(16) 1202 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - USER_DATABASES - FULL', 1203 | @enabled=1, 1204 | @notify_level_eventlog=2, 1205 | @notify_level_email=0, 1206 | @notify_level_netsend=0, 1207 | @notify_level_page=0, 1208 | @delete_level=0, 1209 | @description=N'Source: https://ola.hallengren.com', 1210 | @category_name=N'Database Maintenance', 1211 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1212 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1213 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - USER_DATABASES - FULL', 1214 | @step_id=1, 1215 | @cmdexec_success_code=0, 1216 | @on_success_action=1, 1217 | @on_success_step_id=0, 1218 | @on_fail_action=2, 1219 | @on_fail_step_id=0, 1220 | @retry_attempts=0, 1221 | @retry_interval=0, 1222 | @os_run_priority=0, @subsystem=N'TSQL', 1223 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1224 | @Databases = ''USER_DATABASES'', 1225 | @Directory = N''\\nas\sqlbackups'', 1226 | @BackupType = ''FULL'', 1227 | @Verify = ''Y'', 1228 | @CleanupTime = NULL, 1229 | @CheckSum = ''Y'', 1230 | @LogToTable = ''N''', 1231 | @database_name=N'master', 1232 | @flags=0 1233 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1234 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1235 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1236 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1237 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1238 | COMMIT TRANSACTION 1239 | GOTO EndSave 1240 | QuitWithRollback: 1241 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1242 | EndSave: 1243 | 1244 | GO 1245 | 1246 | BEGIN TRANSACTION 1247 | DECLARE @ReturnCode INT 1248 | SELECT @ReturnCode = 0 1249 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1250 | BEGIN 1251 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1252 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1253 | 1254 | END 1255 | 1256 | DECLARE @jobId BINARY(16) 1257 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - USER_DATABASES - LOG', 1258 | @enabled=1, 1259 | @notify_level_eventlog=2, 1260 | @notify_level_email=0, 1261 | @notify_level_netsend=0, 1262 | @notify_level_page=0, 1263 | @delete_level=0, 1264 | @description=N'Source: https://ola.hallengren.com', 1265 | @category_name=N'Database Maintenance', 1266 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1267 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1268 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - USER_DATABASES - LOG', 1269 | @step_id=1, 1270 | @cmdexec_success_code=0, 1271 | @on_success_action=1, 1272 | @on_success_step_id=0, 1273 | @on_fail_action=2, 1274 | @on_fail_step_id=0, 1275 | @retry_attempts=0, 1276 | @retry_interval=0, 1277 | @os_run_priority=0, @subsystem=N'TSQL', 1278 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1279 | @Databases = ''USER_DATABASES'', 1280 | @Directory = N''\\nas\sqlbackups'', 1281 | @BackupType = ''LOG'', 1282 | @Verify = ''Y'', 1283 | @CleanupTime = NULL, 1284 | @CheckSum = ''Y'', 1285 | @LogToTable = ''N''', 1286 | @database_name=N'master', 1287 | @flags=0 1288 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1289 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1290 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1291 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1292 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1293 | COMMIT TRANSACTION 1294 | GOTO EndSave 1295 | QuitWithRollback: 1296 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1297 | EndSave: 1298 | 1299 | GO 1300 | 1301 | BEGIN TRANSACTION 1302 | DECLARE @ReturnCode INT 1303 | SELECT @ReturnCode = 0 1304 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1305 | BEGIN 1306 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1307 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1308 | 1309 | END 1310 | 1311 | DECLARE @jobId BINARY(16) 1312 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseIntegrityCheck - SYSTEM_DATABASES', 1313 | @enabled=1, 1314 | @notify_level_eventlog=2, 1315 | @notify_level_email=0, 1316 | @notify_level_netsend=0, 1317 | @notify_level_page=0, 1318 | @delete_level=0, 1319 | @description=N'Source: https://ola.hallengren.com', 1320 | @category_name=N'Database Maintenance', 1321 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1322 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1323 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseIntegrityCheck - SYSTEM_DATABASES', 1324 | @step_id=1, 1325 | @cmdexec_success_code=0, 1326 | @on_success_action=1, 1327 | @on_success_step_id=0, 1328 | @on_fail_action=2, 1329 | @on_fail_step_id=0, 1330 | @retry_attempts=0, 1331 | @retry_interval=0, 1332 | @os_run_priority=0, @subsystem=N'TSQL', 1333 | @command=N'EXECUTE [dbo].[DatabaseIntegrityCheck] 1334 | @Databases = ''SYSTEM_DATABASES'', 1335 | @LogToTable = ''N''', 1336 | @database_name=N'master', 1337 | @flags=0 1338 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1339 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1340 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1341 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1342 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1343 | COMMIT TRANSACTION 1344 | GOTO EndSave 1345 | QuitWithRollback: 1346 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1347 | EndSave: 1348 | 1349 | GO 1350 | 1351 | BEGIN TRANSACTION 1352 | DECLARE @ReturnCode INT 1353 | SELECT @ReturnCode = 0 1354 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1355 | BEGIN 1356 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1357 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1358 | 1359 | END 1360 | 1361 | DECLARE @jobId BINARY(16) 1362 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseIntegrityCheck - USER_DATABASES', 1363 | @enabled=1, 1364 | @notify_level_eventlog=2, 1365 | @notify_level_email=0, 1366 | @notify_level_netsend=0, 1367 | @notify_level_page=0, 1368 | @delete_level=0, 1369 | @description=N'Source: https://ola.hallengren.com', 1370 | @category_name=N'Database Maintenance', 1371 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1372 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1373 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseIntegrityCheck - USER_DATABASES', 1374 | @step_id=1, 1375 | @cmdexec_success_code=0, 1376 | @on_success_action=1, 1377 | @on_success_step_id=0, 1378 | @on_fail_action=2, 1379 | @on_fail_step_id=0, 1380 | @retry_attempts=0, 1381 | @retry_interval=0, 1382 | @os_run_priority=0, @subsystem=N'TSQL', 1383 | @command=N'EXECUTE [dbo].[DatabaseIntegrityCheck] 1384 | @Databases = ''USER_DATABASES'', 1385 | @LogToTable = ''N''', 1386 | @database_name=N'master', 1387 | @flags=0 1388 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1389 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1390 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1391 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1392 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1393 | COMMIT TRANSACTION 1394 | GOTO EndSave 1395 | QuitWithRollback: 1396 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1397 | EndSave: 1398 | 1399 | GO 1400 | 1401 | BEGIN TRANSACTION 1402 | DECLARE @ReturnCode INT 1403 | SELECT @ReturnCode = 0 1404 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1405 | BEGIN 1406 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1407 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1408 | 1409 | END 1410 | 1411 | DECLARE @jobId BINARY(16) 1412 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'IndexOptimize - USER_DATABASES', 1413 | @enabled=1, 1414 | @notify_level_eventlog=2, 1415 | @notify_level_email=0, 1416 | @notify_level_netsend=0, 1417 | @notify_level_page=0, 1418 | @delete_level=0, 1419 | @description=N'Source: https://ola.hallengren.com', 1420 | @category_name=N'Database Maintenance', 1421 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1422 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1423 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'IndexOptimize - USER_DATABASES', 1424 | @step_id=1, 1425 | @cmdexec_success_code=0, 1426 | @on_success_action=1, 1427 | @on_success_step_id=0, 1428 | @on_fail_action=2, 1429 | @on_fail_step_id=0, 1430 | @retry_attempts=0, 1431 | @retry_interval=0, 1432 | @os_run_priority=0, @subsystem=N'TSQL', 1433 | @command=N'EXECUTE [dbo].[IndexOptimize] 1434 | @Databases = ''USER_DATABASES'', 1435 | @LogToTable = ''N''', 1436 | @database_name=N'master', 1437 | @flags=0 1438 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1439 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1440 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1441 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1442 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1443 | COMMIT TRANSACTION 1444 | GOTO EndSave 1445 | QuitWithRollback: 1446 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1447 | EndSave: 1448 | 1449 | GO 1450 | 1451 | BEGIN TRANSACTION 1452 | DECLARE @ReturnCode INT 1453 | SELECT @ReturnCode = 0 1454 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1455 | BEGIN 1456 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1457 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1458 | 1459 | END 1460 | 1461 | DECLARE @jobId BINARY(16) 1462 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Output File Cleanup', 1463 | @enabled=1, 1464 | @notify_level_eventlog=2, 1465 | @notify_level_email=0, 1466 | @notify_level_netsend=0, 1467 | @notify_level_page=0, 1468 | @delete_level=0, 1469 | @description=N'Source: https://ola.hallengren.com', 1470 | @category_name=N'Database Maintenance', 1471 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1472 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1473 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Output File Cleanup', 1474 | @step_id=1, 1475 | @cmdexec_success_code=0, 1476 | @on_success_action=1, 1477 | @on_success_step_id=0, 1478 | @on_fail_action=2, 1479 | @on_fail_step_id=0, 1480 | @retry_attempts=0, 1481 | @retry_interval=0, 1482 | @os_run_priority=0, @subsystem=N'CmdExec', 1483 | @command=N'cmd', 1484 | @flags=0 1485 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1486 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1487 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1488 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1489 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1490 | COMMIT TRANSACTION 1491 | GOTO EndSave 1492 | QuitWithRollback: 1493 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1494 | EndSave: 1495 | 1496 | GO 1497 | 1498 | BEGIN TRANSACTION 1499 | DECLARE @ReturnCode INT 1500 | SELECT @ReturnCode = 0 1501 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1502 | BEGIN 1503 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1504 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1505 | 1506 | END 1507 | 1508 | DECLARE @jobId BINARY(16) 1509 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'sp_delete_backuphistory', 1510 | @enabled=1, 1511 | @notify_level_eventlog=2, 1512 | @notify_level_email=0, 1513 | @notify_level_netsend=0, 1514 | @notify_level_page=0, 1515 | @delete_level=0, 1516 | @description=N'Source: https://ola.hallengren.com', 1517 | @category_name=N'Database Maintenance', 1518 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1519 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1520 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'sp_delete_backuphistory', 1521 | @step_id=1, 1522 | @cmdexec_success_code=0, 1523 | @on_success_action=1, 1524 | @on_success_step_id=0, 1525 | @on_fail_action=2, 1526 | @on_fail_step_id=0, 1527 | @retry_attempts=0, 1528 | @retry_interval=0, 1529 | @os_run_priority=0, @subsystem=N'TSQL', 1530 | @command=N'DECLARE @CleanupDate datetime 1531 | SET @CleanupDate = DATEADD(dd,-30,GETDATE()) 1532 | EXECUTE dbo.sp_delete_backuphistory @oldest_date = @CleanupDate', 1533 | @database_name=N'msdb', 1534 | @flags=0 1535 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1536 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1537 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1538 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1539 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1540 | COMMIT TRANSACTION 1541 | GOTO EndSave 1542 | QuitWithRollback: 1543 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1544 | EndSave: 1545 | 1546 | GO 1547 | 1548 | BEGIN TRANSACTION 1549 | DECLARE @ReturnCode INT 1550 | SELECT @ReturnCode = 0 1551 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1552 | BEGIN 1553 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1554 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1555 | 1556 | END 1557 | 1558 | DECLARE @jobId BINARY(16) 1559 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'sp_purge_jobhistory', 1560 | @enabled=1, 1561 | @notify_level_eventlog=2, 1562 | @notify_level_email=0, 1563 | @notify_level_netsend=0, 1564 | @notify_level_page=0, 1565 | @delete_level=0, 1566 | @description=N'Source: https://ola.hallengren.com', 1567 | @category_name=N'Database Maintenance', 1568 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1569 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1570 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'sp_purge_jobhistory', 1571 | @step_id=1, 1572 | @cmdexec_success_code=0, 1573 | @on_success_action=1, 1574 | @on_success_step_id=0, 1575 | @on_fail_action=2, 1576 | @on_fail_step_id=0, 1577 | @retry_attempts=0, 1578 | @retry_interval=0, 1579 | @os_run_priority=0, @subsystem=N'TSQL', 1580 | @command=N'DECLARE @CleanupDate datetime 1581 | SET @CleanupDate = DATEADD(dd,-30,GETDATE()) 1582 | EXECUTE dbo.sp_purge_jobhistory @oldest_date = @CleanupDate', 1583 | @database_name=N'msdb', 1584 | @flags=0 1585 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1586 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1587 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1588 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1589 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1590 | COMMIT TRANSACTION 1591 | GOTO EndSave 1592 | QuitWithRollback: 1593 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1594 | EndSave: 1595 | 1596 | GO -------------------------------------------------------------------------------- /samples/stackoverflow/sql/create-regserver.sql: -------------------------------------------------------------------------------- 1 | Declare @server_group_id int 2 | EXEC msdb.dbo.sp_sysmanagement_add_shared_server_group @parent_id=1, @name=N'Production', @description=N'', @server_type=0, @server_group_id=@server_group_id OUTPUT 3 | Select @server_group_id 4 | 5 | go 6 | Declare @server_id int 7 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2005 Ent', @server_name=N'sql2005', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 8 | Select @server_id 9 | 10 | go 11 | Declare @server_id int 12 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2005', @server_name=N'SQL2005', @description=N'SharePoint dbs', @server_type=0, @server_id=@server_id OUTPUT 13 | Select @server_id 14 | 15 | go 16 | Declare @server_id int 17 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2008 R2 Instance', @server_name=N'sql2008', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 18 | Select @server_id 19 | 20 | go 21 | 22 | Declare @server_id int 23 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2008', @server_name=N'sql2008\sql2k8', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 24 | Select @server_id 25 | 26 | go 27 | 28 | Declare @server_id int 29 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2012', @server_name=N'sql2012', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 30 | Select @server_id 31 | 32 | go 33 | Declare @server_group_id int 34 | EXEC msdb.dbo.sp_sysmanagement_add_shared_server_group @parent_id=1, @name=N'Test', @description=N'', @server_type=0, @server_group_id=@server_group_id OUTPUT 35 | Select @server_group_id 36 | 37 | go 38 | Declare @server_id int 39 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=7, @name=N'SQL Server 2000 Dev', @server_name=N'sql2000', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 40 | Select @server_id 41 | 42 | go 43 | Declare @server_id int 44 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=7, @name=N'SQL Server 2005 Express Instance', @server_name=N'sql2005express\sqlexpress', @description=N'Instance', @server_type=0, @server_id=@server_id OUTPUT 45 | Select @server_id 46 | go 47 | Declare @server_id int 48 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=7, @name=N'The 2008 Clustered Instance', @server_name=N'sql01', @description=N'HR''s Dedicated SharePoint instance', @server_type=0, @server_id=@server_id OUTPUT 49 | Select @server_id 50 | 51 | go 52 | -------------------------------------------------------------------------------- /samples/stackoverflow/sql/mssql.conf: -------------------------------------------------------------------------------- 1 | [EULA] 2 | accepteula = Y 3 | accepteulaml = Y 4 | 5 | [filelocation] 6 | defaultbackupdir = /shared/ 7 | defaultdatadir = /var/opt/mssql/data/ 8 | defaultdumpdir = /var/opt/mssql/data/ 9 | defaultlogdir = /var/opt/mssql/data/ 10 | 11 | [hadr] 12 | hadrenabled = 1 13 | 14 | [language] 15 | lcid = 1033 16 | 17 | [memory] 18 | memorylimitmb = 4096 19 | 20 | [sqlagent] 21 | enabled = true 22 | databasemailprofile = default 23 | errorlogfile = /var/opt/mssql/log/sqlagentlog.log 24 | errorlogginglevel = 7 25 | 26 | [telemetry] 27 | customerfeedback = true 28 | userrequestedlocalauditdirectory = /tmp/audit -------------------------------------------------------------------------------- /samples/stackoverflow/sql/restore-db.sql: -------------------------------------------------------------------------------- 1 | USE [master] 2 | RESTORE DATABASE [Northwind] FROM DISK = N'/tmp/northwind.bak' WITH FILE = 1, MOVE N'Northwind' TO N'/var/opt/mssql/data/northwnd.mdf', MOVE N'Northwind_log' TO N'/var/opt/mssql/data/northwnd.ldf', NOUNLOAD, STATS = 5 3 | 4 | GO 5 | 6 | USE [master] 7 | RESTORE DATABASE [pubs] FROM DISK = N'/tmp/pubs.bak' WITH FILE = 1, MOVE N'pubs' TO N'/var/opt/mssql/data/pubs.mdf', MOVE N'pubs_log' TO N'/var/opt/mssql/data/pubs_log.ldf', NOUNLOAD, STATS = 5 8 | 9 | GO 10 | 11 | USE [master] 12 | ALTER AUTHORIZATION ON DATABASE::[Northwind] TO [sqladmin] 13 | ALTER AUTHORIZATION ON DATABASE::[pubs] TO [sqladmin] 14 | 15 | GO -------------------------------------------------------------------------------- /samples/stackoverflow/sql/sapassword.env: -------------------------------------------------------------------------------- 1 | MSSQL_SA_PASSWORD=dbatools.IO -------------------------------------------------------------------------------- /samples/stackoverflow/sql/sqlcmd.env: -------------------------------------------------------------------------------- 1 | SQLCMDSERVER=localhost 2 | SQLCMDUSER=sa 3 | SQLCMDPASSWORD=dbatools.IO -------------------------------------------------------------------------------- /samples/stackoverflow/third/attach-db.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE [StackOverflow] ON 2 | ( FILENAME = N'/var/opt/mssql/data/StackOverflow2010.mdf' ) 3 | FOR ATTACH_REBUILD_LOG -------------------------------------------------------------------------------- /samples/stackoverflow/third/configure.sh: -------------------------------------------------------------------------------- 1 | # loop until sql server is up and ready 2 | for i in {1..50}; 3 | do 4 | sqlcmd -S localhost -d master -Q "SELECT @@VERSION" 5 | if [ $? -ne 0 ];then 6 | sleep 2 7 | fi 8 | done 9 | 10 | # create sqladmin with dbatools.IO password and disable sa 11 | sqlcmd -S localhost -d master -i /tmp/create-admin.sql 12 | 13 | # change the default login to sqladmin instead of sa 14 | export SQLCMDUSER=sqladmin 15 | 16 | # prep to rename the server to be mssql1 or mssql2 17 | sqlcmd -d master -Q "EXEC sp_dropserver @@SERVERNAME" 18 | sqlcmd -S localhost -d master -Q "EXEC sp_addserver 'mssql3', local" 19 | 20 | # Source -> http://stackoverflow.brentozar.com/StackOverflow2010.7z 21 | 22 | wget --no-check-certificate -O StackOverflow2010.7z 'https://github.com/dataplat/docker/releases/download/1.0/StackOverflow2010.7z' 2>&1 | tee -a /tmp/wget_logfile.log 23 | 7z e StackOverflow2010.7z > /tmp/7z_logfile.log 24 | mv /tmp/Stack*mdf /var/opt/mssql/data/ 25 | sqlcmd -S localhost -d master -i /tmp/attach-db.sql 26 | -------------------------------------------------------------------------------- /samples/stackoverflow/third/start-sql.sh: -------------------------------------------------------------------------------- 1 | # load up environment variables 2 | export $(xargs < /tmp/sapassword.env) 3 | export $(xargs < /tmp/sqlcmd.env) 4 | export PATH=$PATH:/opt/mssql-tools/bin 5 | 6 | # set the configs 7 | cp /tmp/mssql.conf /var/opt/mssql/mssql.conf 8 | 9 | # startup, wait for it to finish starting 10 | # then run the setup script 11 | /opt/mssql/bin/sqlservr & sleep 20 & /tmp/configure.sh -------------------------------------------------------------------------------- /sqlinstance/.dockerignore: -------------------------------------------------------------------------------- 1 | # ignore the basics 2 | .cache 3 | .DS_Store 4 | .thumbsdb 5 | .git/ 6 | .gitattributes 7 | .gitignore 8 | .env 9 | .vscode/ 10 | 11 | ### Project ### 12 | .dockerignore 13 | Dockerfile 14 | LICENSE 15 | README.md 16 | *.ps1 17 | tests/ -------------------------------------------------------------------------------- /sqlinstance/.env: -------------------------------------------------------------------------------- 1 | COMPOSE_PROJECT_NAME=dbatools -------------------------------------------------------------------------------- /sqlinstance/Dockerfile: -------------------------------------------------------------------------------- 1 | ### 2 | # 3 | # temp/builder image: add users, logins, databases, etc 4 | # 5 | ### 6 | 7 | # get the latest SQL container and set it as the builder image 8 | FROM dbatools/mssqlbase as builder 9 | 10 | # designate the stocked sql server 11 | ARG PRIMARYSQL 12 | 13 | # switch to root to a bunch of stuff that requires elevated privs 14 | USER root 15 | 16 | # set the pwd and chown to the service account 17 | WORKDIR /tmp 18 | RUN chown mssql /tmp 19 | 20 | # copy scripts and make bash files executable 21 | # use copy instead of add, it's safer apparently 22 | COPY sql scripts /tmp/ 23 | RUN chmod +x /tmp/*.sh 24 | 25 | # convert CRLF to LF in case Windows or VS Code changed it 26 | RUN find . -type f \( -name "*.sql" -o -name "*.env" -o -name "*.sh" \) -exec sed -i 's/\r$//' {} \; 27 | 28 | # write a file that designates the primary server 29 | RUN if [ $PRIMARYSQL ]; then touch /tmp/primary; fi 30 | 31 | # switch to user mssql or the container will fail 32 | USER mssql 33 | 34 | # run initial setup scripts 35 | RUN /bin/bash /tmp/start-sql.sh 36 | 37 | ### 38 | # 39 | # final image: grab the good stuff, label 40 | # the image, and startup the sql instance 41 | # 42 | ### 43 | 44 | # copy the required changed files from "builder" 45 | # and use it to start from scratch 46 | FROM dbatools/mssqlbase 47 | COPY --from=builder /var/opt/mssql /var/opt/mssql 48 | COPY --from=builder /opt/mssql-tools/bin /opt/mssql-tools/bin 49 | COPY --from=builder /tmp/post-entrypoint.sh /opt/mssql/bin/post-entrypoint.sh 50 | 51 | # make a shared dir with the proper permissions 52 | USER root 53 | RUN mkdir /shared; chown mssql /shared 54 | 55 | # run a rootless container 56 | USER mssql 57 | # create a new database if env var is set 58 | ENTRYPOINT /opt/mssql/bin/sqlservr & /opt/mssql/bin/post-entrypoint.sh 59 | 60 | # label the container 61 | LABEL org.opencontainers.image.vendor="dbatools" 62 | LABEL org.opencontainers.image.title="dbatools" 63 | LABEL org.opencontainers.image.url=https://dbatools.io/docker 64 | LABEL org.opencontainers.image.version=1.0 65 | LABEL org.label-schema.description="SQL Server instances with a sample objects, including Northwind and pubs. Ideal for test migrations." 66 | LABEL org.opencontainers.image.authors="Chrissy LeMaire " 67 | LABEL org.opencontainers.image.documentation=https://github.com/potatoqualitee/docker/blob/main/README.md 68 | LABEL org.opencontainers.image.source=https://github.com/potatoqualitee/docker 69 | -------------------------------------------------------------------------------- /sqlinstance/arch/README.md: -------------------------------------------------------------------------------- 1 | # The best SQL Server for each platform 2 | 3 | Make an alias image for Microsoft's SQL Server images. For x64, use SQL Server 2019 because it supports more things like HA. 4 | 5 | For ARM, use SQL Server Edge because SQL Server 2019 doesn't have an ARM image. 6 | 7 | * [Linux supported features](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019) 8 | * [Edge supported features](https://docs.microsoft.com/en-us/azure/azure-sql-edge/features) 9 | 10 | Add this image to Docker Hub to make builds and deployments simpler. 11 | 12 | My notes for pushing to Docker Hub: 13 | 14 | ``` 15 | # build dat 16 | docker buildx build -t dbatools/mssqlbase:latest-amd64 ./amd64 17 | docker buildx build -t dbatools/mssqlbase:latest-arm64 ./arm64 18 | 19 | docker push dbatools/mssqlbase:latest-arm64 20 | docker push dbatools/mssqlbase:latest-amd64 21 | 22 | # Create manifests that support multiple architectures 23 | docker manifest create dbatools/mssqlbase:latest --amend dbatools/mssqlbase:latest-amd64 --amend dbatools/mssqlbase:latest-arm64 24 | 25 | # view it if you want 26 | docker manifest inspect docker.io/dbatools/mssqlbase:latest 27 | 28 | # push out to docker 29 | docker manifest push docker.io/dbatools/mssqlbase:latest --purge 30 | ``` -------------------------------------------------------------------------------- /sqlinstance/arch/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | # Make an alias for Microsoft's SQL Server Images 2 | # For x64, use SQL Server 2019 because it supports more things 3 | # like HA. For ARM, use SQL Server Edge because SQL Server 2019 doesn't have an ARM image. 4 | # Linux supported features: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019 5 | # Edge supported features: https://docs.microsoft.com/en-us/azure/azure-sql-edge/features 6 | 7 | FROM --platform=amd64 mcr.microsoft.com/mssql/server:2019-latest -------------------------------------------------------------------------------- /sqlinstance/arch/arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | # Make an alias for Microsoft's SQL Server Images 2 | # For x64, use SQL Server 2019 because it supports more things 3 | # like HA. For ARM, use SQL Server Edge because SQL Server 2019 doesn't have an ARM image. 4 | # Linux supported features: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019 5 | # Edge supported features: https://docs.microsoft.com/en-us/azure/azure-sql-edge/features 6 | 7 | FROM --platform=arm64 mcr.microsoft.com/azure-sql-edge -------------------------------------------------------------------------------- /sqlinstance/compose.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | This script helps demonstrate how our images on docker hub are built. 3 | 4 | Some commands, like docker push, require special permissions. 5 | 6 | #> 7 | 8 | # rebuild the whole thing with no caches 9 | docker compose down --volumes 10 | docker volume prune -f 11 | docker image prune -f 12 | docker builder prune -a -f 13 | docker compose up --force-recreate --build --remove-orphans -d 14 | 15 | # push out to docker hub 16 | docker push dbatools/sqlinstance:latest-amd64 17 | docker push dbatools/sqlinstance2:latest-amd64 18 | 19 | # Remove manifest cache 20 | Remove-Item $HOME/.docker/manifests -Recurse -Force 21 | 22 | # Create manifests that support multiple architectures 23 | docker manifest create dbatools/sqlinstance:latest --amend dbatools/sqlinstance:latest-amd64 --amend dbatools/sqlinstance:latest-arm64 24 | docker manifest create dbatools/sqlinstance2:latest --amend dbatools/sqlinstance2:latest-amd64 --amend dbatools/sqlinstance2:latest-arm64 25 | 26 | # view it if you want 27 | docker manifest inspect docker.io/dbatools/sqlinstance:latest 28 | docker manifest inspect docker.io/dbatools/sqlinstance2:latest 29 | 30 | # push out to docker 31 | docker manifest push docker.io/dbatools/sqlinstance:latest --purge 32 | docker manifest push docker.io/dbatools/sqlinstance2:latest --purge 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | <# 41 | 42 | 43 | FOR ARM DEPLOYMENTS ON M1 or Raspberry Pi 44 | 45 | 46 | #> 47 | # rebuild the whole thing with no caches 48 | docker compose down --volumes 49 | docker volume prune -f 50 | docker image prune -f 51 | docker builder prune -a -f 52 | docker compose up --force-recreate --build --remove-orphans -d 53 | 54 | # retag image 55 | docker tag dbatools/sqlinstance dbatools/sqlinstance:latest-arm64 56 | docker tag dbatools/sqlinstance2 dbatools/sqlinstance2:latest-arm64 57 | 58 | # push out to docker hub 59 | docker push dbatools/sqlinstance:latest-arm64 60 | docker push dbatools/sqlinstance2:latest-arm64 61 | 62 | # Remove manifest cache 63 | Remove-Item $HOME/.docker/manifests -Recurse -Force 64 | 65 | # Create manifests that support multiple architectures 66 | docker manifest create dbatools/sqlinstance:latest --amend dbatools/sqlinstance:latest-amd64 --amend dbatools/sqlinstance:latest-arm64 67 | docker manifest create dbatools/sqlinstance2:latest --amend dbatools/sqlinstance2:latest-amd64 --amend dbatools/sqlinstance2:latest-arm64 68 | 69 | # view it if you want 70 | docker manifest inspect docker.io/dbatools/sqlinstance:latest 71 | docker manifest inspect docker.io/dbatools/sqlinstance2:latest 72 | 73 | # push out to docker 74 | docker manifest push docker.io/dbatools/sqlinstance:latest --purge 75 | docker manifest push docker.io/dbatools/sqlinstance2:latest --purge 76 | 77 | 78 | 79 | <# 80 | # Clean up! 81 | This is super destructive as it will remove all images and containers and volumes. You probably don't want to run this. 82 | 83 | docker compose down 84 | docker stop $(docker ps -a -q) 85 | docker rm $(docker ps -a -q) 86 | docker rmi $(docker images -q) 87 | "y" | docker system prune -a 88 | "y" | docker volume prune 89 | "y" | docker builder prune -a 90 | 91 | #> -------------------------------------------------------------------------------- /sqlinstance/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | mssql1: 4 | restart: on-failure 5 | networks: 6 | - localnet 7 | container_name: mssql1 8 | hostname: mssql1 9 | image: dbatools/sqlinstance 10 | build: 11 | context: . 12 | labels: 13 | org.label-schema.docker.cmd: "docker run -p 1433:1433 --volume shared:/shared:z 14 | --name mssql1 --hostname mssql1 --network localnet -d 15 | dbatools/sqlinstance" 16 | args: 17 | PRIMARYSQL: "TRUE" 18 | ports: 19 | - "1433:1433" 20 | env_file: 21 | - sql/sapassword.env 22 | volumes: 23 | - shared:/shared:z 24 | mssql2: 25 | restart: on-failure 26 | networks: 27 | - localnet 28 | container_name: mssql2 29 | hostname: mssql2 30 | image: dbatools/sqlinstance2 31 | build: 32 | context: . 33 | labels: 34 | org.label-schema.docker.cmd: "docker run -p 14333:1433 --volume shared:/shared:z 35 | --name mssql2 --hostname mssql2 --network localnet -d 36 | dbatools/sqlinstance2" 37 | ports: 38 | - "14333:1433" 39 | env_file: 40 | - sql/sapassword.env 41 | volumes: 42 | - shared:/shared:z 43 | 44 | networks: 45 | localnet: null 46 | volumes: 47 | shared: null 48 | -------------------------------------------------------------------------------- /sqlinstance/scripts/configure.sh: -------------------------------------------------------------------------------- 1 | # loop until sql server is up and ready 2 | for i in {1..50}; 3 | do 4 | sqlcmd -S localhost -d master -Q "SELECT @@VERSION" 5 | if [ $? -ne 0 ];then 6 | sleep 2 7 | fi 8 | done 9 | 10 | # create sqladmin with dbatools.IO password and disable sa 11 | sqlcmd -S localhost -d master -i /tmp/create-admin.sql 12 | 13 | # change the default login to sqladmin instead of sa 14 | export SQLCMDUSER=sqladmin 15 | 16 | # prep to rename the server to be mssql1 or mssql2 17 | sqlcmd -d master -Q "EXEC sp_dropserver @@SERVERNAME" 18 | 19 | # if it's the primary server, restore pubs and northwind and create a bunch of objects 20 | if [ -f "/tmp/primary" ]; then 21 | sqlcmd -S localhost -d master -Q "EXEC sp_addserver 'mssql1', local" 22 | # Download instead of including it in the repo -- it reduces 23 | # the size of the context and makes the secondary image smaller 24 | wget https://github.com/sqlcollaborative/docker/raw/a61d8e1ffb150cae767c27737ad07e730d4e76dd/sqlinstance/sql/northwind.bak 25 | wget https://github.com/sqlcollaborative/docker/raw/a61d8e1ffb150cae767c27737ad07e730d4e76dd/sqlinstance/sql/pubs.bak 26 | sqlcmd -S localhost -d master -i /tmp/restore-db.sql 27 | sqlcmd -S localhost -d master -i /tmp/create-objects.sql 28 | sqlcmd -S localhost -d master -i /tmp/create-regserver.sql 29 | else 30 | sqlcmd -S localhost -d master -Q "EXEC sp_addserver 'mssql2', local" 31 | fi 32 | 33 | # import the certificate and creates endpoint 34 | sqlcmd -S localhost -d master -i /tmp/create-endpoint.sql -------------------------------------------------------------------------------- /sqlinstance/scripts/post-entrypoint.sh: -------------------------------------------------------------------------------- 1 | # if an environment variable for newdb exists, create it 2 | if [ -n "${MSSQL_DB+1}" ]; then 3 | # load up environment variables 4 | export SQLCMDSERVER=localhost 5 | export SQLCMDUSER=sqladmin 6 | export SQLCMDPASSWORD=dbatools.IO 7 | export PATH=$PATH:/opt/mssql-tools/bin 8 | 9 | # wait for sql to be ready 10 | for i in {1..30}; 11 | do 12 | sqlcmd -S localhost -d master -Q "SELECT @@VERSION" 13 | if [ $? -ne 0 ];then 14 | sleep 2 15 | fi 16 | done 17 | 18 | # create the db if it doesn't exist already 19 | sqlcmd -S localhost -d master -Q "IF DB_ID (N'${MSSQL_DB}') IS NULL CREATE DATABASE ${MSSQL_DB};" 20 | fi 21 | 22 | # keep it going 23 | sleep infinity -------------------------------------------------------------------------------- /sqlinstance/scripts/start-sql.sh: -------------------------------------------------------------------------------- 1 | # load up environment variables 2 | export $(xargs < /tmp/sapassword.env) 3 | export $(xargs < /tmp/sqlcmd.env) 4 | export PATH=$PATH:/opt/mssql-tools/bin 5 | 6 | # set the configs 7 | cp /tmp/mssql.conf /var/opt/mssql/mssql.conf 8 | 9 | # check for arm64 which does not support sqlcmd 10 | arch=$(lscpu | awk '/Architecture:/{print $2}') 11 | if [ "$arch" = "aarch64" ]; then 12 | wget https://github.com/microsoft/go-sqlcmd/releases/download/v0.2.0/sqlcmd-v0.2.0-linux-arm64.tar.bz2 13 | tar -xvf sqlcmd-v0.2.0-linux-arm64.tar.bz2 14 | mkdir /opt/mssql-tools /opt/mssql-tools/bin 15 | cp sqlcmd /opt/mssql-tools/bin 16 | chmod +x /opt/mssql-tools/bin/sqlcmd 17 | fi 18 | 19 | # startup, wait for it to finish starting 20 | # then run the setup script 21 | /opt/mssql/bin/sqlservr & sleep 20 & /tmp/configure.sh -------------------------------------------------------------------------------- /sqlinstance/sql/AGCertificate2021_2121.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataplat/docker/4fe644fb22ee8bf785f361fbd70c47c79a4d9a6a/sqlinstance/sql/AGCertificate2021_2121.cer -------------------------------------------------------------------------------- /sqlinstance/sql/AGCertificate2021_2121.pvk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataplat/docker/4fe644fb22ee8bf785f361fbd70c47c79a4d9a6a/sqlinstance/sql/AGCertificate2021_2121.pvk -------------------------------------------------------------------------------- /sqlinstance/sql/create-admin.sql: -------------------------------------------------------------------------------- 1 | -- create a sql admin account that's not sa 2 | -- then disable sa, because it feels right 3 | CREATE LOGIN [sqladmin] WITH PASSWORD = 0x02004655C1D65FA47CC10F4544048D810E5820A1978DF8750708B3AAE6F039240AD275961BFD9FBCE961ED84B69B4B2A93D62C4C32AF953312EE5B3C189901D92D52438E9E10 HASHED, SID = 0x21A63BA3525821498FDED3037F96A293, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 4 | 5 | GO 6 | 7 | ALTER SERVER ROLE [sysadmin] ADD MEMBER [sqladmin] 8 | 9 | GO 10 | 11 | ALTER LOGIN [sa] DISABLE -------------------------------------------------------------------------------- /sqlinstance/sql/create-endpoint.sql: -------------------------------------------------------------------------------- 1 | -- Create an endpoint by importing a cert that lasts 100 years 2 | -- And do it on both servers 3 | -- This allows the two endpoints to talk to each other 4 | CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'dbatools.IO' 5 | GO 6 | 7 | CREATE CERTIFICATE AGCertificate2021_2121 FROM FILE ='/tmp/AGCertificate2021_2121.cer' WITH PRIVATE KEY(FILE='/tmp/AGCertificate2021_2121.pvk', DECRYPTION BY PASSWORD='dbatools.IO') 8 | GO 9 | 10 | CREATE ENDPOINT [hadr_endpoint] 11 | STATE=STARTED 12 | AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) 13 | FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = CERTIFICATE [AGCertificate2021_2121] 14 | , ENCRYPTION = REQUIRED ALGORITHM AES) 15 | GO -------------------------------------------------------------------------------- /sqlinstance/sql/create-objects.sql: -------------------------------------------------------------------------------- 1 | -- create a boatload of things to migrate 2 | 3 | -- backup device 4 | EXEC master.dbo.sp_addumpdevice @devtype = N'disk', @logicalname = N'Old School', @physicalname = N'\\nas\sqlbackups\Old School.bak' 5 | GO 6 | 7 | -- custom errors 8 | EXEC master.dbo.sp_addmessage @msgnum=60000, @lang=N'us_english', 9 | @severity=16, 10 | @msgtext=N'The item named %s already exists in %s.', 11 | @with_log=false 12 | GO 13 | 14 | -- mail 15 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'AccountRetryAttempts', @parameter_value=N'1', @description=N'Number of retry attempts for a mail server' 16 | GO 17 | 18 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'AccountRetryDelay', @parameter_value=N'60', @description=N'Delay between each retry attempt to mail server' 19 | GO 20 | 21 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'DatabaseMailExeMinimumLifeTime', @parameter_value=N'600', @description=N'Minimum process lifetime in seconds' 22 | GO 23 | 24 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'DefaultAttachmentEncoding', @parameter_value=N'MIME', @description=N'Default attachment encoding' 25 | GO 26 | 27 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'LoggingLevel', @parameter_value=N'2', @description=N'Database Mail logging level: normal - 1, extended - 2 (default), verbose - 3' 28 | GO 29 | 30 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'MaxFileSize', @parameter_value=N'1000000', @description=N'Default maximum file size' 31 | GO 32 | 33 | EXEC msdb.dbo.sysmail_configure_sp @parameter_name=N'ProhibitedExtensions', @parameter_value=N'exe,dll,vbs,js', @description=N'Extensions not allowed in outgoing mails' 34 | GO 35 | 36 | EXEC msdb.dbo.sysmail_add_account_sp @account_name=N'The DBA Team', 37 | @email_address=N'dbadistro@ad.local', 38 | @display_name=N'The DBA Team' 39 | GO 40 | 41 | EXEC msdb.dbo.sysmail_add_profile_sp @profile_name=N'The DBA Team' 42 | GO 43 | 44 | EXEC msdb.dbo.sysmail_add_profileaccount_sp @profile_name=N'The DBA Team', @account_name=N'The DBA Team', @sequence_number=1 45 | GO 46 | 47 | EXEC msdb.dbo.sysmail_add_principalprofile_sp @principal_name=N'guest', @profile_name=N'The DBA Team', @is_default=1 48 | GO 49 | 50 | EXEC msdb.dbo.sysmail_update_account_sp @account_name=N'The DBA Team', @description=N'', @email_address=N'dbadistro@ad.local', @display_name=N'The DBA Team', @replyto_address=N'', @mailserver_name=N'smtp.ad.local', @mailserver_type=N'SMTP', @port=25, @username=N'', @password=N'', @use_default_credentials=0, @enable_ssl=0 51 | GO 52 | 53 | -- extended events 54 | 55 | CREATE EVENT SESSION [AlwaysOn_health_new] ON SERVER 56 | ADD EVENT sqlserver.alwayson_ddl_executed, 57 | ADD EVENT sqlserver.availability_group_lease_expired, 58 | ADD EVENT sqlserver.availability_replica_automatic_failover_validation, 59 | ADD EVENT sqlserver.availability_replica_manager_state_change, 60 | ADD EVENT sqlserver.availability_replica_state, 61 | ADD EVENT sqlserver.availability_replica_state_change, 62 | ADD EVENT sqlserver.error_reported( 63 | WHERE ([error_number]=(9691) OR [error_number]=(35204) OR [error_number]=(9693) OR [error_number]=(26024) OR [error_number]=(28047) OR [error_number]=(26023) OR [error_number]=(9692) OR [error_number]=(28034) OR [error_number]=(28036) OR [error_number]=(28048) OR [error_number]=(28080) OR [error_number]=(28091) OR [error_number]=(26022) OR [error_number]=(9642) OR [error_number]=(35201) OR [error_number]=(35202) OR [error_number]=(35206) OR [error_number]=(35207) OR [error_number]=(26069) OR [error_number]=(26070) OR [error_number]>(41047) AND [error_number]<(41056) OR [error_number]=(41142) OR [error_number]=(41144) OR [error_number]=(1480) OR [error_number]=(823) OR [error_number]=(824) OR [error_number]=(829) OR [error_number]=(35264) OR [error_number]=(35265) OR [error_number]=(41188) OR [error_number]=(41189))), 64 | ADD EVENT sqlserver.hadr_db_partner_set_sync_state, 65 | ADD EVENT sqlserver.lock_redo_blocked 66 | ADD TARGET package0.event_file(SET filename=N'AlwaysOn_health.xel',max_file_size=(5),max_rollover_files=(4)) 67 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) 68 | GO 69 | CREATE EVENT SESSION [Login Tracker] ON SERVER 70 | ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(0) 71 | ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.server_instance_name,sqlserver.server_principal_name) 72 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_app_name],N'%dbatools%') AND NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_app_name],N'%management studio%') AND [sqlserver].[not_equal_i_sql_unicode_string]([sqlserver].[database_name],N'tempdb'))) 73 | ADD TARGET package0.event_file(SET filename=N'Login Tracker',max_file_size=(10)) 74 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON) 75 | GO 76 | CREATE EVENT SESSION [QuickSessionStandard] ON SERVER 77 | ADD EVENT sqlserver.attention( 78 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 79 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))), 80 | ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1) 81 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)), 82 | ADD EVENT sqlserver.login(SET collect_options_text=(1) 83 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)), 84 | ADD EVENT sqlserver.logout( 85 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)), 86 | ADD EVENT sqlserver.rpc_completed( 87 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 88 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))), 89 | ADD EVENT sqlserver.sql_batch_completed( 90 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 91 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))), 92 | ADD EVENT sqlserver.sql_batch_starting( 93 | ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id) 94 | WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))) 95 | WITH (MAX_MEMORY=8192 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF) 96 | GO 97 | CREATE EVENT SESSION [system_health_new] ON SERVER 98 | ADD EVENT sqlclr.clr_allocation_failure( 99 | ACTION(package0.callstack,sqlserver.session_id)), 100 | ADD EVENT sqlclr.clr_virtual_alloc_failure( 101 | ACTION(package0.callstack,sqlserver.session_id)), 102 | ADD EVENT sqlos.memory_broker_ring_buffer_recorded, 103 | ADD EVENT sqlos.memory_node_oom_ring_buffer_recorded( 104 | ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack)), 105 | ADD EVENT sqlos.process_killed( 106 | ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username)), 107 | ADD EVENT sqlos.scheduler_monitor_deadlock_ring_buffer_recorded, 108 | ADD EVENT sqlos.scheduler_monitor_non_yielding_iocp_ring_buffer_recorded, 109 | ADD EVENT sqlos.scheduler_monitor_non_yielding_ring_buffer_recorded, 110 | ADD EVENT sqlos.scheduler_monitor_non_yielding_rm_ring_buffer_recorded, 111 | ADD EVENT sqlos.scheduler_monitor_stalled_dispatcher_ring_buffer_recorded, 112 | ADD EVENT sqlos.scheduler_monitor_system_health_ring_buffer_recorded, 113 | ADD EVENT sqlos.wait_info( 114 | ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text) 115 | WHERE ([duration]>(15000) AND ([wait_type]>=N'LATCH_NL' AND ([wait_type]>=N'PAGELATCH_NL' AND [wait_type]<=N'PAGELATCH_DT' OR [wait_type]<=N'LATCH_DT' OR [wait_type]>=N'PAGEIOLATCH_NL' AND [wait_type]<=N'PAGEIOLATCH_DT' OR [wait_type]>=N'IO_COMPLETION' AND [wait_type]<=N'NETWORK_IO' OR [wait_type]=N'RESOURCE_SEMAPHORE' OR [wait_type]=N'SOS_WORKER' OR [wait_type]>=N'FCB_REPLICA_WRITE' AND [wait_type]<=N'WRITELOG' OR [wait_type]=N'CMEMTHREAD' OR [wait_type]=N'TRACEWRITE' OR [wait_type]=N'RESOURCE_SEMAPHORE_MUTEX') OR [duration]>(30000) AND [wait_type]<=N'LCK_M_RX_X'))), 116 | ADD EVENT sqlos.wait_info_external( 117 | ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text) 118 | WHERE ([duration]>(5000) AND ([wait_type]>=N'PREEMPTIVE_OS_GENERICOPS' AND [wait_type]<=N'PREEMPTIVE_OS_ENCRYPTMESSAGE' OR [wait_type]>=N'PREEMPTIVE_OS_INITIALIZESECURITYCONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_QUERYSECURITYCONTEXTTOKEN' OR [wait_type]>=N'PREEMPTIVE_OS_AUTHZGETINFORMATIONFROMCONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_REVERTTOSELF' OR [wait_type]>=N'PREEMPTIVE_OS_CRYPTACQUIRECONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_DEVICEOPS' OR [wait_type]>=N'PREEMPTIVE_OS_NETGROUPGETUSERS' AND [wait_type]<=N'PREEMPTIVE_OS_NETUSERMODALSGET' OR [wait_type]>=N'PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICYFREE' AND [wait_type]<=N'PREEMPTIVE_OS_DOMAINSERVICESOPS' OR [wait_type]=N'PREEMPTIVE_OS_VERIFYSIGNATURE' OR [duration]>(45000) AND ([wait_type]>=N'PREEMPTIVE_OS_SETNAMEDSECURITYINFO' AND [wait_type]<=N'PREEMPTIVE_CLUSAPI_CLUSTERRESOURCECONTROL' OR [wait_type]>=N'PREEMPTIVE_OS_RSFXDEVICEOPS' AND [wait_type]<=N'PREEMPTIVE_OS_DSGETDCNAME' OR [wait_type]>=N'PREEMPTIVE_OS_DTCOPS' AND [wait_type]<=N'PREEMPTIVE_DTC_ABORT' OR [wait_type]>=N'PREEMPTIVE_OS_CLOSEHANDLE' AND [wait_type]<=N'PREEMPTIVE_OS_FINDFILE' OR [wait_type]>=N'PREEMPTIVE_OS_GETCOMPRESSEDFILESIZE' AND [wait_type]<=N'PREEMPTIVE_ODBCOPS' OR [wait_type]>=N'PREEMPTIVE_OS_DISCONNECTNAMEDPIPE' AND [wait_type]<=N'PREEMPTIVE_CLOSEBACKUPMEDIA' OR [wait_type]=N'PREEMPTIVE_OS_AUTHENTICATIONOPS' OR [wait_type]=N'PREEMPTIVE_OS_FREECREDENTIALSHANDLE' OR [wait_type]=N'PREEMPTIVE_OS_AUTHORIZATIONOPS' OR [wait_type]=N'PREEMPTIVE_COM_COCREATEINSTANCE' OR [wait_type]=N'PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICY' OR [wait_type]=N'PREEMPTIVE_VSS_CREATESNAPSHOT')))), 119 | ADD EVENT sqlserver.connectivity_ring_buffer_recorded(SET collect_call_stack=(1)), 120 | ADD EVENT sqlserver.error_reported( 121 | ACTION(package0.callstack,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack) 122 | WHERE ([severity]>=(20) OR ([error_number]=(17803) OR [error_number]=(701) OR [error_number]=(802) OR [error_number]=(8645) OR [error_number]=(8651) OR [error_number]=(8657) OR [error_number]=(8902) OR [error_number]=(41354) OR [error_number]=(41355) OR [error_number]=(41367) OR [error_number]=(41384) OR [error_number]=(41336) OR [error_number]=(41309) OR [error_number]=(41312) OR [error_number]=(41313)))), 123 | ADD EVENT sqlserver.security_error_ring_buffer_recorded(SET collect_call_stack=(1)), 124 | ADD EVENT sqlserver.sp_server_diagnostics_component_result(SET collect_data=(1) 125 | WHERE ([sqlserver].[is_system]=(1) AND [component]<>(4))), 126 | ADD EVENT sqlserver.sql_exit_invoked( 127 | ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username)), 128 | ADD EVENT sqlserver.xml_deadlock_report 129 | ADD TARGET package0.event_file(SET filename=N'system_health.xel',max_file_size=(5),max_rollover_files=(4)), 130 | ADD TARGET package0.ring_buffer(SET max_events_limit=(5000),max_memory=(4096)) 131 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=120 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON) 132 | GO 133 | CREATE EVENT SESSION [telemetry_xevents_new] ON SERVER 134 | ADD EVENT qds.query_store_db_diagnostics, 135 | ADD EVENT sqlserver.alter_column_event, 136 | ADD EVENT sqlserver.always_encrypted_query_count, 137 | ADD EVENT sqlserver.auto_stats, 138 | ADD EVENT sqlserver.cardinality_estimation_version_usage, 139 | ADD EVENT sqlserver.column_store_index_build_low_memory, 140 | ADD EVENT sqlserver.column_store_index_build_throttle, 141 | ADD EVENT sqlserver.columnstore_delete_buffer_flush_failed, 142 | ADD EVENT sqlserver.columnstore_delta_rowgroup_closed, 143 | ADD EVENT sqlserver.columnstore_index_reorg_failed, 144 | ADD EVENT sqlserver.columnstore_log_exception, 145 | ADD EVENT sqlserver.columnstore_rowgroup_merge_failed, 146 | ADD EVENT sqlserver.columnstore_tuple_mover_delete_buffer_truncate_timed_out, 147 | ADD EVENT sqlserver.columnstore_tuple_mover_end_compress, 148 | ADD EVENT sqlserver.create_index_event, 149 | ADD EVENT sqlserver.data_masking_ddl_column_definition, 150 | ADD EVENT sqlserver.data_masking_traffic, 151 | ADD EVENT sqlserver.data_masking_traffic_masked_only, 152 | ADD EVENT sqlserver.database_cmptlevel_change, 153 | ADD EVENT sqlserver.database_created, 154 | ADD EVENT sqlserver.database_dropped, 155 | ADD EVENT sqlserver.error_reported( 156 | WHERE ([severity]>=(16) OR ([error_number]=(18456) OR [error_number]=(17803) OR [error_number]=(701) OR [error_number]=(802) OR [error_number]=(8645) OR [error_number]=(8651) OR [error_number]=(8657) OR [error_number]=(8902) OR [error_number]=(41354) OR [error_number]=(41355) OR [error_number]=(41367) OR [error_number]=(41384) OR [error_number]=(41336) OR [error_number]=(41309) OR [error_number]=(41312) OR [error_number]=(41313) OR [error_number]=(33065) OR [error_number]=(33066)))), 157 | ADD EVENT sqlserver.graph_match_query_compiled, 158 | ADD EVENT sqlserver.index_build_error_event, 159 | ADD EVENT sqlserver.index_defragmentation, 160 | ADD EVENT sqlserver.interleaved_exec_status, 161 | ADD EVENT sqlserver.json_function_compiled( 162 | ACTION(sqlserver.database_id)), 163 | ADD EVENT sqlserver.missing_column_statistics, 164 | ADD EVENT sqlserver.missing_join_predicate, 165 | ADD EVENT sqlserver.natively_compiled_module_inefficiency_detected, 166 | ADD EVENT sqlserver.natively_compiled_proc_slow_parameter_passing, 167 | ADD EVENT sqlserver.query_memory_grant_blocking, 168 | ADD EVENT sqlserver.query_optimizer_compatibility_level_hint_usage, 169 | ADD EVENT sqlserver.reason_many_foreign_keys_operator_not_used, 170 | ADD EVENT sqlserver.rls_query_count, 171 | ADD EVENT sqlserver.sequence_function_used( 172 | ACTION(sqlserver.database_id)), 173 | ADD EVENT sqlserver.server_memory_change, 174 | ADD EVENT sqlserver.server_start_stop, 175 | ADD EVENT sqlserver.stretch_database_disable_completed, 176 | ADD EVENT sqlserver.stretch_database_enable_completed, 177 | ADD EVENT sqlserver.stretch_database_reauthorize_completed, 178 | ADD EVENT sqlserver.stretch_index_reconciliation_codegen_completed, 179 | ADD EVENT sqlserver.stretch_query_telemetry, 180 | ADD EVENT sqlserver.stretch_remote_column_execution_completed, 181 | ADD EVENT sqlserver.stretch_remote_column_reconciliation_codegen_completed, 182 | ADD EVENT sqlserver.stretch_remote_error, 183 | ADD EVENT sqlserver.stretch_remote_index_execution_completed, 184 | ADD EVENT sqlserver.stretch_table_alter_ddl, 185 | ADD EVENT sqlserver.stretch_table_codegen_completed, 186 | ADD EVENT sqlserver.stretch_table_create_ddl, 187 | ADD EVENT sqlserver.stretch_table_data_reconciliation_results_event, 188 | ADD EVENT sqlserver.stretch_table_hinted_admin_delete_event, 189 | ADD EVENT sqlserver.stretch_table_hinted_admin_update_event, 190 | ADD EVENT sqlserver.stretch_table_predicate_not_specified, 191 | ADD EVENT sqlserver.stretch_table_predicate_specified, 192 | ADD EVENT sqlserver.stretch_table_query_error, 193 | ADD EVENT sqlserver.stretch_table_remote_creation_completed, 194 | ADD EVENT sqlserver.stretch_table_row_migration_results_event, 195 | ADD EVENT sqlserver.stretch_table_row_unmigration_results_event, 196 | ADD EVENT sqlserver.stretch_table_unprovision_completed, 197 | ADD EVENT sqlserver.stretch_table_validation_error, 198 | ADD EVENT sqlserver.string_escape_compiled( 199 | ACTION(sqlserver.database_id)), 200 | ADD EVENT sqlserver.temporal_ddl_period_add, 201 | ADD EVENT sqlserver.temporal_ddl_period_drop, 202 | ADD EVENT sqlserver.temporal_ddl_schema_check_fail, 203 | ADD EVENT sqlserver.temporal_ddl_system_versioning, 204 | ADD EVENT sqlserver.temporal_dml_transaction_fail, 205 | ADD EVENT sqlserver.window_function_used( 206 | ACTION(sqlserver.database_id)), 207 | ADD EVENT sqlserver.xtp_alter_table, 208 | ADD EVENT sqlserver.xtp_db_delete_only_mode_updatedhktrimlsn, 209 | ADD EVENT sqlserver.xtp_stgif_container_added, 210 | ADD EVENT sqlserver.xtp_stgif_container_deleted, 211 | ADD EVENT XtpCompile.cl_duration, 212 | ADD EVENT XtpEngine.parallel_alter_stats, 213 | ADD EVENT XtpEngine.serial_alter_stats, 214 | ADD EVENT XtpEngine.xtp_db_delete_only_mode_enter, 215 | ADD EVENT XtpEngine.xtp_db_delete_only_mode_exit, 216 | ADD EVENT XtpEngine.xtp_db_delete_only_mode_update, 217 | ADD EVENT XtpEngine.xtp_physical_db_restarted 218 | ADD TARGET package0.ring_buffer(SET occurrence_number=(100)) 219 | WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=120 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON) 220 | GO 221 | 222 | -- logins 223 | 224 | 225 | USE master 226 | 227 | GO 228 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'app1') CREATE LOGIN [app1] WITH PASSWORD = 0x0100782FBD65E30E772B02685C41E3F69FC1E639EC77F5F4061A HASHED, SID = 0x63F51E14DBA20942AF361A3300193A7B, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 229 | GO 230 | 231 | USE master 232 | 233 | GO 234 | Grant CONNECT SQL TO [app1] AS [sa] 235 | GO 236 | 237 | USE master 238 | 239 | GO 240 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'appAdmin') CREATE LOGIN [appAdmin] WITH PASSWORD = 0x010078D465BE65DAF3B59593301B62F6199E86E70E83A542E19F HASHED, SID = 0x9243AF88BBE7B74EB83607393A9BB427, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 241 | GO 242 | 243 | USE master 244 | 245 | GO 246 | Grant CONNECT SQL TO [appAdmin] AS [sa] 247 | GO 248 | 249 | USE master 250 | 251 | GO 252 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'BUILTIN\Administrators') CREATE LOGIN [BUILTIN\Administrators] FROM WINDOWS WITH DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english] 253 | GO 254 | ALTER SERVER ROLE [sysadmin] ADD MEMBER [BUILTIN\Administrators] 255 | GO 256 | 257 | USE master 258 | 259 | GO 260 | Grant CONNECT SQL TO [BUILTIN\Administrators] AS [sa] 261 | GO 262 | 263 | USE master 264 | 265 | GO 266 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'distributor_admin') CREATE LOGIN [distributor_admin] WITH PASSWORD = 0x0200A1E37336367DCA8A0D57373A5125982D7F774312E358C06DDD295A79FDC9F26509D7E95BF8D599EB0731F15D13272C5E2F504BC0B2C302BDC19F9697EAD3B442A7451083 HASHED, SID = 0x6EFAF247DFA6824EA9BA9B3ACC5949E6, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 267 | GO 268 | ALTER SERVER ROLE [sysadmin] ADD MEMBER [distributor_admin] 269 | GO 270 | 271 | USE master 272 | 273 | GO 274 | Grant CONNECT SQL TO [distributor_admin] AS [sa] 275 | GO 276 | 277 | USE master 278 | 279 | GO 280 | 281 | USE master 282 | 283 | GO 284 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'storageuser') CREATE LOGIN [storageuser] WITH PASSWORD = 0x01003A2F024897F4A96E4AC4167E6431FBB0E26A9A987644D720 HASHED, SID = 0xEA947BDFB542FC4B816012ADE47D1651, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 285 | GO 286 | 287 | USE master 288 | 289 | GO 290 | Grant CONNECT SQL TO [storageuser] AS [sa] 291 | GO 292 | 293 | USE master 294 | 295 | GO 296 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'testlogin') CREATE LOGIN [testlogin] WITH PASSWORD = 0x02002E0CB89BE6A3118A65BE3B9BA53C98854361125B5722FAC66E9E32A6A996537E6E3556BCC09C4D0807650FD6753AA61881DAEE0C4AE962856EA17E0DDF2DFABBFC65BC34 HASHED, SID = 0x7612E56A4CAB2C468A7D24736564C6F7, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [Dansk] 297 | GO 298 | 299 | USE master 300 | 301 | GO 302 | Grant CONNECT SQL TO [testlogin] AS [sa] 303 | GO 304 | 305 | USE master 306 | 307 | GO 308 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'TestOrphan1') CREATE LOGIN [TestOrphan1] WITH PASSWORD = 0x0100479BFEEE79E83E8B847AAF33CD9A04B439ED43476C20BDDE HASHED, SID = 0xF1BACB136DD3764C9CE200E49041A0C2, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 309 | GO 310 | 311 | USE master 312 | 313 | GO 314 | Grant CONNECT SQL TO [TestOrphan1] AS [sa] 315 | GO 316 | 317 | USE master 318 | 319 | GO 320 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'TestOrphan2') CREATE LOGIN [TestOrphan2] WITH PASSWORD = 0x01000698EFA5455FE8F1C91429ECA4FE9CBFEFB953F1C08F96D5 HASHED, SID = 0x299C2102F657B4458F75653CB19A54A3, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 321 | GO 322 | 323 | USE master 324 | 325 | GO 326 | Grant CONNECT SQL TO [TestOrphan2] AS [sa] 327 | GO 328 | 329 | USE master 330 | 331 | GO 332 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'testuser2') CREATE LOGIN [testuser2] WITH PASSWORD = 0x0200DB112FF49345FC8DBE87F1F093429E5FCB4197F1E18D92D1594172843CE5CDA3B3DF269E2962D977EB60DFC855EAB774085069B43C408B3228A8EC20D4F2CE9775A0C0D7 HASHED, SID = 0xF959ADF337EF1149977812AD7969837C, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 333 | GO 334 | ALTER LOGIN [testuser2] DISABLE 335 | GO 336 | DENY CONNECT SQL TO [testuser2] 337 | GO 338 | ALTER SERVER ROLE [setupadmin] ADD MEMBER [testuser2] 339 | GO 340 | 341 | USE master 342 | 343 | GO 344 | Deny CONNECT SQL TO [testuser2] AS [sa] 345 | GO 346 | 347 | USE master 348 | 349 | GO 350 | IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = 'webuser') CREATE LOGIN [webuser] WITH PASSWORD = 0x0100162F297ABC8257F6431EA4FC8B776D42EFE04D6023211A08 HASHED, SID = 0x199A7A25579A3E4193A59299130DB683, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_LANGUAGE = [us_english] 351 | GO 352 | ALTER SERVER ROLE [dbcreator] ADD MEMBER [webuser] 353 | GO 354 | ALTER SERVER ROLE [processadmin] ADD MEMBER [webuser] 355 | GO 356 | 357 | USE master 358 | 359 | GO 360 | Grant CONNECT SQL TO [webuser] AS [sa] 361 | GO 362 | 363 | -- policy management 364 | 365 | Declare @condition_id int 366 | EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'AppRoles', @description=N'', @facet=N'ApplicationRole', @expression=N' 367 | Bool 368 | EQ 369 | 2 370 | 371 | DateTime 372 | DateLastModified 373 | 374 | 375 | DateTime 376 | DateTime 377 | DateTime 378 | 1 379 | 380 | String 381 | System.String 382 | 2016-05-03T00:00:00.0000000 383 | 384 | 385 | ', @is_name_condition=0, @obj_name=N'', @condition_id=@condition_id OUTPUT 386 | Select @condition_id 387 | 388 | GO 389 | 390 | Declare @object_set_id int 391 | EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'xp_cmdshell must be disabled_ObjectSet', @facet=N'ApplicationRole', @object_set_id=@object_set_id OUTPUT 392 | Select @object_set_id 393 | Declare @target_set_id int 394 | EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'xp_cmdshell must be disabled_ObjectSet', @type_skeleton=N'Server/Database/ApplicationRole', @type=N'APPLICATION ROLE', @enabled=True, @target_set_id=@target_set_id OUTPUT 395 | Select @target_set_id 396 | 397 | EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/ApplicationRole', @level_name=N'ApplicationRole', @condition_name=N'', @target_set_level_id=0 398 | EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0 399 | 400 | GO 401 | 402 | Declare @policy_id int 403 | EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'xp_cmdshell must be disabled', @condition_name=N'AppRoles', @policy_category=N'', @description=N'', @help_text=N'', @help_link=N'', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=2, @is_enabled=True, @policy_id=@policy_id OUTPUT, @root_condition_name=N'', @object_set=N'xp_cmdshell must be disabled_ObjectSet' 404 | Select @policy_id 405 | 406 | GO 407 | 408 | 409 | -- Resource Gov, I dunno 410 | 411 | 412 | ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL); 413 | GO 414 | 415 | ALTER RESOURCE GOVERNOR WITH (MAX_OUTSTANDING_IO_PER_VOLUME = DEFAULT); 416 | GO 417 | 418 | ALTER RESOURCE GOVERNOR RECONFIGURE; 419 | GO 420 | 421 | -- some roles 422 | 423 | 424 | CREATE SERVER ROLE [Endpoint-Admins] 425 | GO 426 | 427 | ALTER SERVER ROLE [dbcreator] ADD MEMBER [Endpoint-Admins] 428 | GO 429 | 430 | -- triggers 431 | 432 | CREATE TRIGGER [tr_MScdc_db_ddl_event] on all server for ALTER_DATABASE, DROP_DATABASE 433 | as 434 | set ANSI_NULLS ON 435 | set ANSI_PADDING ON 436 | set ANSI_WARNINGS ON 437 | set ARITHABORT ON 438 | set CONCAT_NULL_YIELDS_NULL ON 439 | set NUMERIC_ROUNDABORT OFF 440 | set QUOTED_IDENTIFIER ON 441 | 442 | declare @EventData xml, @retcode int 443 | set @EventData=EventData() 444 | if object_id('sys.sp_MScdc_db_ddl_event' ) is not null 445 | begin 446 | exec @retcode = sys.sp_MScdc_db_ddl_event @EventData 447 | if @@error <> 0 or @retcode <> 0 448 | begin 449 | rollback tran 450 | end 451 | end 452 | 453 | GO 454 | 455 | GO 456 | ENABLE TRIGGER [tr_MScdc_db_ddl_event] ON ALL SERVER 457 | GO 458 | 459 | -- spconfigure 460 | 461 | EXEC sp_configure 'show advanced options' , 1; RECONFIGURE WITH OVERRIDE 462 | EXEC sp_configure 'recovery interval (min)' , 0; 463 | EXEC sp_configure 'allow updates' , 0; 464 | EXEC sp_configure 'user connections' , 0; 465 | EXEC sp_configure 'locks' , 0; 466 | EXEC sp_configure 'open objects' , 0; 467 | EXEC sp_configure 'fill factor (%)' , 0; 468 | EXEC sp_configure 'disallow results from triggers' , 0; 469 | EXEC sp_configure 'nested triggers' , 1; 470 | EXEC sp_configure 'server trigger recursion' , 1; 471 | EXEC sp_configure 'remote access' , 1; 472 | EXEC sp_configure 'default language' , 0; 473 | EXEC sp_configure 'cross db ownership chaining' , 0; 474 | EXEC sp_configure 'max worker threads' , 0; 475 | EXEC sp_configure 'network packet size (B)' , 4096; 476 | EXEC sp_configure 'show advanced options' , 1; 477 | EXEC sp_configure 'remote proc trans' , 0; 478 | EXEC sp_configure 'c2 audit mode' , 0; 479 | EXEC sp_configure 'default full-text language' , 1033; 480 | EXEC sp_configure 'two digit year cutoff' , 2049; 481 | EXEC sp_configure 'index create memory (KB)' , 0; 482 | EXEC sp_configure 'remote login timeout (s)' , 20; 483 | EXEC sp_configure 'remote query timeout (s)' , 600; 484 | EXEC sp_configure 'cursor threshold' , -1; 485 | EXEC sp_configure 'user options' , 0; 486 | EXEC sp_configure 'affinity mask' , 0; 487 | EXEC sp_configure 'max text repl size (B)' , 65536; 488 | EXEC sp_configure 'media retention' , 0; 489 | EXEC sp_configure 'cost threshold for parallelism' , 5; 490 | EXEC sp_configure 'max degree of parallelism' , 2; 491 | EXEC sp_configure 'min memory per query (KB)' , 1024; 492 | EXEC sp_configure 'query wait (s)' , -1; 493 | EXEC sp_configure 'min server memory (MB)' , 0; 494 | EXEC sp_configure 'max server memory (MB)' , 3072; 495 | EXEC sp_configure 'query governor cost limit' , 0; 496 | EXEC sp_configure 'lightweight pooling' , 0; 497 | EXEC sp_configure 'scan for startup procs' , 0; 498 | EXEC sp_configure 'affinity64 mask' , 0; 499 | EXEC sp_configure 'affinity I/O mask' , 0; 500 | EXEC sp_configure 'affinity64 I/O mask' , 0; 501 | EXEC sp_configure 'transform noise words' , 0; 502 | EXEC sp_configure 'precompute rank' , 0; 503 | EXEC sp_configure 'PH timeout (s)' , 60; 504 | EXEC sp_configure 'clr enabled' , 1; 505 | EXEC sp_configure 'max full-text crawl range' , 4; 506 | EXEC sp_configure 'ft notify bandwidth (min)' , 0; 507 | EXEC sp_configure 'ft notify bandwidth (max)' , 100; 508 | EXEC sp_configure 'ft crawl bandwidth (min)' , 0; 509 | EXEC sp_configure 'ft crawl bandwidth (max)' , 100; 510 | EXEC sp_configure 'default trace enabled' , 1; 511 | EXEC sp_configure 'blocked process threshold (s)' , 5; 512 | EXEC sp_configure 'in-doubt xact resolution' , 0; 513 | EXEC sp_configure 'remote admin connections' , 0; 514 | EXEC sp_configure 'common criteria compliance enabled' , 0; 515 | EXEC sp_configure 'EKM provider enabled' , 0; 516 | EXEC sp_configure 'backup compression default' , 0; 517 | EXEC sp_configure 'optimize for ad hoc workloads' , 1; 518 | EXEC sp_configure 'access check cache bucket count' , 0; 519 | EXEC sp_configure 'access check cache quota' , 0; 520 | EXEC sp_configure 'backup checksum default' , 0; 521 | EXEC sp_configure 'automatic soft-NUMA disabled' , 0; 522 | EXEC sp_configure 'external scripts enabled' , 0; 523 | EXEC sp_configure 'clr strict security' , 1; 524 | EXEC sp_configure 'Agent XPs' , 1; 525 | EXEC sp_configure 'Database Mail XPs' , 0; 526 | EXEC sp_configure 'Ad Hoc Distributed Queries' , 0; 527 | EXEC sp_configure 'Replication XPs' , 0; 528 | EXEC sp_configure 'contained database authentication' , 1; 529 | EXEC sp_configure 'hadoop connectivity' , 0; 530 | EXEC sp_configure 'polybase network encryption' , 1; 531 | EXEC sp_configure 'remote data archive' , 0; 532 | EXEC sp_configure 'allow polybase export' , 0; 533 | 534 | -- tons of agent stuff 535 | 536 | EXEC msdb.dbo.sp_add_operator @name=N'MSXOperator', 537 | @enabled=1, 538 | @weekday_pager_start_time=90000, 539 | @weekday_pager_end_time=180000, 540 | @saturday_pager_start_time=90000, 541 | @saturday_pager_end_time=180000, 542 | @sunday_pager_start_time=90000, 543 | @sunday_pager_end_time=180000, 544 | @pager_days=0, 545 | @email_address=N'dbadistro@ad.local', 546 | @category_name=N'[Uncategorized]' 547 | GO 548 | 549 | EXEC msdb.dbo.sp_add_operator @name=N'The DBA Team', 550 | @enabled=1, 551 | @weekday_pager_start_time=90000, 552 | @weekday_pager_end_time=180000, 553 | @saturday_pager_start_time=90000, 554 | @saturday_pager_end_time=180000, 555 | @sunday_pager_start_time=90000, 556 | @sunday_pager_end_time=180000, 557 | @pager_days=0, 558 | @email_address=N'dbadistro@ad.local', 559 | @category_name=N'[Uncategorized]' 560 | GO 561 | 562 | EXEC msdb.dbo.sp_add_alert @name=N'Error Number 823', 563 | @message_id=823, 564 | @severity=0, 565 | @enabled=0, 566 | @delay_between_responses=60, 567 | @include_event_description_in=1, 568 | @category_name=N'[Uncategorized]', 569 | @job_id=N'00000000-0000-0000-0000-000000000000' 570 | GO 571 | 572 | EXEC msdb.dbo.sp_add_alert @name=N'Error Number 824', 573 | @message_id=824, 574 | @severity=0, 575 | @enabled=0, 576 | @delay_between_responses=60, 577 | @include_event_description_in=1, 578 | @category_name=N'[Uncategorized]', 579 | @job_id=N'00000000-0000-0000-0000-000000000000' 580 | GO 581 | 582 | EXEC msdb.dbo.sp_add_alert @name=N'Error Number 825', 583 | @message_id=825, 584 | @severity=0, 585 | @enabled=0, 586 | @delay_between_responses=60, 587 | @include_event_description_in=1, 588 | @category_name=N'[Uncategorized]', 589 | @job_id=N'00000000-0000-0000-0000-000000000000' 590 | GO 591 | 592 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Long merge over dialup connection (Threshold: mergeslowrunduration)', 593 | @message_id=14163, 594 | @severity=0, 595 | @enabled=1, 596 | @delay_between_responses=30, 597 | @include_event_description_in=5, 598 | @category_name=N'Replication', 599 | @job_id=N'00000000-0000-0000-0000-000000000000' 600 | GO 601 | 602 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Long merge over LAN connection (Threshold: mergefastrunduration)', 603 | @message_id=14162, 604 | @severity=0, 605 | @enabled=1, 606 | @delay_between_responses=30, 607 | @include_event_description_in=5, 608 | @category_name=N'Replication', 609 | @job_id=N'00000000-0000-0000-0000-000000000000' 610 | GO 611 | 612 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Slow merge over dialup connection (Threshold: mergeslowrunspeed)', 613 | @message_id=14165, 614 | @severity=0, 615 | @enabled=1, 616 | @delay_between_responses=30, 617 | @include_event_description_in=5, 618 | @category_name=N'Replication', 619 | @job_id=N'00000000-0000-0000-0000-000000000000' 620 | GO 621 | 622 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Slow merge over LAN connection (Threshold: mergefastrunspeed)', 623 | @message_id=14164, 624 | @severity=0, 625 | @enabled=1, 626 | @delay_between_responses=30, 627 | @include_event_description_in=5, 628 | @category_name=N'Replication', 629 | @job_id=N'00000000-0000-0000-0000-000000000000' 630 | GO 631 | 632 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Subscription expiration (Threshold: expiration)', 633 | @message_id=14160, 634 | @severity=0, 635 | @enabled=1, 636 | @delay_between_responses=30, 637 | @include_event_description_in=5, 638 | @category_name=N'Replication', 639 | @job_id=N'00000000-0000-0000-0000-000000000000' 640 | GO 641 | 642 | EXEC msdb.dbo.sp_add_alert @name=N'Replication Warning: Transactional replication latency (Threshold: latency)', 643 | @message_id=14161, 644 | @severity=0, 645 | @enabled=1, 646 | @delay_between_responses=30, 647 | @include_event_description_in=5, 648 | @category_name=N'Replication', 649 | @job_id=N'00000000-0000-0000-0000-000000000000' 650 | GO 651 | 652 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent custom shutdown', 653 | @message_id=20578, 654 | @severity=0, 655 | @enabled=0, 656 | @delay_between_responses=0, 657 | @include_event_description_in=5, 658 | @category_name=N'Replication', 659 | @job_id=N'00000000-0000-0000-0000-000000000000' 660 | GO 661 | 662 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent failure', 663 | @message_id=14151, 664 | @severity=0, 665 | @enabled=0, 666 | @delay_between_responses=0, 667 | @include_event_description_in=5, 668 | @category_name=N'Replication', 669 | @job_id=N'00000000-0000-0000-0000-000000000000' 670 | GO 671 | 672 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent retry', 673 | @message_id=14152, 674 | @severity=0, 675 | @enabled=0, 676 | @delay_between_responses=0, 677 | @include_event_description_in=5, 678 | @category_name=N'Replication', 679 | @job_id=N'00000000-0000-0000-0000-000000000000' 680 | GO 681 | 682 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: agent success', 683 | @message_id=14150, 684 | @severity=0, 685 | @enabled=0, 686 | @delay_between_responses=0, 687 | @include_event_description_in=5, 688 | @category_name=N'Replication', 689 | @job_id=N'00000000-0000-0000-0000-000000000000' 690 | GO 691 | 692 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: Subscriber has failed data validation', 693 | @message_id=20574, 694 | @severity=0, 695 | @enabled=0, 696 | @delay_between_responses=0, 697 | @include_event_description_in=5, 698 | @category_name=N'Replication', 699 | @job_id=N'00000000-0000-0000-0000-000000000000' 700 | GO 701 | 702 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: Subscriber has passed data validation', 703 | @message_id=20575, 704 | @severity=0, 705 | @enabled=0, 706 | @delay_between_responses=0, 707 | @include_event_description_in=5, 708 | @category_name=N'Replication', 709 | @job_id=N'00000000-0000-0000-0000-000000000000' 710 | GO 711 | 712 | EXEC msdb.dbo.sp_add_alert @name=N'Replication: Subscription reinitialized after validation failure', 713 | @message_id=20572, 714 | @severity=0, 715 | @enabled=0, 716 | @delay_between_responses=0, 717 | @include_event_description_in=5, 718 | @category_name=N'Replication', 719 | @job_id=N'00000000-0000-0000-0000-000000000000' 720 | GO 721 | 722 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 016', 723 | @message_id=0, 724 | @severity=16, 725 | @enabled=0, 726 | @delay_between_responses=60, 727 | @include_event_description_in=1, 728 | @category_name=N'[Uncategorized]', 729 | @job_id=N'00000000-0000-0000-0000-000000000000' 730 | GO 731 | 732 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 017', 733 | @message_id=0, 734 | @severity=17, 735 | @enabled=0, 736 | @delay_between_responses=60, 737 | @include_event_description_in=1, 738 | @category_name=N'[Uncategorized]', 739 | @job_id=N'00000000-0000-0000-0000-000000000000' 740 | GO 741 | 742 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 018', 743 | @message_id=0, 744 | @severity=18, 745 | @enabled=0, 746 | @delay_between_responses=60, 747 | @include_event_description_in=1, 748 | @category_name=N'[Uncategorized]', 749 | @job_id=N'00000000-0000-0000-0000-000000000000' 750 | GO 751 | 752 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 019', 753 | @message_id=0, 754 | @severity=19, 755 | @enabled=0, 756 | @delay_between_responses=60, 757 | @include_event_description_in=1, 758 | @category_name=N'[Uncategorized]', 759 | @job_id=N'00000000-0000-0000-0000-000000000000' 760 | GO 761 | 762 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 020', 763 | @message_id=0, 764 | @severity=20, 765 | @enabled=0, 766 | @delay_between_responses=60, 767 | @include_event_description_in=1, 768 | @category_name=N'[Uncategorized]', 769 | @job_id=N'00000000-0000-0000-0000-000000000000' 770 | GO 771 | 772 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 021', 773 | @message_id=0, 774 | @severity=21, 775 | @enabled=1, 776 | @delay_between_responses=60, 777 | @include_event_description_in=1, 778 | @category_name=N'[Uncategorized]', 779 | @job_id=N'00000000-0000-0000-0000-000000000000' 780 | GO 781 | 782 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 022', 783 | @message_id=0, 784 | @severity=22, 785 | @enabled=1, 786 | @delay_between_responses=60, 787 | @include_event_description_in=1, 788 | @category_name=N'[Uncategorized]', 789 | @job_id=N'00000000-0000-0000-0000-000000000000' 790 | GO 791 | 792 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 023', 793 | @message_id=0, 794 | @severity=23, 795 | @enabled=1, 796 | @delay_between_responses=60, 797 | @include_event_description_in=1, 798 | @category_name=N'[Uncategorized]', 799 | @job_id=N'00000000-0000-0000-0000-000000000000' 800 | GO 801 | 802 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 024', 803 | @message_id=0, 804 | @severity=24, 805 | @enabled=1, 806 | @delay_between_responses=60, 807 | @include_event_description_in=1, 808 | @category_name=N'[Uncategorized]', 809 | @job_id=N'00000000-0000-0000-0000-000000000000' 810 | GO 811 | 812 | EXEC msdb.dbo.sp_add_alert @name=N'Severity 025', 813 | @message_id=0, 814 | @severity=25, 815 | @enabled=1, 816 | @delay_between_responses=60, 817 | @include_event_description_in=1, 818 | @category_name=N'[Uncategorized]', 819 | @job_id=N'00000000-0000-0000-0000-000000000000' 820 | GO 821 | 822 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_10min', 823 | @enabled=1, 824 | @freq_type=4, 825 | @freq_interval=1, 826 | @freq_subday_type=4, 827 | @freq_subday_interval=10, 828 | @freq_relative_interval=0, 829 | @freq_recurrence_factor=0, 830 | @active_start_date=20180914, 831 | @active_end_date=99991231, 832 | @active_start_time=0, 833 | @active_end_time=235959, 834 | @schedule_uid=N'7a263d89-1223-48a1-a9f5-7b63e8c4f336' 835 | GO 836 | 837 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_10min', 838 | @enabled=1, 839 | @freq_type=4, 840 | @freq_interval=1, 841 | @freq_subday_type=4, 842 | @freq_subday_interval=10, 843 | @freq_relative_interval=0, 844 | @freq_recurrence_factor=0, 845 | @active_start_date=20100402, 846 | @active_end_date=99991231, 847 | @active_start_time=0, 848 | @active_end_time=235959, 849 | @schedule_uid=N'41a6d121-6b6c-4899-98de-acf704d14f5d' 850 | GO 851 | 852 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_15min', 853 | @enabled=1, 854 | @freq_type=4, 855 | @freq_interval=1, 856 | @freq_subday_type=4, 857 | @freq_subday_interval=15, 858 | @freq_relative_interval=0, 859 | @freq_recurrence_factor=0, 860 | @active_start_date=20100402, 861 | @active_end_date=99991231, 862 | @active_start_time=0, 863 | @active_end_time=235959, 864 | @schedule_uid=N'0772cf28-c787-435e-a5ed-dda1a86df02d' 865 | GO 866 | 867 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_15min', 868 | @enabled=1, 869 | @freq_type=4, 870 | @freq_interval=1, 871 | @freq_subday_type=4, 872 | @freq_subday_interval=15, 873 | @freq_relative_interval=0, 874 | @freq_recurrence_factor=0, 875 | @active_start_date=20180914, 876 | @active_end_date=99991231, 877 | @active_start_time=0, 878 | @active_end_time=235959, 879 | @schedule_uid=N'0a6139ff-a28c-48d1-8dca-47e24a87f5eb' 880 | GO 881 | 882 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_30min', 883 | @enabled=1, 884 | @freq_type=4, 885 | @freq_interval=1, 886 | @freq_subday_type=4, 887 | @freq_subday_interval=30, 888 | @freq_relative_interval=0, 889 | @freq_recurrence_factor=0, 890 | @active_start_date=20180914, 891 | @active_end_date=99991231, 892 | @active_start_time=0, 893 | @active_end_time=235959, 894 | @schedule_uid=N'6da2a147-9c77-4146-9932-c640ec187d01' 895 | GO 896 | 897 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_30min', 898 | @enabled=1, 899 | @freq_type=4, 900 | @freq_interval=1, 901 | @freq_subday_type=4, 902 | @freq_subday_interval=30, 903 | @freq_relative_interval=0, 904 | @freq_recurrence_factor=0, 905 | @active_start_date=20100402, 906 | @active_end_date=99991231, 907 | @active_start_time=0, 908 | @active_end_time=235959, 909 | @schedule_uid=N'c40e90de-5ecc-4b89-9df8-424dd6160a0a' 910 | GO 911 | 912 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_5min', 913 | @enabled=1, 914 | @freq_type=4, 915 | @freq_interval=1, 916 | @freq_subday_type=4, 917 | @freq_subday_interval=5, 918 | @freq_relative_interval=0, 919 | @freq_recurrence_factor=0, 920 | @active_start_date=20100402, 921 | @active_end_date=99991231, 922 | @active_start_time=0, 923 | @active_end_time=235959, 924 | @schedule_uid=N'a575ffd0-98a0-4d0e-b43c-b63482fb5b00' 925 | GO 926 | 927 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_5min', 928 | @enabled=1, 929 | @freq_type=4, 930 | @freq_interval=1, 931 | @freq_subday_type=4, 932 | @freq_subday_interval=5, 933 | @freq_relative_interval=0, 934 | @freq_recurrence_factor=0, 935 | @active_start_date=20180914, 936 | @active_end_date=99991231, 937 | @active_start_time=0, 938 | @active_end_time=235959, 939 | @schedule_uid=N'e9d74ad4-c27d-4d6c-8c17-439572742a97' 940 | GO 941 | 942 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_60min', 943 | @enabled=1, 944 | @freq_type=4, 945 | @freq_interval=1, 946 | @freq_subday_type=4, 947 | @freq_subday_interval=60, 948 | @freq_relative_interval=0, 949 | @freq_recurrence_factor=0, 950 | @active_start_date=20100402, 951 | @active_end_date=99991231, 952 | @active_start_time=0, 953 | @active_end_time=235959, 954 | @schedule_uid=N'fd8ac6c3-1b03-4781-8e63-e4b2fa680995' 955 | GO 956 | 957 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_60min', 958 | @enabled=1, 959 | @freq_type=4, 960 | @freq_interval=1, 961 | @freq_subday_type=4, 962 | @freq_subday_interval=60, 963 | @freq_relative_interval=0, 964 | @freq_recurrence_factor=0, 965 | @active_start_date=20180914, 966 | @active_end_date=99991231, 967 | @active_start_time=0, 968 | @active_end_time=235959, 969 | @schedule_uid=N'89b3db93-fe2a-4ae7-bc88-fa0bcca45f29' 970 | GO 971 | 972 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_6h', 973 | @enabled=1, 974 | @freq_type=4, 975 | @freq_interval=1, 976 | @freq_subday_type=8, 977 | @freq_subday_interval=6, 978 | @freq_relative_interval=0, 979 | @freq_recurrence_factor=0, 980 | @active_start_date=20180914, 981 | @active_end_date=99991231, 982 | @active_start_time=0, 983 | @active_end_time=235959, 984 | @schedule_uid=N'66aa8120-b988-433d-a766-0d05ba17831c' 985 | GO 986 | 987 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'New_CollectorSchedule_Every_6h', 988 | @enabled=1, 989 | @freq_type=4, 990 | @freq_interval=1, 991 | @freq_subday_type=8, 992 | @freq_subday_interval=6, 993 | @freq_relative_interval=0, 994 | @freq_recurrence_factor=0, 995 | @active_start_date=20100402, 996 | @active_end_date=99991231, 997 | @active_start_time=0, 998 | @active_end_time=235959, 999 | @schedule_uid=N'6a04ee27-167a-47a1-aecb-2317d8229028' 1000 | GO 1001 | 1002 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'RunAsSQLAgentServiceStartSchedule', 1003 | @enabled=1, 1004 | @freq_type=64, 1005 | @freq_interval=0, 1006 | @freq_subday_type=0, 1007 | @freq_subday_interval=0, 1008 | @freq_relative_interval=0, 1009 | @freq_recurrence_factor=0, 1010 | @active_start_date=20100402, 1011 | @active_end_date=99991231, 1012 | @active_start_time=0, 1013 | @active_end_time=235959, 1014 | @schedule_uid=N'a8240410-145c-459f-99c1-05df5b707256' 1015 | GO 1016 | 1017 | EXEC msdb.dbo.sp_add_schedule @schedule_name=N'RunAsSQLAgentServiceStartSchedule', 1018 | @enabled=1, 1019 | @freq_type=64, 1020 | @freq_interval=0, 1021 | @freq_subday_type=0, 1022 | @freq_subday_interval=0, 1023 | @freq_relative_interval=0, 1024 | @freq_recurrence_factor=0, 1025 | @active_start_date=20180914, 1026 | @active_end_date=99991231, 1027 | @active_start_time=0, 1028 | @active_end_time=235959, 1029 | @schedule_uid=N'3f66a6ae-280d-4aff-9691-c9028d272b27' 1030 | GO 1031 | 1032 | BEGIN TRANSACTION 1033 | DECLARE @ReturnCode INT 1034 | SELECT @ReturnCode = 0 1035 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1036 | BEGIN 1037 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1038 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1039 | 1040 | END 1041 | 1042 | DECLARE @jobId BINARY(16) 1043 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'CommandLog Cleanup', 1044 | @enabled=1, 1045 | @notify_level_eventlog=2, 1046 | @notify_level_email=0, 1047 | @notify_level_netsend=0, 1048 | @notify_level_page=0, 1049 | @delete_level=0, 1050 | @description=N'Source: https://ola.hallengren.com', 1051 | @category_name=N'Database Maintenance', 1052 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1053 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1054 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'CommandLog Cleanup', 1055 | @step_id=1, 1056 | @cmdexec_success_code=0, 1057 | @on_success_action=1, 1058 | @on_success_step_id=0, 1059 | @on_fail_action=2, 1060 | @on_fail_step_id=0, 1061 | @retry_attempts=0, 1062 | @retry_interval=0, 1063 | @os_run_priority=0, @subsystem=N'TSQL', 1064 | @command=N'DELETE FROM [dbo].[CommandLog] 1065 | WHERE StartTime < DATEADD(dd,-30,GETDATE())', 1066 | @database_name=N'master', 1067 | @flags=0 1068 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1069 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1070 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1071 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1072 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1073 | COMMIT TRANSACTION 1074 | GOTO EndSave 1075 | QuitWithRollback: 1076 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1077 | EndSave: 1078 | 1079 | GO 1080 | 1081 | BEGIN TRANSACTION 1082 | DECLARE @ReturnCode INT 1083 | SELECT @ReturnCode = 0 1084 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1085 | BEGIN 1086 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1087 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1088 | 1089 | END 1090 | 1091 | DECLARE @jobId BINARY(16) 1092 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - SYSTEM_DATABASES - FULL', 1093 | @enabled=1, 1094 | @notify_level_eventlog=2, 1095 | @notify_level_email=0, 1096 | @notify_level_netsend=0, 1097 | @notify_level_page=0, 1098 | @delete_level=0, 1099 | @description=N'Source: https://ola.hallengren.com', 1100 | @category_name=N'Database Maintenance', 1101 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1102 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1103 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - SYSTEM_DATABASES - FULL', 1104 | @step_id=1, 1105 | @cmdexec_success_code=0, 1106 | @on_success_action=1, 1107 | @on_success_step_id=0, 1108 | @on_fail_action=2, 1109 | @on_fail_step_id=0, 1110 | @retry_attempts=0, 1111 | @retry_interval=0, 1112 | @os_run_priority=0, @subsystem=N'TSQL', 1113 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1114 | @Databases = ''SYSTEM_DATABASES'', 1115 | @Directory = N''\\nas\sqlbackups'', 1116 | @BackupType = ''FULL'', 1117 | @Verify = ''Y'', 1118 | @CleanupTime = NULL, 1119 | @CheckSum = ''Y'', 1120 | @LogToTable = ''N''', 1121 | @database_name=N'master', 1122 | @flags=0 1123 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1124 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1125 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1126 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1127 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1128 | COMMIT TRANSACTION 1129 | GOTO EndSave 1130 | QuitWithRollback: 1131 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1132 | EndSave: 1133 | 1134 | GO 1135 | 1136 | BEGIN TRANSACTION 1137 | DECLARE @ReturnCode INT 1138 | SELECT @ReturnCode = 0 1139 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1140 | BEGIN 1141 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1142 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1143 | 1144 | END 1145 | 1146 | DECLARE @jobId BINARY(16) 1147 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - USER_DATABASES - DIFF', 1148 | @enabled=1, 1149 | @notify_level_eventlog=2, 1150 | @notify_level_email=0, 1151 | @notify_level_netsend=0, 1152 | @notify_level_page=0, 1153 | @delete_level=0, 1154 | @description=N'Source: https://ola.hallengren.com', 1155 | @category_name=N'Database Maintenance', 1156 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1157 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1158 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - USER_DATABASES - DIFF', 1159 | @step_id=1, 1160 | @cmdexec_success_code=0, 1161 | @on_success_action=1, 1162 | @on_success_step_id=0, 1163 | @on_fail_action=2, 1164 | @on_fail_step_id=0, 1165 | @retry_attempts=0, 1166 | @retry_interval=0, 1167 | @os_run_priority=0, @subsystem=N'TSQL', 1168 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1169 | @Databases = ''USER_DATABASES'', 1170 | @Directory = N''\\nas\sqlbackups'', 1171 | @BackupType = ''DIFF'', 1172 | @Verify = ''Y'', 1173 | @CleanupTime = NULL, 1174 | @CheckSum = ''Y'', 1175 | @LogToTable = ''N''', 1176 | @database_name=N'master', 1177 | @flags=0 1178 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1179 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1180 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1181 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1182 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1183 | COMMIT TRANSACTION 1184 | GOTO EndSave 1185 | QuitWithRollback: 1186 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1187 | EndSave: 1188 | 1189 | GO 1190 | 1191 | BEGIN TRANSACTION 1192 | DECLARE @ReturnCode INT 1193 | SELECT @ReturnCode = 0 1194 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1195 | BEGIN 1196 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1197 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1198 | 1199 | END 1200 | 1201 | DECLARE @jobId BINARY(16) 1202 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - USER_DATABASES - FULL', 1203 | @enabled=1, 1204 | @notify_level_eventlog=2, 1205 | @notify_level_email=0, 1206 | @notify_level_netsend=0, 1207 | @notify_level_page=0, 1208 | @delete_level=0, 1209 | @description=N'Source: https://ola.hallengren.com', 1210 | @category_name=N'Database Maintenance', 1211 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1212 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1213 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - USER_DATABASES - FULL', 1214 | @step_id=1, 1215 | @cmdexec_success_code=0, 1216 | @on_success_action=1, 1217 | @on_success_step_id=0, 1218 | @on_fail_action=2, 1219 | @on_fail_step_id=0, 1220 | @retry_attempts=0, 1221 | @retry_interval=0, 1222 | @os_run_priority=0, @subsystem=N'TSQL', 1223 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1224 | @Databases = ''USER_DATABASES'', 1225 | @Directory = N''\\nas\sqlbackups'', 1226 | @BackupType = ''FULL'', 1227 | @Verify = ''Y'', 1228 | @CleanupTime = NULL, 1229 | @CheckSum = ''Y'', 1230 | @LogToTable = ''N''', 1231 | @database_name=N'master', 1232 | @flags=0 1233 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1234 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1235 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1236 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1237 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1238 | COMMIT TRANSACTION 1239 | GOTO EndSave 1240 | QuitWithRollback: 1241 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1242 | EndSave: 1243 | 1244 | GO 1245 | 1246 | BEGIN TRANSACTION 1247 | DECLARE @ReturnCode INT 1248 | SELECT @ReturnCode = 0 1249 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1250 | BEGIN 1251 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1252 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1253 | 1254 | END 1255 | 1256 | DECLARE @jobId BINARY(16) 1257 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseBackup - USER_DATABASES - LOG', 1258 | @enabled=1, 1259 | @notify_level_eventlog=2, 1260 | @notify_level_email=0, 1261 | @notify_level_netsend=0, 1262 | @notify_level_page=0, 1263 | @delete_level=0, 1264 | @description=N'Source: https://ola.hallengren.com', 1265 | @category_name=N'Database Maintenance', 1266 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1267 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1268 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseBackup - USER_DATABASES - LOG', 1269 | @step_id=1, 1270 | @cmdexec_success_code=0, 1271 | @on_success_action=1, 1272 | @on_success_step_id=0, 1273 | @on_fail_action=2, 1274 | @on_fail_step_id=0, 1275 | @retry_attempts=0, 1276 | @retry_interval=0, 1277 | @os_run_priority=0, @subsystem=N'TSQL', 1278 | @command=N'EXECUTE [dbo].[DatabaseBackup] 1279 | @Databases = ''USER_DATABASES'', 1280 | @Directory = N''\\nas\sqlbackups'', 1281 | @BackupType = ''LOG'', 1282 | @Verify = ''Y'', 1283 | @CleanupTime = NULL, 1284 | @CheckSum = ''Y'', 1285 | @LogToTable = ''N''', 1286 | @database_name=N'master', 1287 | @flags=0 1288 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1289 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1290 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1291 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1292 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1293 | COMMIT TRANSACTION 1294 | GOTO EndSave 1295 | QuitWithRollback: 1296 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1297 | EndSave: 1298 | 1299 | GO 1300 | 1301 | BEGIN TRANSACTION 1302 | DECLARE @ReturnCode INT 1303 | SELECT @ReturnCode = 0 1304 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1305 | BEGIN 1306 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1307 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1308 | 1309 | END 1310 | 1311 | DECLARE @jobId BINARY(16) 1312 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseIntegrityCheck - SYSTEM_DATABASES', 1313 | @enabled=1, 1314 | @notify_level_eventlog=2, 1315 | @notify_level_email=0, 1316 | @notify_level_netsend=0, 1317 | @notify_level_page=0, 1318 | @delete_level=0, 1319 | @description=N'Source: https://ola.hallengren.com', 1320 | @category_name=N'Database Maintenance', 1321 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1322 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1323 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseIntegrityCheck - SYSTEM_DATABASES', 1324 | @step_id=1, 1325 | @cmdexec_success_code=0, 1326 | @on_success_action=1, 1327 | @on_success_step_id=0, 1328 | @on_fail_action=2, 1329 | @on_fail_step_id=0, 1330 | @retry_attempts=0, 1331 | @retry_interval=0, 1332 | @os_run_priority=0, @subsystem=N'TSQL', 1333 | @command=N'EXECUTE [dbo].[DatabaseIntegrityCheck] 1334 | @Databases = ''SYSTEM_DATABASES'', 1335 | @LogToTable = ''N''', 1336 | @database_name=N'master', 1337 | @flags=0 1338 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1339 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1340 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1341 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1342 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1343 | COMMIT TRANSACTION 1344 | GOTO EndSave 1345 | QuitWithRollback: 1346 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1347 | EndSave: 1348 | 1349 | GO 1350 | 1351 | BEGIN TRANSACTION 1352 | DECLARE @ReturnCode INT 1353 | SELECT @ReturnCode = 0 1354 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1355 | BEGIN 1356 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1357 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1358 | 1359 | END 1360 | 1361 | DECLARE @jobId BINARY(16) 1362 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DatabaseIntegrityCheck - USER_DATABASES', 1363 | @enabled=1, 1364 | @notify_level_eventlog=2, 1365 | @notify_level_email=0, 1366 | @notify_level_netsend=0, 1367 | @notify_level_page=0, 1368 | @delete_level=0, 1369 | @description=N'Source: https://ola.hallengren.com', 1370 | @category_name=N'Database Maintenance', 1371 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1372 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1373 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseIntegrityCheck - USER_DATABASES', 1374 | @step_id=1, 1375 | @cmdexec_success_code=0, 1376 | @on_success_action=1, 1377 | @on_success_step_id=0, 1378 | @on_fail_action=2, 1379 | @on_fail_step_id=0, 1380 | @retry_attempts=0, 1381 | @retry_interval=0, 1382 | @os_run_priority=0, @subsystem=N'TSQL', 1383 | @command=N'EXECUTE [dbo].[DatabaseIntegrityCheck] 1384 | @Databases = ''USER_DATABASES'', 1385 | @LogToTable = ''N''', 1386 | @database_name=N'master', 1387 | @flags=0 1388 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1389 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1390 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1391 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1392 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1393 | COMMIT TRANSACTION 1394 | GOTO EndSave 1395 | QuitWithRollback: 1396 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1397 | EndSave: 1398 | 1399 | GO 1400 | 1401 | BEGIN TRANSACTION 1402 | DECLARE @ReturnCode INT 1403 | SELECT @ReturnCode = 0 1404 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1405 | BEGIN 1406 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1407 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1408 | 1409 | END 1410 | 1411 | DECLARE @jobId BINARY(16) 1412 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'IndexOptimize - USER_DATABASES', 1413 | @enabled=1, 1414 | @notify_level_eventlog=2, 1415 | @notify_level_email=0, 1416 | @notify_level_netsend=0, 1417 | @notify_level_page=0, 1418 | @delete_level=0, 1419 | @description=N'Source: https://ola.hallengren.com', 1420 | @category_name=N'Database Maintenance', 1421 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1422 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1423 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'IndexOptimize - USER_DATABASES', 1424 | @step_id=1, 1425 | @cmdexec_success_code=0, 1426 | @on_success_action=1, 1427 | @on_success_step_id=0, 1428 | @on_fail_action=2, 1429 | @on_fail_step_id=0, 1430 | @retry_attempts=0, 1431 | @retry_interval=0, 1432 | @os_run_priority=0, @subsystem=N'TSQL', 1433 | @command=N'EXECUTE [dbo].[IndexOptimize] 1434 | @Databases = ''USER_DATABASES'', 1435 | @LogToTable = ''N''', 1436 | @database_name=N'master', 1437 | @flags=0 1438 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1439 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1440 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1441 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1442 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1443 | COMMIT TRANSACTION 1444 | GOTO EndSave 1445 | QuitWithRollback: 1446 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1447 | EndSave: 1448 | 1449 | GO 1450 | 1451 | BEGIN TRANSACTION 1452 | DECLARE @ReturnCode INT 1453 | SELECT @ReturnCode = 0 1454 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1455 | BEGIN 1456 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1457 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1458 | 1459 | END 1460 | 1461 | DECLARE @jobId BINARY(16) 1462 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Output File Cleanup', 1463 | @enabled=1, 1464 | @notify_level_eventlog=2, 1465 | @notify_level_email=0, 1466 | @notify_level_netsend=0, 1467 | @notify_level_page=0, 1468 | @delete_level=0, 1469 | @description=N'Source: https://ola.hallengren.com', 1470 | @category_name=N'Database Maintenance', 1471 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1472 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1473 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Output File Cleanup', 1474 | @step_id=1, 1475 | @cmdexec_success_code=0, 1476 | @on_success_action=1, 1477 | @on_success_step_id=0, 1478 | @on_fail_action=2, 1479 | @on_fail_step_id=0, 1480 | @retry_attempts=0, 1481 | @retry_interval=0, 1482 | @os_run_priority=0, @subsystem=N'CmdExec', 1483 | @command=N'cmd', 1484 | @flags=0 1485 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1486 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1487 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1488 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1489 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1490 | COMMIT TRANSACTION 1491 | GOTO EndSave 1492 | QuitWithRollback: 1493 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1494 | EndSave: 1495 | 1496 | GO 1497 | 1498 | BEGIN TRANSACTION 1499 | DECLARE @ReturnCode INT 1500 | SELECT @ReturnCode = 0 1501 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1502 | BEGIN 1503 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1504 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1505 | 1506 | END 1507 | 1508 | DECLARE @jobId BINARY(16) 1509 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'sp_delete_backuphistory', 1510 | @enabled=1, 1511 | @notify_level_eventlog=2, 1512 | @notify_level_email=0, 1513 | @notify_level_netsend=0, 1514 | @notify_level_page=0, 1515 | @delete_level=0, 1516 | @description=N'Source: https://ola.hallengren.com', 1517 | @category_name=N'Database Maintenance', 1518 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1519 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1520 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'sp_delete_backuphistory', 1521 | @step_id=1, 1522 | @cmdexec_success_code=0, 1523 | @on_success_action=1, 1524 | @on_success_step_id=0, 1525 | @on_fail_action=2, 1526 | @on_fail_step_id=0, 1527 | @retry_attempts=0, 1528 | @retry_interval=0, 1529 | @os_run_priority=0, @subsystem=N'TSQL', 1530 | @command=N'DECLARE @CleanupDate datetime 1531 | SET @CleanupDate = DATEADD(dd,-30,GETDATE()) 1532 | EXECUTE dbo.sp_delete_backuphistory @oldest_date = @CleanupDate', 1533 | @database_name=N'msdb', 1534 | @flags=0 1535 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1536 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1537 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1538 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1539 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1540 | COMMIT TRANSACTION 1541 | GOTO EndSave 1542 | QuitWithRollback: 1543 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1544 | EndSave: 1545 | 1546 | GO 1547 | 1548 | BEGIN TRANSACTION 1549 | DECLARE @ReturnCode INT 1550 | SELECT @ReturnCode = 0 1551 | IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 1552 | BEGIN 1553 | EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 1554 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1555 | 1556 | END 1557 | 1558 | DECLARE @jobId BINARY(16) 1559 | EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'sp_purge_jobhistory', 1560 | @enabled=1, 1561 | @notify_level_eventlog=2, 1562 | @notify_level_email=0, 1563 | @notify_level_netsend=0, 1564 | @notify_level_page=0, 1565 | @delete_level=0, 1566 | @description=N'Source: https://ola.hallengren.com', 1567 | @category_name=N'Database Maintenance', 1568 | @owner_login_name=N'sa', @job_id = @jobId OUTPUT 1569 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1570 | EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'sp_purge_jobhistory', 1571 | @step_id=1, 1572 | @cmdexec_success_code=0, 1573 | @on_success_action=1, 1574 | @on_success_step_id=0, 1575 | @on_fail_action=2, 1576 | @on_fail_step_id=0, 1577 | @retry_attempts=0, 1578 | @retry_interval=0, 1579 | @os_run_priority=0, @subsystem=N'TSQL', 1580 | @command=N'DECLARE @CleanupDate datetime 1581 | SET @CleanupDate = DATEADD(dd,-30,GETDATE()) 1582 | EXECUTE dbo.sp_purge_jobhistory @oldest_date = @CleanupDate', 1583 | @database_name=N'msdb', 1584 | @flags=0 1585 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1586 | EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 1587 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1588 | EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' 1589 | IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 1590 | COMMIT TRANSACTION 1591 | GOTO EndSave 1592 | QuitWithRollback: 1593 | IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 1594 | EndSave: 1595 | 1596 | GO -------------------------------------------------------------------------------- /sqlinstance/sql/create-regserver.sql: -------------------------------------------------------------------------------- 1 | Declare @server_group_id int 2 | EXEC msdb.dbo.sp_sysmanagement_add_shared_server_group @parent_id=1, @name=N'Production', @description=N'', @server_type=0, @server_group_id=@server_group_id OUTPUT 3 | Select @server_group_id 4 | 5 | go 6 | Declare @server_id int 7 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2005 Ent', @server_name=N'sql2005', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 8 | Select @server_id 9 | 10 | go 11 | Declare @server_id int 12 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2005', @server_name=N'SQL2005', @description=N'SharePoint dbs', @server_type=0, @server_id=@server_id OUTPUT 13 | Select @server_id 14 | 15 | go 16 | Declare @server_id int 17 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2008 R2 Instance', @server_name=N'sql2008', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 18 | Select @server_id 19 | 20 | go 21 | 22 | Declare @server_id int 23 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2008', @server_name=N'sql2008\sql2k8', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 24 | Select @server_id 25 | 26 | go 27 | 28 | Declare @server_id int 29 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=6, @name=N'SQL Server 2012', @server_name=N'sql2012', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 30 | Select @server_id 31 | 32 | go 33 | Declare @server_group_id int 34 | EXEC msdb.dbo.sp_sysmanagement_add_shared_server_group @parent_id=1, @name=N'Test', @description=N'', @server_type=0, @server_group_id=@server_group_id OUTPUT 35 | Select @server_group_id 36 | 37 | go 38 | Declare @server_id int 39 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=7, @name=N'SQL Server 2000 Dev', @server_name=N'sql2000', @description=N'', @server_type=0, @server_id=@server_id OUTPUT 40 | Select @server_id 41 | 42 | go 43 | Declare @server_id int 44 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=7, @name=N'SQL Server 2005 Express Instance', @server_name=N'sql2005express\sqlexpress', @description=N'Instance', @server_type=0, @server_id=@server_id OUTPUT 45 | Select @server_id 46 | go 47 | Declare @server_id int 48 | EXEC msdb.dbo.sp_sysmanagement_add_shared_registered_server @server_group_id=7, @name=N'The 2008 Clustered Instance', @server_name=N'sql01', @description=N'HR''s Dedicated SharePoint instance', @server_type=0, @server_id=@server_id OUTPUT 49 | Select @server_id 50 | 51 | go 52 | -------------------------------------------------------------------------------- /sqlinstance/sql/mssql.conf: -------------------------------------------------------------------------------- 1 | [EULA] 2 | accepteula = Y 3 | accepteulaml = Y 4 | 5 | [filelocation] 6 | defaultbackupdir = /shared/ 7 | defaultdatadir = /var/opt/mssql/data/ 8 | defaultdumpdir = /var/opt/mssql/data/ 9 | defaultlogdir = /var/opt/mssql/data/ 10 | 11 | [hadr] 12 | hadrenabled = 1 13 | 14 | [language] 15 | lcid = 1033 16 | 17 | [memory] 18 | memorylimitmb = 4096 19 | 20 | [sqlagent] 21 | enabled = true 22 | databasemailprofile = default 23 | errorlogfile = /var/opt/mssql/log/sqlagentlog.log 24 | errorlogginglevel = 7 25 | 26 | [telemetry] 27 | customerfeedback = true 28 | userrequestedlocalauditdirectory = /tmp/audit -------------------------------------------------------------------------------- /sqlinstance/sql/restore-db.sql: -------------------------------------------------------------------------------- 1 | USE [master] 2 | RESTORE DATABASE [Northwind] FROM DISK = N'/tmp/northwind.bak' WITH FILE = 1, MOVE N'Northwind' TO N'/var/opt/mssql/data/northwnd.mdf', MOVE N'Northwind_log' TO N'/var/opt/mssql/data/northwnd.ldf', NOUNLOAD, STATS = 5 3 | 4 | GO 5 | 6 | USE [master] 7 | RESTORE DATABASE [pubs] FROM DISK = N'/tmp/pubs.bak' WITH FILE = 1, MOVE N'pubs' TO N'/var/opt/mssql/data/pubs.mdf', MOVE N'pubs_log' TO N'/var/opt/mssql/data/pubs_log.ldf', NOUNLOAD, STATS = 5 8 | 9 | GO 10 | 11 | USE [master] 12 | ALTER AUTHORIZATION ON DATABASE::[Northwind] TO [sqladmin] 13 | ALTER AUTHORIZATION ON DATABASE::[pubs] TO [sqladmin] 14 | 15 | GO -------------------------------------------------------------------------------- /sqlinstance/sql/sapassword.env: -------------------------------------------------------------------------------- 1 | MSSQL_SA_PASSWORD=dbatools.IO -------------------------------------------------------------------------------- /sqlinstance/sql/sqlcmd.env: -------------------------------------------------------------------------------- 1 | SQLCMDSERVER=localhost 2 | SQLCMDUSER=sa 3 | SQLCMDPASSWORD=dbatools.IO -------------------------------------------------------------------------------- /tests/actions-arm64.ps1: -------------------------------------------------------------------------------- 1 | Describe "Integration Tests" -Tag "IntegrationTests" { 2 | BeforeAll { 3 | $password = ConvertTo-SecureString "dbatools.IO" -AsPlainText -Force 4 | $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "sqladmin", $password 5 | 6 | $PSDefaultParameterValues["*:Confirm"] = $false 7 | } 8 | 9 | It "creates migrates from one instance to another" { 10 | $params = @{ 11 | Source = "localhost" 12 | SourceSqlCredential = $cred 13 | Destination = "localhost:14333" 14 | DestinationSqlCredential = $cred 15 | BackupRestore = $true 16 | SharedPath = "/shared" 17 | Exclude = "LinkedServers", "Credentials", "BackupDevices", "ExtendedEvents" 18 | Force = $true 19 | } 20 | 21 | $results = Start-DbaMigration @params 22 | $results.Name | Should -Contain "Northwind" 23 | $results | Where-Object Name -eq "Northwind" | Select-Object -ExpandProperty Status | Should -Be "Successful" 24 | } 25 | } -------------------------------------------------------------------------------- /tests/actions.ps1: -------------------------------------------------------------------------------- 1 | Describe "Integration Tests" -Tag "IntegrationTests" { 2 | BeforeAll { 3 | $password = ConvertTo-SecureString "dbatools.IO" -AsPlainText -Force 4 | $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "sqladmin", $password 5 | 6 | $PSDefaultParameterValues["*:Confirm"] = $false 7 | } 8 | 9 | It "creates an availability group" { 10 | $params = @{ 11 | Primary = "localhost" 12 | PrimarySqlCredential = $cred 13 | Secondary = "localhost:14333" 14 | SecondarySqlCredential = $cred 15 | Name = "test-ag" 16 | Database = "pubs" 17 | ClusterType = "None" 18 | SeedingMode = "Automatic" 19 | FailoverMode = "Manual" 20 | Confirm = $false 21 | } 22 | (New-DbaAvailabilityGroup @params).AvailabilityDatabases.Name | Should -Be "pubs" 23 | } 24 | 25 | It "sets up a mirror" { 26 | # Test mirroring 27 | $newdb = New-DbaDatabase -SqlInstance localhost -SqlCredential $cred 28 | 29 | $params = @{ 30 | Primary = "localhost" 31 | PrimarySqlCredential = $cred 32 | Mirror = "localhost:14333" 33 | MirrorSqlCredential = $cred 34 | Database = $newdb.Name 35 | SharedPath = "/shared" 36 | Force = $true 37 | Verbose = $false 38 | } 39 | 40 | Invoke-DbaDbMirroring @params | Select-Object -ExpandProperty Status | Should -Be "Success" 41 | Get-DbaDbMirror -SqlInstance localhost -SqlCredential $cred | Select-Object -ExpandProperty MirroringPartner | Should -Be "TCP://mssql2:5022" 42 | } 43 | } --------------------------------------------------------------------------------