It turned out Not to be so straight forward, executing a SQL Server stored-procedure from Entity Framework to insert data into Postgres (yes, I know, I said that in the meeting).
(A stored-procedure with an ordinary INSERT executed perfectly from within SSMS, using a linked server with an ODBC driver.)
After a fruitless day tweeking RPC and Distributed Transactions, my pragmatic (dreary) solution was to manually create a Postgres table, then a Postgres function to do the insert, then a stored-procedure to pass parameters to that function.
Here’s the code …
-- in postgres
-- DROP TABLE public.errorlogs;
CREATE TABLE public."ErrorLogs"
(
"id" serial primary key,
"edesc" char(500),
"etype" int,
"appid" int
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.ErrorLogs
OWNER to postgres;
Then to create the insert function …
--in postgres
CREATE OR REPLACE FUNCTION pg_insert_new_error(edesc varchar(500), etype int, appid int) RETURNS VOID AS
$$
BEGIN
INSERT INTO "ErrorLogs" (edesc, etype, appid) VALUES (edesc, etype, appid);
END
$$
LANGUAGE 'plpgsql';
And finally the stored-proc …
-- in sql server
alter procedure [PostgreSQL].[SPU_InsertNewErrorLog]
@description varchar(500),
@messagetype int,
@appid int
as
BEGIN
DECLARE @cmd VARCHAR(500) = 'SELECT a.* FROM OPENQUERY(pgserver,''select pg_insert_new_error(''''' + @description + ''''', '
+ CONVERT(VARCHAR(5), @messagetype) + ', ' + CONVERT(VARCHAR(5), @appid) + ')'') a'
EXEC (@cmd)
END
GO
(Notice, I had to encapsulate the whole query and its parameters to work with OPENQUERY).