install SQL Server to Oracle Linux 8 - end0tknr's kipple - web写経開発
先日の上記entryの続きです。
今回は、SQL Server 2022 for Linux に対し、 utf-8で記載されたcsvファイルをbcpコマンドでインポートします。
目次
- utf-8のデータベース作成と、その確認
- ログインユーザとデータベースユーザの追加
- ロールへのユーザの追加
- インポート先のテーブル作成と確認
- /opt/mssql/lib/mssql-conf/mssqlsettingsmanager.py の編集
- utf-8で記載されたcsvファイルをbcpコマンドでインポート
- インポート結果の確認
utf-8のデータベース作成と、その確認
sql serverで、日本語のutf-8を扱う場合、 「COLLATE Japanese_XJIS_140_CI_AS_UTF8」を指定するようですので 以下のようにデータベース作成します。
$ sqlcmd -S localhost -U sa -P ????24k! -C -s\| -W SQL> CREATE DATABASE xserial COLLATE Japanese_XJIS_140_CI_AS_UTF8 go SQL> SELECT db.name, db.create_date, pcpl.name as owner, collation_name FROM sys.databases db JOIN sys.server_principals pcpl ON db.owner_sid=pcpl.sid go
ログインユーザとデータベースユーザの追加
sql serverでは、db接続用の「ログインユーザ」と、 db操作用の「データベースユーザ」の2つが必要ですので、追加します。
まず、ログインユーザの追加と、追加結果の確認
SQL> CREATE LOGIN end0tknr WITH PASSWORD = 'end0tknr', CHECK_EXPIRATION= OFF, CHECK_POLICY = OFF go SQL> SELECT name, sid, type_desc, FORMAT(create_date, 'yyyy-MM-dd') as create_date, FORMAT(modify_date, 'yyyy-MM-dd') as modify_date FROM sys.server_principals WHERE type IN ('S','U') go name |sid |type_desc|create_date|modify_date --------|------------|---------|-----------|----------- sa |0x01 |SQL_LOGIN|2003-04-08 |2024-04-23 end0tknr|0xC5AE<略>|SQL_LOGIN|2024-04-27 |2024-04-27
次に先程作成したデータベース用のユーザ追加と、確認
USE xserial go CREATE USER end0tknr FOR LOGIN end0tknr go SELECT name, sid, type_desc, FORMAT(create_date, 'yyyy-MM-dd') as create_date, FORMAT(modify_date, 'yyyy-MM-dd') as modify_date FROM sys.database_principals WHERE type IN ('S','U') go name |sid |type_desc|create_date|modify_date ------------------|-------|---------|-----------|----------- dbo |0x01 |SQL_USER |2003-04-08 |2024-04-27 guest |0x00 |SQL_USER |2003-04-08 |2003-04-08 INFORMATION_SCHEMA|NULL |SQL_USER |2009-04-13 |2009-04-13 sys |NULL |SQL_USER |2009-04-13 |2009-04-13 end0tknr |0xC5 略|SQL_USER |2024-04-27 |2024-04-27
ロールへのユーザの追加
use xserial go ALTER ROLE db_owner ADD MEMBER end0tknr go SELECT DP1.name AS DatabaseRoleName, isnull (DP2.name, 'No members') AS DatabaseUserName FROM sys.database_role_members AS DRM RIGHT OUTER JOIN sys.database_principals AS DP1 ON DRM.role_principal_id = DP1.principal_id LEFT OUTER JOIN sys.database_principals AS DP2 ON DRM.member_principal_id = DP2.principal_id WHERE DP1.type = 'R' ORDER BY DP1.name go DatabaseRoleName |DatabaseUserName -----------------|---------------- db_accessadmin |No members db_backupoperator|No members db_datareader |No members db_datawriter |No members db_ddladmin |No members db_denydatareader|No members db_denydatawriter|No members db_owner |dbo db_owner |end0tknr db_securityadmin |No members public |No members
参考url
次に sysadmin ロールにも追加します。
sql serverには、bulkadmin というバルクインサート用のロールがありますが、 ドキュメントによれば、
SQL Server on Linux では、ADMINISTER BULK OPERATIONS アクセス許可 または bulkadmin ロールはサポートされていません。 SQL Server on Linux に対して一括挿入を実行できるのは、sysadmin だけです。 https://learn.microsoft.com/ja-jp/sql/t-sql/statements/bulk-insert-transact-sql
のようですので、次の手順でロールにメンバーを追加します。
SQL> use master go SQL> ALTER SERVER ROLE sysadmin ADD MEMBER end0tknr go SQL> SELECT rp.name, mp.name FROM sys.server_role_members srm JOIN sys.server_principals rp ON srm.role_principal_id = rp.principal_id JOIN sys.server_principals mp ON srm.member_principal_id = mp.principal_id WHERE mp.name = 'end0tknr' go name |name --------|-------- sysadmin|end0tknr
インポート先のテーブル作成と確認
SQL> CREATE TABLE dteam_attr ( dteam_code char(3) DEFAULT ' ' NOT NULL, dteam_name varchar(40) DEFAULT ' ' NOT NULL , entry_day char(8) DEFAULT ' ' NOT NULL, renew_day char(8) DEFAULT ' ' NOT NULL, constraint dteam_attr_uidx primary key clustered (dteam_code) ) go
SQL> SELECT name, type, type_desc, FORMAT(create_date, 'yyyy-MM-dd') as create_date, FORMAT(modify_date, 'yyyy-MM-dd') as modify_date FROM sys.objects WHERE type = 'U' go name |type|type_desc |create_date|modify_date ----------|----|----------|-----------|----------- dteam_attr|U |USER_TABLE|2024-04-27 |2024-04-27 SQL> SELECT TABLE_CATALOG as CATALOG, TABLE_SCHEMA as SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION as POS, COLUMN_DEFAULT as DETAULT, IS_NULLABLE as NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH as MAX_LEN FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'dteam_attr' go CATALOG|SCHEMA|TABLE_NAME|COLUMN_NAME|POS|DEFAULT|NULLABLE|DATA_TYPE|MAX_LEN -------|------|----------|-----------|---|-------|--------|---------|------- xserial|dbo |dteam_attr|dteam_code |1 |(' ') |NO |char |3 xserial|dbo |dteam_attr|dteam_name |2 |(' ') |NO |varchar |40 xserial|dbo |dteam_attr|entry_day |3 |(' ') |NO |char |8 xserial|dbo |dteam_attr|renew_day |4 |(' ') |NO |char |8 SQL> SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'dteam_attr' go CONSTRAINT_CATALOG|CONSTRAINT_SCHEMA|CONSTRAINT_NAME|TABLE_CATALOG|TABLE_SCHEMA|TABLE_NAME|COLUMN_NAME ------------------|-----------------|---------------|-------------|------------|----------|----------- xserial |dbo |dteam_attr_uidx|xserial |dbo |dteam_attr|dteam_code SQL> SELECT name, collation_name FROM sys.columns WHERE name = 'dteam_name' name |collation_name ----------|----------------------------- dteam_name|Japanese_XJIS_140_CI_AS_UTF8
/opt/mssql/lib/mssql-conf/mssqlsettingsmanager.py の編集
この後、実行する bcp コマンドで、sslのエラーになったので、 以下のように FORCE_ENCRYPTION を Falseに。
(更に後から実行すると、sslエラーにならなかったので、実は不要だったのかも)
supportedSettingsList.append(mssqlsettings.BooleanSetting("forceencryption", "MSSQL_FORCE_ENCRYPTION", mssqlsettings.SettingValueType.boolean, _("Force encryption of incoming client connections"), mssqlsettings.SectionForSetting.network, False, # True, "1", # true value "0")) # false value
上記の編集後、sql server再起動
$ sudo systemctl restart mssql-server
utf-8で記載されたcsvファイルをbcpコマンドでインポート
$ bcp dteam_attr in /home/end0tknr/tmp/BCP/dteam_attr.bcp -S localhost -d xserial -U end0tknr -P end0tknr -q -c -t "," -u Starting copy... SQLState = 22001, NativeError = 0 Error = [Microsoft][ODBC Driver 18 for SQL Server]String data, right truncation 28 rows copied. Network packet size (bytes): 4096 Clock Time (ms.) Total : 30 Average : (933.3 rows per sec.)
インポート結果の確認
$ sqlcmd -S localhost -U end0tknr -P end0tknr -C -s\| -W 1> use xserial 2> go Changed database context to 'xserial'. 1> select * from dteam_attr 2> go dteam_code|dteam_name|entry_day|renew_day ----------|----------|---------|--------- ele |電気 |19910528 |20240227 <略> (28 rows affected)