タグ付けされた質問 「stored-procedures」

データベースマネージャーにインストールされた呼び出し可能なコードは、それを呼び出すことができるAPIを公開します。通常、ネイティブクエリ言語で記述されますが、一部のDBMSプラットフォームは他の言語もサポートしています。

2
Function / ProcedureでのDML操作後にコミットが必要ですか?
function / procedureでinsert / delete / updateの後にcommitを書く必要があるかどうか知りたいのですが? 例: 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番目のコマンドをロールバックではなく、そのままにしておきます。 すべてが1つの大きなトランザクションとして実行されないような方法でストアドプロシージャを記述することは可能ですか?


2
呼び出し側データベースコンテキストで実行する中央ストアドプロシージャ
sys.dm_db_index_physical_statsビューを使用して、カスタマイズされたメンテナンスソリューションに取り組んでいます。現在、ストアドプロシージャから参照されています。これで、そのストアドプロシージャがデータベースの1つで実行されると、必要な処理が実行され、データベースに関するすべてのレコードのリストがプルダウンされます。別のデータベースに配置すると、そのDBのみに関連するすべてのレコードのリストがプルダウンされます。 例(下部のコード): データベース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データベースへの変更を実行するプロセスを自動化しようとしています。配置したプロセスは、ストアドプロシージャと関数を削除して再作成し、スクリプトを実行してテーブル/列/データを変更します。残念ながら、スクリプトの1つでは、最初に機能の1つを配置する必要があります。しかし、最初にテーブル/列/データ変更スクリプトから追加される列に依存するため、最初にすべてのストアドプロシージャ/関数の変更を実行することはできません。 SQL Serverが関数/ SPの定義で使用される列を検証せずにストアドプロシージャと関数を実行できるかどうか疑問に思っていましたか?探してみましたが、これを有効にする条件またはコマンドが見つかりませんでした。

1
ASYNC_NETWORK_IO待機タイプは心配することはありますか?
実行に長い時間がかかるストアドプロシージャのリストを見ると、待機時間が最も多いことが際立っています。ただし、その待機時間のほとんど(81%)はASYNC_NETWORK_IOであり、その理由はわかっています。ストアドプロシージャは約400 MBの情報を転送します。 ドキュメントでは、ASYNC_NETWORK_IOの原因は、クライアントがデータのフラッドに追いつくことができないことであり、それはおそらく真実であると述べています。クライアントがADO.NET経由でストアドプロシージャを呼び出してからデータセットを処理するだけなので、クライアントを維持する方法がわかりません。 したがって、この情報が与えられた場合、この手順のASYNC_NETWORK_IO待機タイプについて心配する必要がありますか?実際にサーバーのパフォーマンスに影響しますか? 追加情報: SQL Server 2005のサービスパック2を使用しています。 クライアントアプリは、SQL Serverと同じボックス上にあります(私は知っています...知っていますが、それについては何もできません)。

1
MySQLはストアドプロシージャからどのように結果セットを返しますか?
私は、Webアプリケーションで使用するストアドプロシージャを回避しようとしています。MySQLストアドプロシージャの最後のステートメントが何であれ、そのプロシージャの結果セットとして扱われるように思えます。残念ながら、MySQLドキュメントには、プロシージャが複数の結果セットを返すことができるという参照があるようです。この動作はどのようにトリガーされますか?1つの結果セットのみを明示的に返すようにMySQLサーバーに指示するにはどうすればよいですか? (たとえば、SELECTといくつかの挿入を行うクエリがあります。挿入についてクライアントに伝えたくありませんが、クライアントにSELECTの結果セットを与えたいです...)

1
パラメーターをどのように並べ替えますか?
実行中のストアドプロシージャに関するフィードバックを求めることができるかどうか、およびシナリオを処理するより効率的な方法があるかどうか疑問に思うだけです(きっとあるはずです!)。 基本的に、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を使用しており、後のクエリで準備されたステートメントによって返された列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スキーマを作成しました dbo.people、dbo.taglinks、およびdbo.tagsのデータにアクセスするschema1.profilesというビューから選択するschema1.get_profilesを作成しました ただし、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ストアドプロシージャをソース管理に組み込むための最良の方法は何ですか?現在、VS 2010を開発環境として使用しており、SQL Server Data Tools(SSDT)を使用して構外のSQL Server 2008 R2データベースに接続しています。 私が過去にやっていることは、プロシージャを.sqlファイルに保存し、このファイルをソース管理下に置くことです。これよりも効率的な方法があるはずだと思いますか?VS2010、SSDT、または実稼働マシンのSQL Serverにインストールできる拡張機能はありますか?

2
最適化:プロシージャの最上部への変数宣言の移動
いくつかのストアドプロシージャの最適化に取り組んでいる間、DBAに座って、高いブロッキングおよび/または高い読み取り/書き込みアクティビティでいくつかのストアドプロシージャを実行しました。 DBAが言及したことの1つTABLEは、再コンパイルを回避するために、ストアドプロシージャの最上部ですべての変数(特に変数)を宣言する必要があることです。 これは私がこれを聞いた最初のものであり、私たちが持っているすべての異なるストアドプロシージャを再検討する前に、いくつかの確認を探していました。彼はそれを「コードの遅い表示」と呼び、再コンパイルはブロッキングを説明するスキーマをロックしていました。 すべての変数宣言をストアドプロシージャの先頭に移動すると、再コンパイルが減りますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.