Hen*_*nno 3 sql-server triggers
我必须将MSSQL中完成的更改与远程MySQL数据库同步.要同步的更改是将发票和用户添加到系统.远程服务器不应该总是可以访问,所以我试图设置一种日志表来存储在MSSQL中完成的更改.
这是一个完全有效的触发器:
CREATE TRIGGER [dbo].[dokument_insert]
ON [dbo].[dokument]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [bcg_ekodu].[dbo].[sync_stack] (event,sql, table_name, import_priority)
SELECT
'INSERT',
'INSERT INTO bills SET
date = "'+CONVERT(VARCHAR(19),dok_kuup,120)+'",
total = "'+CAST(kokkusum AS nvarchar)+'",
number = "'+RTRIM(dok_nr)+'",
created = "'+CONVERT(VARCHAR(19),savetime,120)+'",
rounded = "'+CAST(ymardus AS nvarchar)+'",
currency = "'+CAST(valuuta AS nvarchar)+'",
due_date = "'+CONVERT(VARCHAR(19),tasupaev,120)+'",
pk_joosep = "'+CAST(dok_kood AS nvarchar)+'",
joosep_hankija = "'+CAST(hankija AS nvarchar)+'";
UPDATE
bills, users, companies
SET
bills.user_id = users.id,
bills.imported = NOW()
WHERE
bills.imported IS NULL
AND companies.id = users.company_id
AND companies.pk_joosep = 10
AND bills.user_id = users.pk_joosep',
'bills',
'200'
FROM inserted
END
Run Code Online (Sandbox Code Playgroud)
每次将一行插入'dokument'表时,它会在'sync_stack'表中插入一行.'sql'列将包含一个SQL,用于在另一个(MySQL)数据库中创建相同类型的行.
但是这个触发器不起作用:
CREATE TRIGGER [dbo].[klient_insert]
ON [dbo].[klient]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [bcg_ekodu].[dbo].[sync_stack] (event,sql, table_name, import_priority)
SELECT
'INSERT',
'INSERT INTO users SET
username =10'+CAST(kl_kood as nvarchar)+',
password = NULL,
name ="'+LTRIM(RTRIM(kl_nimi))+'",
email ="'+CAST(LTRIM(RTRIM(kl_email)) as nvarchar)+'",
reference_no ="'+CAST(LTRIM(RTRIM(kl_viide)) as nvarchar)+'",
phone ="'+CAST(LTRIM(RTRIM(kl_tel1)) as nvarchar)+'",
logins ="'+CAST(0 as nvarchar)+'",
last_login = NULL,
created ="'+CONVERT(VARCHAR(19),savetime,120)+'",
updated = NULL,
deleted ="0",
address ="'+CAST(LTRIM(RTRIM(kl_aadr1)) as nvarchar)+'",
pk_joosep ="'+CAST(kl_kood as nvarchar)+'"',
'users',
'210'
FROM inserted
END
Run Code Online (Sandbox Code Playgroud)
虽然上面的SQL创建触发器执行完成就好了,当我尝试了一些行插入到"触发"表中,我得到以下错误:
No row was updated.
The data in row 175 was not committed.
Error Source: .Net SqlClient Data Provider.
Error Message: Cannot insert the value NULL into column 'sql', table 'mydb.dbo.sync_stack'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Correct the errors and retry or press ESC to cancel the change(s).
Run Code Online (Sandbox Code Playgroud)
如何让第二个触发器按预期工作?
我怀疑你插入的至少一个插入到SQL语句中的值是NULL.你可以通过使用COALESCE,例如,
username =10'+COALESCE(CAST(kl_kood as nvarchar), '')+',
Run Code Online (Sandbox Code Playgroud)
当然,如果不nvarchar指定长度,你不应该声明,对吗?
| 归档时间: |
|
| 查看次数: |
2498 次 |
| 最近记录: |