|
1 | 1 | #!/bin/bash |
2 | | -set -eu |
| 2 | +set -u |
3 | 3 |
|
4 | 4 | # Get container name and password from arguments |
5 | 5 | SQL_SERVER_CONTAINER_NAME=$1 |
6 | 6 | SQL_SERVER_PASSWORD=$2 |
| 7 | +MAX_RETRY_COUNT=$3 |
| 8 | +RETRY_INTERVAL=$4 |
| 9 | +COUNT=0 |
| 10 | + |
| 11 | +echo "INFO: Creating no superuser start." |
| 12 | + |
| 13 | +# A SQL Server container takes a few seconds to start SQL Server process |
| 14 | +# in the container. So, first, we wait ${RETRY_INTERVAL} seconds before |
| 15 | +# we run the `sqlcmd` command in the container. |
| 16 | +echo "INFO: Sleep ${RETRY_INTERVAL} seconds to wait for SQL Server start." |
| 17 | + |
| 18 | +while [[ ${COUNT} -lt ${MAX_RETRY_COUNT} ]] |
| 19 | +do |
| 20 | + sleep ${RETRY_INTERVAL} |
| 21 | + |
| 22 | + echo "INFO: Retry count: ${COUNT}" |
| 23 | + |
| 24 | + docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -Q "SELECT 1" |
| 25 | + if [[ $? -eq 0 ]]; then |
| 26 | + break |
| 27 | + else |
| 28 | + echo "INFO: sqlcmd command failed. Will retry after ${RETRY_INTERVAL} seconds." |
| 29 | + fi |
| 30 | + |
| 31 | + COUNT=$((COUNT + 1)) |
| 32 | + |
| 33 | + if [[ ${COUNT} -eq ${MAX_RETRY_COUNT} ]]; then |
| 34 | + echo "ERROR: sqlcmd command failed ${MAX_RETRY_COUNT} times. Please check your configuration." >&2 |
| 35 | + exit 1 |
| 36 | + fi |
| 37 | +done |
| 38 | + |
| 39 | +echo "INFO: sqlcmd command succeeded. Continue creating no superuser." |
7 | 40 |
|
8 | 41 | # Create login |
| 42 | +echo "INFO: Create login start" |
9 | 43 | docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -Q "CREATE LOGIN no_superuser WITH PASSWORD = 'no_superuser_password', DEFAULT_DATABASE = master , CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF" |
| 44 | +echo "INFO: Create login end" |
10 | 45 |
|
11 | 46 | # Create database |
12 | | -docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -Q "CREATE DATABASE test_db" |
| 47 | +echo "INFO: Create database start" |
| 48 | +docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -Q "CREATE DATABASE test_db COLLATE Japanese_BIN2" |
| 49 | +echo "INFO: Create database end" |
13 | 50 |
|
14 | 51 | # Create no_superuser |
| 52 | +echo "INFO: Create no_superuser start" |
15 | 53 | docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -Q "CREATE USER no_superuser FOR LOGIN no_superuser" |
| 54 | +echo "INFO: Create no_superuser end" |
16 | 55 |
|
17 | 56 | # Add roles |
| 57 | +echo "INFO: Add role db_ddladmin start" |
18 | 58 | docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -Q "EXEC sp_addrolemember @rolename = 'db_ddladmin', @membername = 'no_superuser'" |
| 59 | +echo "INFO: Add role db_ddladmin end" |
| 60 | + |
| 61 | +echo "INFO: Add role db_datawriter start" |
19 | 62 | docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -Q "EXEC sp_addrolemember @rolename = 'db_datawriter', @membername = 'no_superuser'" |
| 63 | +echo "INFO: Add role db_datawriter end" |
| 64 | + |
| 65 | +echo "INFO: Add role db_datareader start" |
20 | 66 | docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -Q "EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'no_superuser'" |
| 67 | +echo "INFO: Add role db_datareader end" |
| 68 | + |
| 69 | +# Check the collation of test_db (for debugging purposes) |
| 70 | +echo "INFO: Check collation start" |
| 71 | +docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U no_superuser -P no_superuser_password -d test_db -Q "SELECT name, collation_name FROM sys.databases" -W |
| 72 | +echo "INFO: Check collation end" |
21 | 73 |
|
22 | 74 | # Check if no_superuser can access SQL Server (for debugging purposes) |
| 75 | +echo "INFO: SELECT @@version start" |
23 | 76 | docker exec -t ${SQL_SERVER_CONTAINER_NAME} /opt/mssql-tools/bin/sqlcmd -S localhost -U no_superuser -P no_superuser_password -d test_db -Q "SELECT @@version" |
| 77 | +echo "INFO: SELECT @@version end" |
| 78 | + |
| 79 | +echo "INFO: Creating no superuser succeeded." |
0 commit comments