需要帮助寻找适用于 firebird 2.0 数据库的免费工具吗?
有人知道这个工具的可用性和链接吗?
我在 Windows 平台上有一个数据库,并且在那里写了一些存储过程
需要帮助寻找适用于 firebird 2.0 数据库的免费工具吗?
有人知道这个工具的可用性和链接吗?
我在 Windows 平台上有一个数据库,并且在那里写了一些存储过程
我尝试使用这种方式在远程服务器中创建存储过程
EXECUTE (N'USE [master]; EXEC sp_executesql N'+ @sqlCommand) AT [LinkedServer]
但是我收到了这个错误
消息 111,级别 15,状态 1,过程 StoredProcedure,第 5 行 [批处理开始第 0 行]“CREATE/ALTER PROCEDURE”必须是查询批处理中的第一个语句。
在 sqlCommand 中有类似这样的查询
SET @sqlCommand = '
CREATE OR ALTER PROCEDURE [dbo].[storedName]
@nameDB varchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQLProcessesRep varchar(max);
--Actions in Stored
END'
每当在架构“A”中创建新表时,我都需要在架构“B”中复制该表。这应该会自动发生。我搜索过触发器概念,但它不适用于“CREATE”或“ALTER”语句等 DDL 语句。如何在没有触发器的情况下实现这一点?请帮帮我。
我有一个包含多个架构的数据库,这些架构具有相同的表和视图,并且我想创建一个过程,从架构中的视图之一创建视图。
CREATE OR REPLACE FUNCTION create_summary_view(
created_view character varying,
common_view character varying,
schema_1 character varying,
schema_2 character varying,
schema_3 character varying,
...
schema_x character varying,
)
create_view
是要创建的视图,common_view
是在所有模式中相同的视图,是其s 被加入到 中的schema_x
模式列表。common_view
created_view
pl/pgsql 是否有用于指示可变数量参数的语法?created_view
,common_view
并且至少one schema_x
是必需的?
我正在考虑传递一个逗号或空格分隔的模式字符串并使用regexp_split_to_array
它来分解它,但最好知道可变长度参数是可能的。
我有一个有效的存储过程:
USE [DB_NAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[INSERT_XML]
-- Add the parameters for the stored procedure here
@XML XML
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @Order AS INT
SELECT @Order = MAX([order_id])+1
FROM [DB_NAME].[dbo].[TABLE_NAME]
INSERT INTO [DB_NAME].[dbo].[TABLE_NAME] ([Status]
,[error_message]
,[start_date_time]
,[end_date_time]
,[SystemId]
,[bundle_name]
,[doc_xml]
,[order_id]
,[batch_load_date])
VALUES (0,'',GETDATE(),GETDATE(),'tmpltst','TEST',@XML,@Order,GETDATE());
END
我已经测试过使用其他应用程序提供的 XML(在将所有单引号加倍之后)来填充 @XML 参数,它会产生预期的结果,将提供的 XML 添加到表中新行的单个单元格中。
XML 的源是另一个应用程序提供的文件。我需要定期使用所提供文件的 XML 内容执行存储过程。我一直在编写一个 PowerShell 脚本来执行此操作。
$server = "server.address.com"
$database = "DB_NAME"
$XMLFile = Get-ChildItem C:\local\*.xml | select -First 1
[string]$XMLString = (Get-Content $XMLFile.FullName).replace('`n','').replace('`r','').replace("'","\'")
Invoke-Sqlcmd -ServerInstance $server -Database $database -Query "[dbo].[INSERT_XML] @XML = '$($XMLString)'" -credential $PSCred -TrustServerCertificate
这会导致错误:
Invoke-Sqlcmd : Incorrect syntax near 's'.
Msg 102, Level 15, State 1, Procedure , Line 1.
At line:1 char:1
+ Invoke-Sqlcmd -ServerInstance $server -Database $database -Query "[db ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
我尝试了多种不同的方法来格式化该 -Query 并转义 $XMLString。我预计这是一个未正确转义 $XMLString 内容的问题,该内容将包含斜杠、单引号、双引号、换行符等。我将在 Get-Content 中删除换行符并用 ' 替换单引号,但我认为单引号仍然会抛出 PowerShell 命令?
任何帮助使其正常工作的帮助都将不胜感激。谢谢!
编辑:好的,我确认该变量是我的问题。我从字符串中删除了所有单引号,并且它按预期进行了处理。所以剩下的问题是:如何在不删除所有单引号的情况下让它运行。此时,这可能更像是 PowerShell 问题,而不是数据库问题。
Edit2:感谢下面 Peter 的推荐,我最终使用了 Invoke-SqlCmd2 并修改了我的 PowerShell 使用它。
$server = "server.address.com"
$database = "DB_NAME"
$XMLFile = Get-ChildItem C:\local\*.xml | select -First 1
[string]$XMLString = Get-Content $XMLFile.FullName
Invoke-SqlCmd2 `
-ServerInstance $server `
-Database $database `
-Query "[dbo].[INSERT_XML] @XML;" `
-SqlParameters @{XML=$XMLString} `
-Credential $Credential
我正在努力寻找一种更快的方法来更新我目前正在使用的数据。更准确地说,我有每个合同的开始和结束日期的工人合同数据。但是,合同的时间跨度可能会重叠,这意味着即使之前的合同仍然有效,工人也可以开始另一个工作合同。因此,我想隔离那些与以前的合同完全重叠的合同。为了做到这一点,我制作了一个存储过程,将每个合同的结尾与前一个合同的结尾进行比较。如果当前合同的结束发生在前一个合同的结束之前,我标记这个合同,它将在程序的下一个循环中省略,直到结束。然而,由于我的数据库是由超过 1000 万个观测值组成的,我制作的存储过程(写在下面)太长了。因此,如果可能的话,我想创建一个查询,但我正在努力寻找合适的解决方案。任何建议将不胜感激。
在下面的命令中有我的数据库示例的复制和我当前使用的过程。
-- Table replication
drop table if exists my_table;
create table my_table (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
worker_id int,
dt_start date,
dt_end date,
PRIMARY KEY (id)
);
insert into
my_table(id, worker_id, dt_start, dt_end)
values
('12', '20', '2014-05-02', '2014-07-08'),
('13', '20', '2017-01-14', '2017-01-31'),
('14', '20', '2017-04-18', '2018-01-01'),
('15', '20', '2017-11-06', '2017-11-06'),
('16', '20', '2017-11-06', '2017-12-07'),
('17', '20', '2019-12-02', '2020-05-31'),
('18', '20', '2020-06-01', '2020-07-31'),
('25', '29', '2014-11-24', '2017-02-11'),
('26', '42', '2016-01-22', '2016-05-05'),
('40', '71', '2016-12-01', '2017-05-31'),
('41', '71', '2017-06-01', '2020-12-21'),
('42', '71', '2020-07-17', '2020-08-02'),
('53', '380', '2017-02-15', '2017-07-31'),
('54', '380', '2017-09-04', '2017-12-23'),
('55', '380', '2017-12-27', '2018-12-22'),
('56', '380', '2019-05-15', '2019-09-15'),
('57', '380', '2020-03-23', '2099-01-01'),
('58', '380', '2020-09-28', '2022-09-30'),
('63', '391', '2013-07-23', '2013-11-30'),
('64', '391', '2014-06-16', '2014-12-16'),
('65', '391', '2014-11-21', '2015-01-20'),
('66', '391', '2015-04-01', '2015-04-15'),
('67', '391', '2015-06-10', '2015-06-22')
;
alter table my_table add index (id);
alter table my_table add index (worker_id);
-- Note: when the end date is '2099-01-01', it means the contract is an open-ended one and still ongoing
-- With this flag I will identify contracts completely overlapped, hence to discard
alter table my_table add column flag_del INT default 0;
-- Identify maximum number of contracts per person, I will use the maximum value for the loop
drop table if exists max_att;
create table max_att
as select worker_id, count(*) n
from my_table
group by worker_id;
-- Procedure to identify recursively contracts whose time-span is completely covedere by previous contracts
-- Those specific contracts will be idenfitied in the 'fla_del' column (= 1)
DROP PROCEDURE IF EXISTS doiterate;
delimiter //
CREATE PROCEDURE doiterate()
BEGIN
DECLARE total INT unsigned DEFAULT 0;
WHILE total <= (select MAX(n) from max_att) DO
with new_table as (
select
*,
lag(dt_end, 1) over (partition by worker_id order by id) dt_end_lag
from my_table
where flag_del = 0)
update my_table a
left outer join new_table b on a.id = b.id
set a.flag_del = 1 where b.dt_end_lag >= b.dt_end;
SET total = total + 1;
END WHILE;
END//
delimiter ;
CALL doiterate();
select * from my_table;
那些(最后)标记为 1 的条目将被删除,因为与之前的合同完全重叠。
期望的输出。
我有一个 sp 可以从孙子表中删除数据。
但我需要更改光标并使用临时表或 while 循环而不是光标。我试过但没有工作,有人可以帮忙。
Sp在下面添加
CREATE Procedure spDeleteRows
/*
Recursive row delete procedure.
It deletes all rows in the table specified that conform to the criteria selected,
while also deleting any child/grandchild records and so on. This is designed to do the
same sort of thing as Access's cascade delete function. It first reads the sysforeignkeys
table to find any child tables, then deletes the soon-to-be orphan records from them using
recursive calls to this procedure. Once all child records are gone, the rows are deleted
from the selected table. It is designed at this time to be run at the command line. It could
also be used in code, but the printed output will not be available.
*/
(
@cTableName varchar(50), / name of the table where rows are to be deleted /
@cCriteria nvarchar(1000), / criteria used to delete the rows required /
@iRowsAffected int OUTPUT / number of records affected by the delete /
)
As
set nocount on
declare @cTab varchar(255), / name of the child table /
@cCol varchar(255), / name of the linking field on the child table /
@cRefTab varchar(255), / name of the parent table /
@cRefCol varchar(255), / name of the linking field in the parent table /
@cFKName varchar(255), / name of the foreign key /
@cSQL nvarchar(1000), / query string passed to the sp_ExecuteSQL procedure /
@cChildCriteria nvarchar(1000), /* criteria to be used to delete
records from the child table */
@iChildRows int / number of rows deleted from the child table /
/ declare the cursor containing the foreign key constraint information /
DECLARE cFKey CURSOR LOCAL FOR
SELECT SO1.name AS Tab,
SC1.name AS Col,
SO2.name AS RefTab,
SC2.name AS RefCol,
FO.name AS FKName
FROM dbo.sysforeignkeys FK
INNER JOIN dbo.syscolumns SC1 ON FK.fkeyid = SC1.id
AND FK.fkey = SC1.colid
INNER JOIN dbo.syscolumns SC2 ON FK.rkeyid = SC2.id
AND FK.rkey = SC2.colid
INNER JOIN dbo.sysobjects SO1 ON FK.fkeyid = SO1.id
INNER JOIN dbo.sysobjects SO2 ON FK.rkeyid = SO2.id
INNER JOIN dbo.sysobjects FO ON FK.constid = FO.id
WHERE SO2.Name = @cTableName
OPEN cFKey
FETCH NEXT FROM cFKey INTO @cTab, @cCol, @cRefTab, @cRefCol, @cFKName
WHILE @@FETCH_STATUS = 0
BEGIN
/* build the criteria to delete rows from the child table. As it uses the
criteria passed to this procedure, it gets progressively larger with
recursive calls */
SET @cChildCriteria = @cCol + ' in (SELECT [' + @cRefCol + '] FROM [' +
@cRefTab +'] WHERE ' + @cCriteria + ')'
print 'Deleting records from table ' + @cTab
/ call this procedure to delete the child rows /
EXEC spDeleteRows @cTab, @cChildCriteria, @iChildRows OUTPUT
FETCH NEXT FROM cFKey INTO @cTab, @cCol, @cRefTab, @cRefCol, @cFKName
END
Close cFKey
DeAllocate cFKey
/ finally delete the rows from this table and display the rows affected /
SET @cSQL = 'DELETE FROM [' + @cTableName + '] WHERE ' + @cCriteria
print @cSQL
EXEC sp_ExecuteSQL @cSQL
print 'Deleted ' + CONVERT(varchar, @@ROWCOUNT) + ' records from table ' + @cTableName
我在一台服务器上有几个客户端数据库。它们都有一个前缀。为此,让我们使用“piggy_”作为前缀。
IE
piggy_client_a
piggy_client_b
piggy_client_c
下面是三个小猪数据库的代码并添加了一堆用户。(用于检测):
CREATE SCHEMA IF NOT EXISTS piggy_client_a;
CREATE TABLE piggy_client_a.user (
id INT(11) NOT NULL AUTO_INCREMENT,
fullname VARCHAR(30) DEFAULT NULL,
email VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO piggy_client_a.user (fullname, email) VALUES
("chris davis", "[email protected]"),
("chris td", "[email protected]"),
("bob sinclair", "[email protected]"),
("frank sidebottom", "[email protected]");
CREATE SCHEMA IF NOT EXISTS piggy_client_b;
CREATE TABLE piggy_client_b.user (
id INT(11) NOT NULL AUTO_INCREMENT,
fullname VARCHAR(30) DEFAULT NULL,
email VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO piggy_client_b.user (fullname, email) VALUES
("fanny adams", "[email protected]"),
("colin furry", "[email protected]"),
("chris grumps", "[email protected]"),
("tracey singer", "[email protected]");
CREATE SCHEMA IF NOT EXISTS piggy_client_c;
CREATE TABLE piggy_client_c.user (
id INT(11) NOT NULL AUTO_INCREMENT,
fullname VARCHAR(30) DEFAULT NULL,
email VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO piggy_client_c.user (fullname, email)VALUES
("mary qos", "[email protected]"),
("curtis jackson", "[email protected]"),
("christine motor", "[email protected]"),
("tom peters", "[email protected]");
每个 piggy 数据库中都有相同的模式。其中一个表是user
,我想找到用户所在的任何这些数据库。
我写了一个存储过程,总体上它可以工作。然而,它只处理第一个小猪数据库。我已经仔细检查过,如果我将特定用户添加到piggy_client_c
数据库中,它不会被返回。
这是我的代码:
DELIMITER $$
DROP PROCEDURE IF EXISTS `find_user`$$
CREATE PROCEDURE `find_user`(IN partial_name VARCHAR(20))
BEGIN
DECLARE database_name VARCHAR(128) DEFAULT '';
DECLARE non_found INTEGER DEFAULT 0;
DECLARE database_list
CURSOR FOR
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME LIKE `piggy_client_%`
ORDER BY SCHEMA_NAME ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET non_found = 1;
OPEN database_list;
check_table: LOOP
FETCH database_list INTO database_name;
IF non_found = 1 THEN
LEAVE check_table;
END IF;
SET @sql = CONCAT('SELECT "',database_name,'" AS db_name, fullname,email FROM ',database_name,'.user WHERE trim(fullname) like "%',partial_name,'%"');
PREPARE db_statement FROM @sql;
EXECUTE db_statement;
DEALLOCATE PREPARE db_statement;
END LOOP check_table;
CLOSE database_list;
END$$
DELIMITER ;
我看不到任何会导致函数退出或不循环光标的东西,但我对此相当陌生。
或者,如果我可以“单步执行”代码,那将很有用,或者输出调试信息。
TIA,克里斯
目前我正在使用 MySQL 中的存储过程,并且在某些过程中使用用户定义的变量,并且我已经看到该类型的变量在当前会话中被初始化并保持其值直到会话结束。
我也在使用类似的语句,select into @user_defined_variable
但我意识到这样做非常冒险,特别是在登录/身份验证方面。所以在这种情况下的解决方案是使用语句set @user_defined_variable
而不是select into
.
但我真的不确定使用 是否足够set
,因为这种类型的变量会在会话未完成时保持其值。
现在想象一下,服务器在使用相同的存储过程上同时收到多个请求,@user_defined_variable
在这种情况下会存在值冲突吗?例如,如果被调用的存储过程login
使用了用户定义的变量@uuidUser
,并且被调用的存储过程home
也使用了@uuidUser
,那么是否存在该home
过程使用过程@uuidUser
内部赋值的风险login
?
注意:我正在使用 Node.js,并且我只有一个与 MySQL 实例的连接,我不会为每个请求创建一个连接。所以@user_defined_variables
将永远存在。
有些程序可以手动运行但不能在作业中运行,或者在从应用程序运行时失败,或者在 SSIS SQL 任务中无法运行。
我的工作在所有会话中,但一个。
这是我正在运行的代码 - 它调用一个存储过程,该过程获取触发器定义并将其保存在临时表中。
工作正常,这是我自动化工作的一部分。
IF OBJECT_ID('tempdb.dbo.#Jagannatha_sp_getTriggerDef') IS NOT NULL
DROP TABLE #Jagannatha_sp_getTriggerDef
CREATE TABLE #Jagannatha_sp_getTriggerDef (
DB sysname not null,
parent_name nvarchar(600) not null,
object_id int not null,
trigger_name sysname not null,
is_disabled bit,
i int not null,
[trigger_definition] NVARCHAR(MAX) not null,
primary key clustered (DB,trigger_name,i))
truncate table #Jagannatha_sp_getTriggerDef
exec sp_getTriggerDef @dbname = 'APCore',
@TableName = 'dbo.receivedLog',
@Drop_ONly = 0,
@Radhe = '#Jagannatha_sp_getTriggerDef'
SELECT *
FROM #Jagannatha_sp_getTriggerDef
order by db,i
我在没有触发器的表上运行它 - 只是为了让它尽可能简单
它带有警告
IF 'my_server\_DEVELOPMENT' <> @@ServerName THROW 50001, 'Wrong Server!!!',1
都好。
但是在这个特定的会话中:
到目前为止,我可以发现本次会议没有什么不同。
SELECT *
FROM sys.dm_exec_sessions
where login_name = 'my_company\my_user'
and session_id = @@SPID
第二个是失败的地方。所有其他它工作正常。
我该怎么做才能找出不同之处?甚至更好的是,更改程序以便尽管存在差异,但它仍然可以工作?