Звуки wonky. Использовал бы HTTPS и возможно пакет шифрования для обработки ключа.
я думаю, что CommonCrypto доступен для iPhone.
РЕДАКТИРОВАНИЕ: Все еще звуки wonky. Почему кто-либо передал бы секретный ключ в HTTP-заголовке? Любой, кто прослеживает Ваш сетевой трафик (через регистрирующийся маршрутизатор Wi-Fi, например) видел бы его.
существуют устойчивые методы защиты для шифрования трафика сообщений..., почему бы не использовать их, а не изобретают то, что в основном тривиально дефектная система?
РЕДАКТИРОВАНИЕ II: А-ч, я вижу. Я шел бы вперед и использовал бы Связку ключей... Я думаю, что это предназначается для просто этих видов случаев. Я пропустил это, Вы генерировали запрос с помощью ключа. Все еще использовал бы HTTPS, если я мог, хотя, начиная с того способа, которым Вы не рискуете людьми, выводящими Вашу keygeneration схему через контроль достаточного количества подписей.
Разве вам не нужно очищать временную таблицу #t
после каждой итерации? т.е. добавить TRUNCATE TABLE #t
в конце вашей процедуры? Я думаю, что временная таблица #t
существует до завершения сеанса, а не до завершения хранимой процедуры. SELECT INTO
просто добавляет к существующему #t
, но не заменяет его.
Другое дело - использовать постоянную таблицу, а не то, что хранится в tempdb #tables
.
Вы можете попробовать запускать вставку партиями, а не сразу весь набор данных.
Проблема заключается в использовании связанного сервера через поставщика SQL Anywhere 11.0.1 SAOLEDB.11 для вставки данных в целевой столбец, объявленный как больший, чем VARCHAR (8000). Вот упрощенный воспроизводимый пример:
-- Overview: SQL Server 2008 suffers from a fatal memory leak
-- if an attempt is made to use a linked server and the
-- SAOLEDB.11 provicer to copy data from SQL Server
-- to a SQL Anywhere 11.0.1 table that contains a single column
-- larger than VARCHAR ( 8000 ); i.e, a VARCHAR ( 8000 ) target
-- column is OK but VARCHAR ( 8001 ) is not. The actual string
-- length is not an issue, nor is the fact that the SQL Server
-- column is declared as TEXT. The memory leak is faster if
-- there is more than one target column larger than VARCHAR ( 8000 ).
-- The server computer freezes and must be rebooted.
-- Msg 701, Level 17, State 123, Server BRECK-PC\SQLEXPRESS, Line 2
-- There is insufficient system memory in resource pool 'internal' to run this
-- query.
-- Location: qxcntxt.cpp:1052
-- Expression: cref == 0
-- SPID: 52
-- Process ID: 2044
---------------------------------------------------------
-- SQL ANYWHERE 11 on target computer
---------------------------------------------------------
-- Target:
-- HP Pavilion laptop, 4GHz Pentium 4, 2G RAM
-- Windows XP SP2
-- SQL Anywhere 11.0.1.2276
---------------------------------------------------------
-- Windows commands used to create and start in-memory database
/*
"%SQLANY11%\bin32\dbinit.exe"^
mem.db
"%SQLANY11%\bin32\dbspawn.exe" -f^
"%SQLANY11%\bin32\dbsrv11.exe"^
-im nw^
-o dbsrv11_log.txt^
mem.db
"%SQLANY11%\bin32\dbisql.com"^
-c "ENG=mem;DBN=mem;UID=dba;PWD=sql;CON=mem-1"
*/
---------------------------------------------------------
-- Create target table with one single "long" column.
BEGIN
DROP TABLE sa_target;
EXCEPTION WHEN OTHERS THEN
END;
CREATE TABLE sa_target (
primary_key INTEGER NOT NULL PRIMARY KEY,
string_column_1 VARCHAR ( 8001 ) NOT NULL );
---------------------------------------------------------
--- SQL SERVER 2008 on source (server) computer
---------------------------------------------------------
-- Server:
-- Desktop with Intel Core 2 Quad Q9450 2.66Ghz 4G RAM
-- Windows Vista Ultimate 64 bit build 6001 SP1
-- SQL Server 2008 Express 64 Service Pack 1 with cumulative update package 4:
-- Microsoft SQL Server 2008 (SP1) - 10.0.2734.0 (X64) Sep 11 2009 14:30:58
-- Copyright (c) 1988-2008 Microsoft Corporation Express Edition with
-- Advanced Services (64-bit) on Windows NT 6.0 <X64>
-- (Build 6001: Service Pack 1)
-- SAOLEDB.11 driver from SQL Anywhere 11.0.1.2276
---------------------------------------------------------
-- Windows command used to start osql.exe
/*
"c:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe"^
-d main^
-I^
-l 10^
-P j68Fje9#fyu489^
-S BRECK-PC\SQLEXPRESS^
-U sa
*/
---------------------------------------------------------
-- Create database.
USE master
GO
BEGIN TRY
DROP DATABASE main;
END TRY
BEGIN CATCH
END CATCH;
GO
CREATE DATABASE main
ON PRIMARY
( NAME = main_dat,
FILENAME = 'E:\data\main\main.mdf',
SIZE = 2GB,
FILEGROWTH = 200MB )
LOG ON
( NAME = 'main_log',
FILENAME = 'E:\data\main\main.ldf',
SIZE = 2GB,
FILEGROWTH = 200MB )
GO
----------------------------------------------------------------------------
-- Configure SAOLEDB.11 provider.
USE master
go
-- SAOLEDB.11 provider dlls registered via these Windows commands:
-- regsvr32 dboledb11.dll
-- regsvr32 dboledba11.dll
EXEC master.dbo.sp_MSset_oledb_prop N'SAOLEDB.11', N'AllowInProcess', 1
GO
-- If the following statement produces this message, it probably means
-- that 'DisallowAdHocAccess' is already set to zero for SAOLEDB.11:
--
-- RegDeleteValue() returned error 2, 'The system cannot find the file specified.'
EXEC master.dbo.sp_MSset_oledb_prop N'SAOLEDB.11', N'DisallowAdHocAccess', 0
GO
----------------------------------------------------------------------------
-- THIS SECTION WAS NOT RUN.
-- Set up for OPENROWSET usage.
-- NOT REQUIRED for required for Linked Server usage.
USE master
GO
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
----------------------------------------------------------------------------
-- Set up Linked Server usage.
USE main
GO
BEGIN TRY
EXEC sp_droplinkedsrvlogin
@rmtsrvname = 'mem',
@locallogin = NULL
END TRY
BEGIN CATCH
END CATCH
GO
BEGIN TRY
EXEC sp_dropserver
@server = 'mem'
END TRY
BEGIN CATCH
END CATCH
GO
EXEC sp_addlinkedserver
@server = 'mem',
@srvproduct = 'SQL Anywhere OLE DB Provider',
@provider = 'SAOLEDB.11',
@datasrc = 'mem_PAVILION2'
GO
EXEC master.dbo.sp_serveroption
@server=N'mem',
@optname=N'rpc',
@optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption
@server=N'mem',
@optname=N'rpc out',
@optvalue=N'true'
GO
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'mem',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'dba',
@rmtpassword = 'sql'
GO
----------------------------------------------------------------------------
-- Create and fill source table with 1 million rows.
USE main
GO
BEGIN TRY
DROP TABLE mss_source;
END TRY
BEGIN CATCH
END CATCH
GO
CREATE TABLE mss_source (
primary_key INTEGER NOT NULL PRIMARY KEY,
string_column_1 TEXT NOT NULL )
GO
BEGIN
DECLARE @primary_key INTEGER
SELECT @primary_key = 1
BEGIN TRANSACTION
WHILE @primary_key <= 1000000
BEGIN
INSERT mss_source VALUES (
@primary_key,
REPLICATE ( 'Some test data. ', 2 ) )
SELECT @primary_key = @primary_key + 1
END
COMMIT
END
GO
SELECT COUNT(*) FROM mss_source
GO
-- 1000000
---------------------------------------------------------
-- Copy data to target table.
SELECT CURRENT_TIMESTAMP
GO
INSERT INTO mem..dba.sa_target
SELECT *
FROM mss_source
GO
SELECT CURRENT_TIMESTAMP
GO
---------------------------------------------------------
-- Test 1 - Code as shown above.
-- FAILED
--
-- Started at 2009-10-12 10:06:33.393
--
-- A slow server memory leak began immediately.
-- The initial target insert rate was about 2000 rows per second.
-- Server RAM usage reached 3.82 GB, Physical Memory: 95%, Page File 16236M / 16288M
-- The server display became frozen.
-- The server became unresponsive to mouse input.
-- The target insert rate dropped below 1000 rows per second, but inserts continued.
-- The copy process reached 937,817 rows inserted on the target.
-- This dialog box appeared on the server: "Your computer is low on memory"
-- Eventually, the process failed, and this message appeared in the osql.exe window:
--
-- Msg 701, Level 17, State 123, Server BRECK-PC\SQLEXPRESS, Line 2
-- There is insufficient system memory in resource pool 'internal' to run this
-- query.
-- Location: qxcntxt.cpp:1052
-- Expression: cref == 0
-- SPID: 52
-- Process ID: 2044
--
-- Failed at 2009-10-12 10:22:21.817
-- The server disk I/O light remained lit without interruption.
-- The server required a hard reboot.
---------------------------------------------------------
-- Test 2 - Code as shown above, except for VARCHAR ( 8000 ).
-- SUCCESSFUL
BEGIN
DROP TABLE sa_target;
EXCEPTION WHEN OTHERS THEN
END;
CREATE TABLE sa_target (
primary_key INTEGER NOT NULL PRIMARY KEY,
string_column_1 VARCHAR ( 8000 ) NOT NULL );
-- Started at 2009-10-12 10:41:46.427
-- There was some slight initial growth in RAM usage on the server.
-- Server RAM usage stabilized at 1.40 GB, Physical Memory: 35%, Page File 1560M / 8352M
-- The target insert rate remained about 2000 rows per second throughout.
-- Finished OK at 2009-10-12 10:50:52.240
---------------------------------------------------------
-- Test 3 - Repeat Test 2
-- SUCCESSFUL
-- Started at 2009-10-12 10:53:38.350
-- No further RAM usage growth on the server.
-- Finished OK at 2009-10-12 11:02:10.457
Instead of using Temp Tables, can you try using Variable tables?
eg.
DECLARE @ResultTable TABLE (TableId INT PRIMARY KEY, ... etc)
INSERT INTO @ResultTable
SELECT TableId, ....
FROM mss_t2
... etc. ...