Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Connect ke sumber data Microsoft SQL Server
Gunakan sumber data Microsoft SQL Server (MSSQL) untuk menanyakan dan memvisualisasikan data dari Microsoft SQL Server 2005 atau yang lebih baru, termasuk Microsoft Azure SQL Database.
penting
Grafana versi 8.0 mengubah struktur data yang mendasari untuk frame data untuk Microsoft SQL Server, Postgres, dan MySQL. Akibatnya, hasil kueri deret waktu dikembalikan dalam format lebar. Untuk informasi selengkapnya, lihat Format lebar
Untuk membuat visualisasi Anda berfungsi seperti sebelumnya, Anda mungkin harus melakukan beberapa migrasi manual. Salah satu solusi didokumentasikan di Github di Postgres/MySQL/MSSQL: Memecahkan perubahan di v8.0 terkait dengan kueri deret waktu dan urutan kolom
Menambahkan sumber data
-
Buka menu samping dengan memilih ikon Grafana di header atas.
-
Di menu samping di bawah tautan, Konfigurasi Anda harus menemukan tautan Sumber Data.
-
Pilih tombol + Tambahkan sumber data di header atas.
-
Pilih Microsoft SQL Server dari Type daftar dropdown.
Opsi sumber data
Nama | Penjelasan |
---|---|
Name
|
Nama sumber data. Ini adalah bagaimana Anda melihat sumber data di panel dan kueri. |
Default
|
Sumber data default berarti bahwa itu akan dipilih sebelumnya untuk panel baru. |
Host
|
Alamat IP/nama host dan port opsional instans MSSQL Anda. Jika port dihilangkan, default 1433 akan digunakan. |
Database
|
Nama database MSSQL Anda. |
User
|
Login/nama pengguna database pengguna. |
Password
|
Kata sandi pengguna basis data. |
Encrypt
|
Opsi ini menentukan apakah atau sejauh mana koneksi SSL TCP/IP aman akan dinegosiasikan dengan server, default (false Grafana v5.4 +). |
Max open
|
Jumlah maksimum koneksi terbuka ke database, default unlimited (Grafana v5.4+). |
Max idle
|
Jumlah maksimum koneksi di kolam koneksi idle, default 2 (Grafana v5.4+). |
Max lifetime
|
Jumlah maksimum waktu dalam hitungan detik koneksi dapat digunakan kembali, default 14400 /4 jam. |
Interval waktu min
Batas bawah untuk $_interval
$_interval_ms
variabel. Disarankan untuk diatur untuk menulis frekuensi, misalnya 1m
jika data Anda ditulis setiap menit. Opsi ini juga dapat diganti/dikonfigurasi di panel dasbor di bawah opsi sumber data. Nilai ini harus diformat sebagai angka diikuti oleh pengenal waktu yang valid; misalnya, 1m
(1 menit) atau 30s
(30 detik). Pengidentifikasi waktu berikut didukung.
Pengidentifikasi | Deskripsi |
---|---|
y
|
Tahun |
M
|
Bulan |
w
|
Minggu |
d
|
Hari |
h
|
Jam |
m
|
Menit |
s
|
Detik |
ms
|
Milidetik |
Izin pengguna basis data
penting
Pengguna database yang Anda tentukan saat Anda menambahkan sumber data seharusnya hanya diberikan izin SELECT pada database dan tabel tertentu yang ingin Anda kueri. Grafana tidak memvalidasi bahwa kueri aman. Kueri dapat mencakup pernyataan SQL apa pun. Misalnya, pernyataan seperti DELETE FROM user;
dan DROP TABLE user;
akan dijalankan. Untuk melindungi dari hal ini, kami sangat menyarankan Anda membuat pengguna MSSQL tertentu dengan izin terbatas.
Kode contoh berikut menunjukkan pembuatan pengguna MSSQL tertentu dengan izin terbatas.
CREATE USER grafanareader WITH PASSWORD 'password' GRANT SELECT ON dbo.YourTable3 TO grafanareader
Pastikan bahwa pengguna tidak mendapatkan izin yang tidak diinginkan dari peran publik.
Masalah yang diketahui
Jika Anda menggunakan versi Microsoft SQL Server yang lebih lama seperti 2008 dan 2008R2, Anda mungkin perlu menonaktifkan enkripsi agar dapat terhubung. Jika memungkinkan, kami sarankan Anda untuk menggunakan paket layanan terbaru yang tersedia untuk kompatibilitas optimal.
Editor kueri
Anda akan menemukan editor kueri MSSQL di tab metrik dalam mode edit grafik, Singlestat, atau panel tabel. Anda masuk ke mode edit dengan memilih judul panel dan kemudian memilih Edit. Editor memungkinkan Anda untuk menentukan query SQL untuk memilih data yang akan divisualisasikan.
-
Pilih Format as
Time series
(untuk digunakan dalam panel Grafik atau Singlestat antara lain) atauTable
(untuk digunakan di panel Tabel antara lain). -
Ini adalah editor aktual tempat Anda menulis kueri SQL Anda.
-
Tampilkan bagian bantuan untuk MSSQL di bawah editor kueri.
-
Tampilkan query SQL yang dijalankan. Akan tersedia terlebih dahulu setelah kueri yang berhasil dijalankan.
-
Tambahkan kueri tambahan di mana editor kueri tambahan akan ditampilkan.
Makro
Untuk menyederhanakan sintaks dan memungkinkan bagian dinamis, seperti filter rentang tanggal, kueri dapat berisi makro.
Contoh makro | Deskripsi |
---|---|
$__time(dateColumn)
|
Akan diganti dengan ekspresi untuk mengganti nama kolom menjadi waktu. Misalnya, DateColumn sebagai waktu. |
$__timeEpoch(dateColumn)
|
Akan diganti dengan ekspresi untuk mengonversi tipe kolom DATETIME ke stempel waktu Unix dan mengganti namanya menjadi waktu. Misalnya, DATEDIFF (kedua, “1970-01-01", DateColumn) sebagai waktu. |
$__timeFilter(dateColumn)
|
Akan diganti dengan filter rentang waktu menggunakan nama kolom yang ditentukan. Misalnya, DateColumn ANTARA “2017-04-21T 05:01:17 Z” DAN “2017-04-21T 05:06:17 Z”. |
$__timeFrom()
|
Akan diganti dengan dimulainya pemilihan waktu yang sedang aktif. Misalnya, “2017-04-21T 05:01:17 Z”. |
$__timeTo()
|
Akan diganti pada akhir pemilihan waktu yang sedang aktif. Misalnya, “2017-04-21T 05:06:17 Z”. |
$__timeGroup(dateColumn,'5m'[, fillvalue])
|
Akan diganti dengan ekspresi yang dapat digunakan dalam klausa GROUP BY. Memberikan fillValue NULL atau nilai mengambang akan secara otomatis mengisi seri kosong dalam rentang waktu dengan nilai itu. Misalnya, CAST (ROUND (DATEDIFF (second, “1970-01-01", time_column) /300.0, 0) sebagai bigint) *300. |
$__timeGroup(dateColumn,'5m', 0)
|
Sama seperti sebelumnya tetapi dengan parameter isian sehingga titik yang hilang dalam seri itu akan ditambahkan oleh grafana dan 0 akan digunakan sebagai nilai. |
$__timeGroup(dateColumn,'5m', NULL)
|
Sama seperti di atas tetapi NULL akan digunakan sebagai nilai untuk poin yang hilang. |
$__timeGroup(dateColumn,'5m', previous)
|
Sama seperti di atas tetapi nilai sebelumnya dalam seri itu akan digunakan sebagai nilai isi jika tidak ada nilai yang terlihat namun NULL akan digunakan (hanya tersedia di Grafana 5.3+). |
Editor kueri memiliki tautan SQL yang dihasilkan yang muncul setelah kueri dijalankan, saat dalam mode edit panel. Pilih dan itu akan memperluas dan menampilkan string SQL interpolasi mentah yang dijalankan.
Kueri tabel
Jika opsi kueri diatur ke, Format sebagai Tabel maka pada dasarnya Anda dapat melakukan semua jenis kueri SQL. Panel tabel akan secara otomatis menampilkan hasil kolom dan baris apa pun yang dikembalikan kueri Anda.
Kode contoh berikut menunjukkan tabel database.
CREATE TABLE [event] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
CREATE TABLE [mssql_types] ( c_bit bit, c_tinyint tinyint, c_smallint smallint, c_int int, c_bigint bigint, c_money money, c_smallmoney smallmoney, c_numeric numeric(10,5), c_real real, c_decimal decimal(10,2), c_float float, c_char char(10), c_varchar varchar(10), c_text text, c_nchar nchar(12), c_nvarchar nvarchar(12), c_ntext ntext, c_datetime datetime, c_datetime2 datetime2, c_smalldatetime smalldatetime, c_date date, c_time time, c_datetimeoffset datetimeoffset ) INSERT INTO [mssql_types] SELECT 1, 5, 20020, 980300, 1420070400, '$20000.15', '£2.15', 12345.12, 1.11, 2.22, 3.33, 'char10', 'varchar10', 'text', N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺', GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), SWITCHOFFSET(CAST(GETDATE() AS DATETIMEOFFSET), '-07:00')
Contoh kode berikut menunjukkan query.
SELECT * FROM [mssql_types]
Anda dapat mengontrol nama kolom panel Tabel dengan menggunakan sintaks pemilihan kolom AS
SQL biasa, seperti yang ditunjukkan dalam kode contoh berikut.
SELECT c_bit as [column1], c_tinyint as [column2] FROM [mssql_types]
Panel tabel yang dihasilkan:
Pertanyaan deret waktu
Jika Anda menyetel Format sebagai deret Waktu, untuk digunakan dalam panel Grafik misalnya, kueri harus memiliki kolom bernama time
yang mengembalikan datetime SQL atau tipe data numerik apa pun yang mewakili epoch Unix dalam hitungan detik. Anda dapat mengembalikan kolom bernama metric
yang digunakan sebagai nama metrik untuk kolom nilai. Setiap kolom kecuali time
dan metric
diperlakukan sebagai kolom nilai. Jika Anda menghilangkan metric
kolom, nama kolom nilai akan menjadi nama metrik. Anda dapat memilih beberapa kolom nilai, masing-masing akan memiliki namanya sebagai metrik. Jika Anda mengembalikan beberapa kolom nilai dan kolom bernama metric
maka kolom ini digunakan sebagai awalan untuk nama seri.
Kumpulan hasil kueri deret waktu harus diurutkan berdasarkan waktu.
Kode contoh berikut menunjukkan tabel database.
CREATE TABLE [event] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
CREATE TABLE metric_values ( time datetime, measurement nvarchar(100), valueOne int, valueTwo int, ) INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 12:30:00', 'Metric A', 62, 6) INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 12:30:00', 'Metric B', 49, 11) ... INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 13:55:00', 'Metric A', 14, 25) INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 13:55:00', 'Metric B', 48, 10)
Kode contoh berikut menunjukkan satu value
dan satu metric
kolom.
SELECT time, valueOne, measurement as metric FROM metric_values WHERE $__timeFilter(time) ORDER BY 1
Ketika query sebelumnya digunakan dalam panel grafik, itu akan menghasilkan dua seri bernama Metric A
dan Metric B
dengan nilai-nilai valueOne
dan valueTwo
diplot di atas. time
Kode contoh berikut menunjukkan beberapa value
kolom.
SELECT time, valueOne, valueTwo FROM metric_values WHERE $__timeFilter(time) ORDER BY 1
Ketika query sebelumnya digunakan dalam panel grafik, itu akan menghasilkan dua seri bernama Metric A
dan Metric B
dengan nilai-nilai valueOne
dan valueTwo
diplot di atas. time
Kode contoh berikut menunjukkan menggunakan makro $__TimeGroup.
SELECT $__timeGroup(time, '3m') as time, measurement as metric, avg(valueOne) FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '3m'), measurement ORDER BY 1
Ketika query sebelumnya digunakan dalam panel grafik, itu akan menghasilkan dua seri bernama Metric A
dan Metric B
dengan nilai-nilai valueOne
dan valueTwo
diplot di atas. time
Setiap dua seri yang tidak memiliki nilai dalam jendela tiga menit akan membuat garis di antara dua garis tersebut. Anda akan melihat bahwa grafik di sebelah kanan tidak pernah turun ke nol.
Kode contoh berikut menunjukkan menggunakan makro $__TimeGroup dengan parameter fill diatur ke nol.
SELECT $__timeGroup(time, '3m', 0) as time, measurement as metric, sum(valueTwo) FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '3m'), measurement ORDER BY 1
Ketika kueri ini digunakan dalam panel grafik, hasilnya adalah dua seri bernama Metric A
dan Metric B
dengan jumlah valueTwo
diplot di atas. time
Setiap seri yang tidak memiliki nilai dalam jendela 3 menit akan memiliki nilai nol yang akan Anda lihat dirender dalam grafik di sebelah kanan.
Templating
Alih-alih hardcoding hal-hal seperti server, aplikasi dan nama sensor dalam kueri metrik Anda, Anda dapat menggunakan variabel di tempatnya. Variabel ditampilkan sebagai kotak pilih dropdown di bagian atas dasbor. Anda dapat menggunakan kotak dropdown ini untuk mengubah data yang ditampilkan di dasbor Anda.
Untuk informasi selengkapnya tentang variabel template dan template, lihatTemplate dan variabel.
Variabel kueri
Jika Anda menambahkan variabel templat dari jenisnyaQuery
, Anda dapat menulis kueri MSSQL yang dapat mengembalikan hal-hal seperti nama pengukuran, nama kunci, atau nilai kunci yang ditampilkan sebagai kotak pilih tarik-turun.
Misalnya, Anda dapat memiliki variabel yang berisi semua nilai untuk hostname
kolom dalam tabel jika Anda menentukan kueri seperti ini dalam pengaturan kueri variabel template.
SELECT hostname FROM host
Kueri dapat mengembalikan beberapa kolom dan Grafana akan secara otomatis membuat daftar dari mereka. Misalnya, query berikut akan mengembalikan daftar dengan nilai-nilai dari hostname
danhostname2
.
SELECT [host].[hostname], [other_host].[hostname2] FROM host JOIN other_host ON [host].[city] = [other_host].[city]
Pilihan lain adalah kueri yang dapat membuat variabel kunci/nilai. Query harus mengembalikan dua kolom yang diberi nama __text
dan__value
. Nilai __text
kolom harus unik (jika tidak unik maka nilai pertama digunakan). Opsi dalam daftar dropdown akan memiliki teks dan nilai yang memungkinkan Anda memiliki nama ramah sebagai teks dan id sebagai nilainya. Contoh query dengan hostname
sebagai teks dan id
sebagai nilai:
SELECT hostname __text, id __value FROM host
Anda juga dapat membuat variabel bersarang. Misalnya, jika Anda memiliki variabel lain bernamaregion
. Kemudian Anda dapat meminta variabel host hanya menampilkan host dari wilayah yang dipilih saat ini dengan kueri seperti ini (jika region
adalah variabel multi-nilai, maka gunakan operator IN
perbandingan daripada =
untuk mencocokkan dengan beberapa nilai).
SELECT hostname FROM host WHERE region IN ($region)
Menggunakan variabel dalam kueri
catatan
Nilai variabel template hanya dikutip ketika variabel template adalahmulti-value
.
Jika variabel adalah variabel multi-nilai maka gunakan operator IN
perbandingan daripada =
untuk mencocokkan dengan beberapa nilai.
Ada dua sintaks:
$<varname>
Contoh dengan variabel template bernamahostname
:
SELECT atimestamp time, aint value FROM table WHERE $__timeFilter(atimestamp) and hostname in($hostname) ORDER BY atimestamp
[[varname]]
Contoh dengan variabel template bernamahostname
:
SELECT atimestamp as time, aint as value FROM table WHERE $__timeFilter(atimestamp) and hostname in([[hostname]]) ORDER BY atimestamp
Mematikan kutipan untuk variabel multi-nilai
Grafana secara otomatis membuat string yang dikutip dan dipisahkan koma untuk variabel multi-nilai. Misalnya, jika server01
dan server02
dipilih maka akan diformat sebagai:'server01', 'server02'
. Untuk menonaktifkan kutipan, gunakan opsi pemformatan csv untuk variabel.
${servers:csv}
Untuk informasi selengkapnya tentang opsi pemformatan variabel, lihatTemplate dan variabel.
Anotasi
Anda dapat menggunakan anotasi untuk melapisi informasi acara yang kaya di atas grafik. Anda menambahkan kueri anotasi melalui menu Dasbor/tampilan Anotasi. Untuk informasi selengkapnya, lihat Anotasi.
Kolom:
Nama | Penjelasan |
---|---|
time
|
Nama bidang tanggal/waktu. Bisa berupa kolom dengan tipe data tanggal/waktu SQL asli atau nilai epoch. |
timeend
|
Nama opsional bidang tanggal/waktu akhir. Bisa berupa kolom dengan tipe data tanggal/waktu SQL asli atau nilai epoch. |
text
|
Bidang deskripsi acara. |
tags
|
Nama bidang opsional untuk digunakan untuk tag peristiwa sebagai string dipisahkan koma. |
Kode contoh berikut menunjukkan tabel database.
CREATE TABLE [events] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
Kami juga menggunakan tabel database yang didefinisikan dalamPertanyaan deret waktu.
Contoh kode berikut menunjukkan query menggunakan kolom waktu dengan nilai-nilai epoch.
SELECT time_sec as time, description as [text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1
Kode contoh berikut menunjukkan kueri wilayah menggunakan kolom waktu dan waktu akhir dengan nilai epoch.
SELECT time_sec as time, time_end_sec as timeend, description as [text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1
Kode contoh berikut menunjukkan query menggunakan kolom waktu tipe data tanggal/waktu SQL asli.
SELECT time, measurement as text, convert(varchar, valueOne) + ',' + convert(varchar, valueTwo) as tags FROM metric_values WHERE $__timeFilter(time_column) ORDER BY 1
Dukungan prosedur tersimpan
Prosedur yang disimpan telah diverifikasi untuk bekerja. Namun, mungkin ada kasus tepi di mana itu tidak akan berfungsi seperti yang Anda harapkan. Prosedur tersimpan harus didukung dalam tabel, deret waktu, dan kueri anotasi selama Anda menggunakan penamaan kolom yang sama dan mengembalikan data dalam format yang sama seperti yang dijelaskan sebelumnya di bagian masing-masing.
Fungsi makro tidak akan berfungsi di dalam prosedur yang disimpan.
Contoh
Untuk contoh berikut, tabel database didefinisikan dalam Query deret Time. Katakanlah Anda ingin memvisualisasikan empat seri dalam panel grafik, seperti semua kombinasi kolomvalueOne
, valueTwo
danmeasurement
. Panel grafik di sebelah kanan memvisualisasikan apa yang ingin kita capai. Untuk mengatasi ini, Anda harus menggunakan dua kueri:
Kode contoh berikut menunjukkan query pertama.
SELECT $__timeGroup(time, '5m') as time, measurement + ' - value one' as metric, avg(valueOne) as valueOne FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '5m'), measurement ORDER BY 1
Kode contoh berikut menunjukkan query kedua.
SELECT $__timeGroup(time, '5m') as time, measurement + ' - value two' as metric, avg(valueTwo) as valueTwo FROM metric_values GROUP BY $__timeGroup(time, '5m'), measurement ORDER BY 1
Prosedur tersimpan menggunakan waktu dalam format epoch
Anda dapat menentukan prosedur tersimpan yang akan mengembalikan semua data yang Anda butuhkan untuk membuat empat seri dalam panel grafik seperti di atas. Dalam hal ini, prosedur yang disimpan menerima dua parameter, @from
dan@to
, dari tipe int
data, yang harus berupa rentang waktu (dari-ke) dalam format epoch yang akan digunakan untuk menyaring data untuk kembali dari prosedur yang disimpan.
Ini meniru ekspresi $__timeGroup(time, '5m')
dalam pilih dan kelompokkan, dan itulah sebabnya banyak ekspresi panjang diperlukan. Ini dapat diekstraksi ke fungsi MSSQL, jika diinginkan.
CREATE PROCEDURE sp_test_epoch( @from int, @to int ) AS BEGIN SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time, measurement + ' - value one' as metric, avg(valueOne) as value FROM metric_values WHERE time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01') GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int), measurement UNION ALL SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time, measurement + ' - value two' as metric, avg(valueTwo) as value FROM metric_values WHERE time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01') GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int), measurement ORDER BY 1 END
Kemudian Anda dapat menggunakan kueri berikut untuk panel grafik Anda.
DECLARE @from int = $__unixEpochFrom(), @to int = $__unixEpochTo() EXEC dbo.sp_test_epoch @from, @to
Prosedur tersimpan menggunakan waktu dalam format datetime
Anda dapat menentukan prosedur tersimpan yang akan mengembalikan semua data yang Anda butuhkan untuk membuat empat seri dalam panel grafik seperti di atas. Dalam hal ini, prosedur yang disimpan menerima dua parameter, @from
dan@to
, dari tipe datetime
data, yang harus berupa rentang waktu (dari-ke) yang akan digunakan untuk memfilter data untuk kembali dari prosedur yang disimpan.
Ini meniru ekspresi $__timeGroup(time, '5m')
dalam pilih dan kelompokkan, dan itulah sebabnya banyak ekspresi panjang diperlukan. Ini dapat diekstraksi ke fungsi MSSQL, jika diinginkan.
CREATE PROCEDURE sp_test_datetime( @from datetime, @to datetime ) AS BEGIN SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time, measurement + ' - value one' as metric, avg(valueOne) as value FROM metric_values WHERE time >= @from AND time <= @to GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int), measurement UNION ALL SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time, measurement + ' - value two' as metric, avg(valueTwo) as value FROM metric_values WHERE time >= @from AND time <= @to GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int), measurement ORDER BY 1 END
Kemudian Anda dapat menggunakan kueri berikut untuk panel grafik Anda.
DECLARE @from datetime = $__timeFrom(), @to datetime = $__timeTo() EXEC dbo.sp_test_datetime @from, @to
Peringatan
Kueri deret waktu harus berfungsi dalam kondisi peringatan. Kueri yang diformat tabel belum didukung dalam kondisi aturan peringatan.