㈠ sql 觸發器語句錯誤 求助
錯誤不少,看看是不是樓主的要的效果
create trigger overdraft_trigger on account
for update
as
--if inserted.balance < 0 --這里要改改
if exists(select 1 from inserted where balance<0)
begin
insert into borrower(customer_name,account_number)--指定列名
--( --括弧不用
select d.customer_name,i.account_number --指定顯示的表名
from depositor d, inserted i--指定一個別名使代碼簡潔
where i.account_number = d.account_number
--)
insert into loan select account_number, branch_name from inserted--這里改改
update account
set balance = 0
from account, inserted
where account.account_number = inserted.account_number
end
㈡ sql創建 觸發器出錯
SQL> create or replace trigger emp_sal_10408
2 before insert or update on emp_10408
3 declare
4 maxsalm number(7,2);
5 minsalm number(7,2);
6 for each row
看到這里就錯了,行級觸發怎麼寫到聲明裡面去了
㈢ SQL觸發器出錯!!急
先不說你語句問題。。。你@djbh值從哪來。。你光給定義了一變數 但是這個變數你並沒有給值啊。。。
你是不是想傳進來一個參數呢,觸發器是不可以帶參數的。。
能把你要求說下么
根據inserted表裡的編號來刪除rk_info表裡的數據可以寫成
delete from rk_info where 單據編號=(select 單據編號 from inserted)
㈣ 怎樣使sql觸發器返回錯誤消息
1、SQL觸發器是不會返回信息的 2、SQL觸發器是依據表或資料庫的特殊條件才會觸發相應處理。 3、若非要SQL觸發器返回什麼,可以選擇在觸發器執行成功的時候,向某個表插入記錄,然後VB不斷的去刷新這張表
㈤ sql創建觸發器的錯誤
第二行前面需要加上觸發事件之後在on 一個表名
格式before or after (觸發事件:insert、update。。。) on 表名
before是觸發事件發生前,after是觸發事件發生後
㈥ SQL觸發器語句錯誤 要怎麼修改
use cjgl
go
create trigger trt
on student
for update
as
if update (某個列)
print '不能修改'
go
--不能整張表判斷 ,並且你的語句沒有回滾
㈦ 在sql sever中寫觸發器報錯,求高手解答!
CREATETRIGGERchufaqi
ONPU_ArrivalVouch
FORUpdate
AS
ifUpdate(cDefine2)
BEGIN
UPDATEPU_ArrivalVouch
SETcDefine3=i.cDefine2--這個地方pu的前綴去掉,還有你這句和下句前邊空格用的中文寫法,不對
FROMPU_ArrivalVouchaspu,Deletedasd,Insertedasi
WHEREpu.ID=d.ID
END
GO
㈧ sql觸發器 報錯誤
IF (new.state = 3)
後面是不是要加一個 THEN 啊?
你那裡的 IF / ELSE 看上去, 是 SQL Server 的寫法啊。
mysql> DELIMITER //mysql> CREATE PROCEDURE TestIfElse -> ( -> p_val INT -> ) -> BEGIN -> IF (p_val = 1) THEN -> SELECT '1' AS A; -> ELSEIF (p_val = 2) THEN -> SELECT '2' AS A; -> ELSE -> SELECT 'other' AS A; -> END IF; -> END//Query OK, 0 rows affected (0.05 sec)mysql> call TestIfElse(1); -> //+---+| A |+---+| 1 |+---+1 row in set (0.00 sec)
㈨ SQL語句建立觸發器中語句出錯了,哪位幫我修改阿謝謝
樓主的語法是按orcale來的吧?sql server2000中的trigger中沒有before、for each row、new等關鍵字。下面我寫了個,能實現你的功能,只是不知道有沒有性能更好的寫法。期待更佳的....
if exists(select * from sysobjects where name='Insert_Or_Update_sal')
drop trigger Insert_Or_Update_sal
go
CREATE TRIGGER Insert_Or_Update_sal
ON TEACHER
FOR insert,update
AS
BEGIN
declare @job char(8),@sal numeric(7,2),@eno numeric(4)
--inserted是insert或update觸發表臨時表,參考下面幫助。
select @eno=eno,@job=job,@sal=sal from inserted
if @job='教授' and @sal<4000
update teacher set sal=4000 where eno=@eno
--下面的兩句也可能完成這個功能,只是性能低一些。
-- if exists(select * from inserted where job='教授' and sal< 4000)
-- update TEACHER set sal=4000 where job='教授' AND sal<4000
END
下面是sql server2000幫助文檔中相關trigger的部分,希望對你有幫助。
----------------------------------------------------------------
CREATE TRIGGER
創建觸發器,觸發器是一種特殊的存儲過程,在用戶試圖對指定的表執行指定的數據修改語句時自動執行。Microsoft® SQL Server™ 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句創建多個觸發器。
語法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
參數
trigger_name
是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。
Table | view
是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。
AFTER
指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。
如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。
不能在視圖上定義 AFTER 觸發器。
INSTEAD OF
指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。
在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。
INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。
對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。
WITH APPEND
指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。
WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。
NOT FOR REPLICATION
表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。
AS
是觸發器要執行的操作。
sql_statement
是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。
當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。
觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:
deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted
如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。
當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。
n
是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。
IF UPDATE (column)
測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。
可以在觸發器主體中的任意位置使用 UPDATE (column)。
column
是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。
IF (COLUMNS_UPDATED())
測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
COLUMNS_UPDATED 函數以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創建的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。
bitwise_operator
是用於比較運算的位運算符。
updated_bitmask
是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。
comparison_operator
是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。
column_bitmask
是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。
注釋
觸發器常常用於強制業務規則和數據完整性。SQL Server 通過表創建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供資料庫間的引用完整性。若要強制引用完整性(有關表的主鍵和外鍵之間關系的規則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關鍵字)。如果觸發器表存在約束,則在 INSTEAD OF 觸發器執行之後和 AFTER 觸發器執行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發器操作且不執行(激發)AFTER 觸發器。
可用 sp_settriggerorder 指定表上第一個和最後一個執行的 AFTER 觸發器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個第一個執行和一個最後一個執行的 AFTER 觸發器。如果同一表上還有其它 AFTER 觸發器,則這些觸發器將以隨機順序執行。
如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,則將除去已修改觸發器上設置的第一個或最後一個特性,而且必須用 sp_settriggerorder 重置排序值。
只有當觸發 SQL 語句(包括所有與更新或刪除的對象關聯的引用級聯操作和約束檢查)成功執行後,AFTER 觸發器才會執行。AFTER 觸發器檢查觸發語句的運行效果,以及所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作的效果。
觸發器限制
CREATE TRIGGER 必須是批處理中的第一條語句,並且只能應用到一個表中。
觸發器只能在當前的資料庫中創建,不過觸發器可以引用當前資料庫的外部對象。
如果指定觸發器所有者名稱以限定觸發器,請以相同的方式限定表名。
在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發器操作。
如果一個表的外鍵在 DELETE/UPDATE 操作上定義了級聯,則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發器。
在觸發器內可以指定任意的 SET 語句。所選擇的 SET 選項在觸發器執行期間有效,並在觸發器執行完後恢復到以前的設置。
與使用存儲過程一樣,當觸發器激發時,將向調用應用程序返回結果。若要避免由於觸發器激發而向應用程序返回結果,請不要包含返回結果的 SELECT 語句,也不要包含在觸發器中進行變數賦值的語句。包含向用戶返回結果的 SELECT 語句或進行變數賦值的語句的觸發器需要特殊處理;這些返回的結果必須寫入允許修改觸發器表的每個應用程序中。如果必須在觸發器中進行變數賦值,則應該在觸發器的開頭使用 SET NOCOUNT 語句以避免返回任何結果集。
DELETE 觸發器不能捕獲 TRUNCATE TABLE 語句。盡管 TRUNCATE TABLE 語句實際上是沒有 WHERE 子句的 DELETE(它刪除所有行),但它是無日誌記錄的,因而不能執行觸發器。因為 TRUNCATE TABLE 語句的許可權默認授予表所有者且不可轉讓,所以只有表所有者才需要考慮無意中用 TRUNCATE TABLE 語句規避 DELETE 觸發器的問題。
無論有日誌記錄還是無日誌記錄,WRITETEXT 語句都不激活觸發器。
㈩ sql執行創建觸發器錯誤,求解答
create trigger insertinfo
before insert on student
for each row
begin
if :new.grade > 100 then
:new.grade := 50;
end if;
end;