Questions tagged «stored-procedures»

安装在数据库管理器上的可调用代码,公开了可通过其调用的API。通常使用本地查询语言编写的某些DBMS平台也支持其他语言。

2
在功能/过程中进行DML操作后是否需要提交?
我想知道是否有必要在函数/过程中的插入/删除/更新之后写提交? 例: create or replace function test_fun return number is begin delete from a; return 0; end; 或程序 create or replace procedure aud_clear_pro as begin delete from a; end; 删除后需要提交吗? 无法了解以下情况: 如果我从SQL窗口调用函数/过程,则需要提交 但 如果我使用dbms_scheduler计划功能/过程并运行作业,则自动提交delete语句。 为什么?

6
不要将事务用于存储过程
我有一个运行一些命令的存储过程。我不希望这些命令被包装在存储过程的事务中。如果第4条命令失败,我希望保留第1条,第2条和第3条而不回滚。 是否可以编写存储过程,使其不能全部作为一个大事务来执行?


2
在调用数据库上下文中执行的中央存储过程
我正在使用该sys.dm_db_index_physical_stats视图开发定制的维护解决方案。我目前有从存储过程中引用它。现在,当该存储过程在我的一个数据库上运行时,它会执行我想要的操作,并拉出与任何数据库有关的所有记录的列表。当我将其放置在其他数据库上时,它会拉出仅与该数据库有关的所有记录的列表。 例如(底部代码): 针对数据库6的查询运行显示了[请求的]数据库1-10的信息。 针对数据库3运行的查询仅显示数据库3的[请求的]信息。 我要对数据库3专门执行此过程的原因是,我希望将所有维护对象保留在同一数据库中。我想把这项工作放在维护数据库中,就像在该应用程序数据库中一样工作。 码: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET NOCOUNT ON; DECLARE @databaseID INT, @tableID INT IF @databaseName IS NOT NULL AND @databaseName NOT IN ('tempdb','ReportServerTempDB') BEGIN …

3
限制对某些列的更新。只允许存储过程更新这些列
我有一些敏感的价格列,希望仅通过存储过程进行更新。如果不使用用于更新价格的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都会失败。 我正在考虑使用触发器和令牌表来实现。我正在考虑的想法是有一个令牌表。存储过程将必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查令牌表中是否存在已更新行的令牌。如果找到,它将继续。如果找不到令牌,它将引发异常并使更新事务失败。 有没有一种更好/更好的方法来实施此限制?

4
从触发器调用存储过程
我已经使用以下语法在mysql中创建了一个存储过程。 DROP PROCEDURE IF EXISTS `sp-set_comment_count`; DELIMITER $$ CREATE PROCEDURE `sp_set-comment_count` (IN _id INT) BEGIN -- AC - AllCount DECLARE AC INT DEFAULT 0; SELECT COUNT(*) AS ac INTO AC FROM usergroups AS ug LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id` LEFT JOIN mediagallery AS dm ON ugm.mid …

2
在功能/存储过程创建时禁用架构检查
我正在尝试自动化对SQL Server 2008 R2数据库执行更改的过程。我放置的过程会删除并重新创建我的存储过程和函数,以及运行脚本来更改表/列/数据。不幸的是,其中一个脚本需要首先放置其中一个功能。但是我不能先运行所有存储的proc / function更改,因为它首先依赖于从表/列/数据更改脚本中添加的列。 我想知道是否可以在不通过SQL Server验证函数/ SP定义中使用的列的情况下运行存储过程和函数?我尝试查找,但找不到条件或命令来启用此功能。

1
是否需要担心ASYNC_NETWORK_IO等待类型?
在查看需要花费很长时间才能执行的存储过程的列表时,最引人注目的是它。但是,大多数等待时间(81%)是ASYNC_NETWORK_IO,我知道原因:存储过程传输大约400 MB的信息。 在文档中,它指出ASYNC_NETWORK_IO的原因是客户端无法跟上大量数据的流传,这可能是事实。我不确定如何使客户端保持同步,因为它所做的只是通过ADO.NET调用存储过程,然后仅处理数据集。 因此,鉴于此信息,我是否应该担心此过程的ASYNC_NETWORK_IO等待类型?它实际上对服务器性能有影响吗? 其他信息: 我正在使用SQL Server 2005的Service Pack 2。 客户端应用程序与SQL Server位于同一盒子上(我知道,我知道...但是我对此无能为力)。

1
MySQL如何从存储过程返回结果集?
我正在努力弄清楚在Web应用程序中使用的存储过程。在我看来,MySQL存储过程中的最后一条语句似乎都被视为该过程的结果集。但是不幸的是,MySQL文档中似乎有一些引用说一个过程可以返回多个结果集。如何触发此行为?如何告诉MySQL服务器我明确希望只返回一个结果集? (例如,我有一个执行SELECT和一些插入的查询。我不想告诉客户有关插入的信息,但是我确实希望为客户提供SELECT的结果集。...)

1
您如何按参数订购?
只是想知道我是否可以对正在运行的存储过程征求一些反馈,以及是否存在一种处理场景的更有效方法(我敢肯定会存在!)。 基本上,我有一个SP,可以调用它返回可能具有一个或多个状态和排序顺序的记录(作业)列表(我使用RowNum进行分页)。目前,我正在使用WITH RECOMPILE,因为状态的变化可以随时更改(取决于用户等)。还有一些过滤正在进行。 我正在使用IF语句来本质上运行相同的代码,唯一的变化是排序顺序。 我想我的问题是:是否有更好的方法(也许对于不同的状态使用不同的SP)?由于缺乏知识,我是否会使事情变得过于复杂(很有可能)SP确实可以,但是需要进行一些细微的调整以减少行数吗? 我在下面粘贴了一部分SP-完整代码的唯一区别是不同排序顺序的其他IF语句... 我将不胜感激。 提前致谢! PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy varchar(50), @CustomerID int, @ShowNotSet bit, @ShowPlaced bit, @ShowProofed bit, @ShowReProofed bit, @ShowApproved bit, @ShowOnTime bit, @ShowLate bit, @ShowProblem bit, @ShowCompleted bit, @ShowDispatched bit, @ShowUnapproved bit, @ShowClosed bit, @ShowReturned bit, @UserID int WITH RECOMPILE …

3
如何在MySQL存储过程中使用准备好的语句?
我正在使用mysql,我需要以某种方式在以后的查询中使用由prepared语句返回的curid列。我使用准备好的语句,因为如我所读,这是将变量传递给LIMIT子句的唯一方法。我在这里有此存储过程: DROP PROCEDURE IF EXISTS fixbalance; CREATE PROCEDURE fixbalance (userid INT) BEGIN DECLARE i INT DEFAULT 0; DECLARE balance INT DEFAULT 0; DECLARE idcnt INT; SET idcnt = (SELECT COALESCE(COUNT(id), 0) FROM coupon_operations WHERE user_id = userid); IF idcnt <> 0 THEN WHILE i <= idcnt DO BEGIN SET @iter …

1
MySQL中是否有“创建或替换过程”的替代方法?
MySQL是否有版本的“创建或替换过程”?我似乎无法执行此操作,或者在重新编译之前编写该过程的删除脚本(如果存在),而不会得到存储过程存在的错误消息。 DELIMITER $$ -- would love to be able to drop procedure if exists db.sp_tmp_90days; -- or use "create or replace" create procedure db.sp_tmp_90days() BEGIN drop table db.tmp_90days; create table db.tmp_90days ( user_name varchar(128), first_name varchar(50), last_name varchar(50), system varchar(10), last_login datetime ); alter table db.tmp_90days add index idx_user_name(user_name); alter …

1
为不同的SQL Server架构设置用户权限
我需要限制对特定用户的访问,但是他们仍然需要能够查看dbo拥有的表中的数据。 我正在尝试执行以下操作: dbo模式具有正常功能,可以访问所有内容 schema1模式只能访问schema1对象 如果schema1视图或存储过程访问dbo拥有的表中的数据,则权限链会适当 user1有权访问schema1,除此之外没有其他权限;#3除外 这是我尝试过的: 创建一个使用随机密码映射到测试登录名的user1用户 在dbo模式中创建了几个表,其中包含一些测试数据 创建一个schema1模式 创建一个schema1.get_profiles,该视图从一个名为schema1.profiles的视图中进行选择,该视图访问dbo.people,dbo.taglinks和dbo.tags中的数据 但是,以user1身份登录时使用以下语句: EXEC get_profiles 1 结果是: The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'. 我已经尝试过WITH EXECUTE AS OWNER并且无法开始理解“所有权链接”应该如何工作。 我也尝试过 GRANT EXECUTE ON SCHEMA::schema1 TO user1 GRANT INSERT ON SCHEMA::schema1 TO user1 GRANT SELECT ON SCHEMA::schema1 …

7
源代码控制下的存储过程,最佳实践
我目前正在使用Tortoise SVN来对.NET Web应用程序进行源代码控制。将我们的SQL Server存储过程纳入Source Control的最佳方法是什么?我目前使用VS 2010作为开发环境,并使用SQL Server数据工具(SSDT)连接到内部SQL Server 2008 R2数据库。 我过去所做的就是将procs保存到.sql文件,并将此文件置于源代码控制下。我确定必须有比这更有效的方法?我可以在生产计算机上的VS2010,SSDT甚至SQL Server上安装扩展吗?

2
优化:将变量声明移至过程的顶部
在优化某些存储过程的过程中,我与DBA坐下并经历了一些阻塞和/或读/写活动频繁的存储过程。 DBA提到的一件事是我应该TABLE在存储过程的顶部声明所有变量(尤其是变量),以避免重新编译。 这是我第一次听说此消息,并且在重新访问我们拥有的所有不同存储过程之前,正在寻求一些确认。他称其为“代码的后期查看”,并且重新编译锁定了解决阻塞的架构。 将所有变量声明移到存储过程的顶部是否会减少重新编译?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.