SQLSERVER触发器创建、删除、修改、查看
- 格式:pdf
- 大小:81.42 KB
- 文档页数:4
在SQL Server 中,触发器(Trigger)是一种特殊的存储过程,它会在特定的数据修改操作(如INSERT、UPDATE 或DELETE)发生时自动执行。
你可以使用触发器来执行各种任务,如验证数据、执行审计、确保数据完整性等。
在触发器中,你可以使用 INSERTED 和 DELETED 这两个特殊的表来访问被修改的数据。
INSERTED 表包含新插入或修改后的数据,而 DELETED 表包含被删除或修改前的数据。
以下是一个简单的例子,展示了如何在触发器中使用条件判断:
假设我们有一个名为 Employees 的表,我们想在每次插入新员工时检查其工资是否低于某个值(例如2000)。
如果是,则触发器会阻止这次插入操作。
在上述触发器中,我们使用了 INSERTED 表来访问新插入的数据,并使用 ROLLBACK TRANSACTION 来撤销这次插入操作。
我们还使用了 RAISERROR 来抛出一个错误消息,告诉用户为什么插入操作被阻止。
目录第1节.修改数据库21.1.使用SSMS修改2 1.2.使用SQL语句修改4 1.2.1.基本语法4 1.2.2.修改数据库初始大小5 1.2.3.修改数据库自动增长/最大大小6 1.2.4.修改数据库名称7第2节.删除数据库92.1.使用SSMS可视化删除9 2.2.使用SQL语句删除11第1节.修改数据库当数据库创建完成之后,在使用一段时间后发现数据库的某些属性需要调整,此时就需要修改数据库。
可以使用SSMS可视化修改,也可以使用SQL命令修改。
注意:修改数据库只能修改部分属性,有些属性创建完成后是不可修改的。
1.1. 使用SSMS修改在SSMS的对象资源管理器中,右击要修改的数据库名称:图63在图63中选择“属性”,如图64所示:图64在图64中,只要属性处于编辑状态,就可以修改。
修改时的属性要比新建时的属性多。
最常用的数据库修改操作就是与数据相关的文件属性信息,如下是修改后的文件信息:图65在图65中,修改了数据文件和日志文件的初始大小、自动增长等信息,点击“确定”按钮后即可保存修改后的信息。
1.2. 使用SQL语句修改1.2.1. 基本语法修改数据库信息的SQL语句是:“ALTER DATABASE 数据库名称”,这是核心语句,具体的基本语法如下:ALTER DA T ABASE 数据库名称{MODIFY NAME=新数据库名称|ADD FILE 文件信息[TO FILEGROUP {文件组名}]|ADD LOG FILE 文件信息|REMOVE FILE 逻辑文件名|MODIFY FILE 文件信息}该语句说明如下:(1)ALTER DA T ABASE 数据库名称:指定了将要修改的数据库名称。
(2)MODIFY NAME=新数据库名称:将数据库名称改个新的名称。
(3)ADD FILE 文件信息[TO FILEGROUP {文件组名}]:添加数据文件或日志文件,文件信息包括大小/自动增长/逻辑文件名/物理文件名。
SQL8.0(可能是您想指的是SQL Server 2008)的语法与之前的版本有很多相似之处,但也有一些新特性和改进。
以下是一些SQL Server 2008中的重要语法:数据定义语言 (DDL)CREATE TABLE: 用于创建新表。
ALTER TABLE: 用于修改现有表的结构。
DROP TABLE: 用于删除表。
DROP DATABASE: 用于删除数据库。
TRUNCATE TABLE: 用于删除表中的所有行,但不删除表本身。
数据操作语言 (DML)INSERT INTO: 用于插入新行。
UPDATE: 用于修改现有行。
DELETE: 用于删除行。
查询语言 (QL)SELECT: 用于从数据库表中检索数据。
触发器SQL Server 2008 支持触发器,它是一种特殊类型的存储过程,当指定的事件 (如 INSERT、UPDATE 或 DELETE)在相关的表上发生时自动执行。
其他语法SQL Server 2008引入了一些新的数据类型,如 datetime2 和 hierarchyid。
它还引入了 TRY...CATCH 异常处理块,使错误处理更加灵活和强大。
视图创建和使用视图仍然是一个重要的部分,尤其是在构建更复杂的应用程序时。
存储过程和函数存储过程和函数是预编译的 SQL 代码,可以包含多个 SQL 语句。
这些是用于封装常用逻辑并允许在单个命令中执行多个操作的强大工具。
事务处理SQL Server 2008 支持事务处理,允许你执行一系列的操作作为一个单一的工作单元,要么全部成功,要么全部失败。
这有助于维护数据的完整性和一致性。
索引优化和查询性能SQL Server 2008 提供了一些新工具和策略,可以帮助优化查询性能,包括对索引的更精细控制和查询执行计划的改进。
安全性和权限SQL Server 2008 提供了更强大的安全性和权限管理功能,包括对透明数据加密的支持和更精细的访问控制列表管理。
sql查询触发器语句SQL触发器是一种特殊的数据库对象,它可以在特定的数据库操作(例如插入、更新、删除)发生时自动执行一些预定义的动作。
触发器可以用于实现复杂的业务逻辑和数据完整性约束。
下面列举了10个常见的SQL触发器语句:1. 在员工表上创建触发器,当有新员工加入时,自动在工资表中插入一条新记录:```sqlCREATE TRIGGER insert_employeeAFTER INSERT ON employeesFOR EACH ROWBEGININSERT INTO salaries (employee_id, salary) VALUES (NEW.employee_id, 0);END;```2. 在订单表上创建触发器,当订单状态更新为已发货时,自动更新库存表中对应商品的数量:```sqlCREATE TRIGGER update_inventoryAFTER UPDATE ON ordersFOR EACH ROWBEGINIF NEW.status = '已发货' THENUPDATE inventory SET quantity = quantity - NEW.quantity WHERE product_id = NEW.product_id;END IF;END;```3. 在学生表上创建触发器,当有新学生加入时,自动更新班级表中的学生人数:```sqlCREATE TRIGGER update_class_sizeAFTER INSERT ON studentsFOR EACH ROWBEGINUPDATE classes SET size = size + 1 WHERE class_id = NEW.class_id;END;```4. 在商品表上创建触发器,当商品数量低于阈值时,自动发送库存警报邮件:```sqlCREATE TRIGGER send_inventory_alertAFTER UPDATE ON productsFOR EACH ROWBEGINIF NEW.quantity < 10 THEN-- 发送邮件的逻辑END IF;END;```5. 在订单表上创建触发器,当订单被删除时,自动将对应的商品数量加回库存:```sqlCREATE TRIGGER restore_inventoryAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE inventory SET quantity = quantity + OLD.quantity WHERE product_id = OLD.product_id;END;```6. 在员工表上创建触发器,当员工的工资被更新时,自动记录工资变动历史:```sqlCREATE TRIGGER log_salary_changeAFTER UPDATE ON employeesFOR EACH ROWBEGININSERT INTO salary_history (employee_id, old_salary, new_salary, change_date) VALUES (NEW.employee_id, OLD.salary, NEW.salary, NOW());END;```7. 在订单表上创建触发器,当有新订单完成支付时,自动更新销售统计表中的数据:```sqlCREATE TRIGGER update_sales_statsAFTER INSERT ON ordersFOR EACH ROWBEGINIF NEW.status = '已支付' THENUPDATE sales_stats SET total_sales = total_sales +NEW.total_amount, order_count = order_count + 1;END IF;END;```8. 在学生表上创建触发器,当学生的成绩被更新时,自动计算并更新班级的平均成绩:```sqlCREATE TRIGGER update_class_avg_scoreAFTER UPDATE ON studentsFOR EACH ROWBEGINUPDATE classes SET avg_score = (SELECT AVG(score) FROM students WHERE class_id = NEW.class_id) WHERE class_id = NEW.class_id;END;```9. 在商品表上创建触发器,当商品被删除时,自动更新订单表中的商品信息:```sqlCREATE TRIGGER update_order_productAFTER DELETE ON productsFOR EACH ROWBEGINUPDATE orders SET product_id = NULL WHERE product_id = OLD.product_id;END;```10. 在员工表上创建触发器,当员工的状态从在职变为离职时,自动将该员工从项目表中移除:```sqlCREATE TRIGGER remove_employee_from_projectAFTER UPDATE ON employeesFOR EACH ROWBEGINIF NEW.status = '离职' THENDELETE FROM projects WHERE employee_id = NEW.employee_id;END IF;END;```以上是10个常见的SQL触发器语句的示例,它们展示了触发器的灵活应用,可以帮助我们实现复杂的业务逻辑和数据完整性约束。
SqlServer调⽤OPENQUERY函数远程执⾏增删改查/*OPENQUERY函数,远程执⾏数据库增删改查关于OPENQUERY函数第⼆个参数不⽀持拼接变量的⽅案⽅案1:将OPENQUERY语句整个拼接为字符串,再⽤EXEC执⾏该字符串语句⽅案2:将要拼接的变量直接挪移到括号外进⾏拼接由于字符串中单引号多层引⽤需要⽤到很多个单引号,容易混淆,导致⽅案1写起来头疼、眼睛疼,但是⾃由度⼤,想怎么来就怎么来。
⽽⽅案2能够清晰简洁地使⽤变量,但经我⽬前的测试,发现只有SELECT语句和DELETE语句的WHERE⼦句可以挪移出来(见上⽅SQL语句),限制太⼤。
OPENQUERY(MySQL, 'select * from hhp_user where chrusername = ''hhp'';')第⼀个参数为配置好的链接服务器名称,第⼆个参数为要执⾏的MySQL命令*/DECLARE @username NVARCHAR(50),@pwd VARCHAR(64),@pwdmd5 VARCHAR(64),@sql VARCHAR(2000),@sql2 VARCHAR(2000)--设置⽤户名SET @username = 'hhp'--设置密码SET @pwd = '123456'--对密码进⾏MD5加密SET @pwdmd5 = SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', @pwd)),3,32)--1.SELECT语句SELECT * FROM OPENQUERY(MySQL, 'select * from hhp_user where chrusername = ''hhp'';');--或SELECT * FROM OPENQUERY(MySQL, 'select * from hhp_user') WHERE chrusername = @username--2.INSERT语句,INTO可省略INSERT INTO OPENQUERY(MySQL,'select chrusername,chrpwd from hhp_user;') VALUES( @username , @pwdmd5)--3.UPDATE语句SET @pwd = 'hhp'SET @pwdmd5 = SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', @pwd)),3,32)UPDATE OPENQUERY(MySQL, 'select chrusername, chrpwd from hhp_user where chrusername = ''hhp''') SET chrpwd = @pwdmd5--4.DELETE语句,FROM可省略DELETE FROM OPENQUERY(MySQL, 'select * from hhp_user where chrusername = ''hhp''')--或SET @username = 'ls'DELETE FROM OPENQUERY(MySQL, 'select * from hhp_user') WHERE chrusername = @username。
sql增删改查语句SQLStructuredQueryLanguage,意为结构化查询语言,是一种用于存取和管理关系数据库中的信息的语言。
SQL言的通用功能,包括:查询数据、新增数据、修改数据和删除数据,分别用 SQL供的增删改查语句进行,这四条语句分别为 SELECT句、INSERT句、UPDATE 句和 DELETE句,其中包括两个条件语句:SELECT UPDATE。
1. SELECT句SELECT句用于从数据库中检索信息,它可以检索所有列和行,也可以检索指定列和行,它是 SQL言中最常用的语句。
SELECT句的语法形式如下:SELECT column1, column2, ...FROM table_nameWHERE condition;其中,SELECT SQL句中定义的关键字,遵循关键字 SELECT面是要检索的列名;FROM SQL句中定义的关键字,遵循 FROM面是要检索的表名;WHERE SQL句中定义的关键字,遵循 WHERE面是检索的条件。
2. INSERT句INSERT句用于把新的数据插入到表中,它有两种语法:第一种:插入所有列INSERT INTO table_nameVALUES (value1, value2, ...);其中,INSERT SQL句中定义的关键字,遵循关键字 INSERT面是要插入的表名;VALUES SQL句中定义的关键字,遵循 VALUES面是插入的数值。
第二种:插入部分列INSERT INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);其中,INSERT SQL句中定义的关键字,遵循关键字 INSERT面是要插入的列名;VALUES SQL句中定义的关键字,遵循 VALUES面是插入的数值。
3. UPDATE句UPDATE句用于更新表中的数据,语法如下:UPDATE table_nameSET column1=value1, column2=value2, ...WHERE condition;其中,UPDATE SQL句中定义的关键字,遵循关键字 UPDATE面是要更新的表名;SET SQL句中定义的关键字,遵循 SET面是要更新的列名,等号左边为列名,右边为新值;WHERE SQL句中定义的关键字,遵循 WHERE面是更新的条件。
SQLServerinsert的触发器SQL Server insert的触发器⼀张表a根据⼀列(唯⼀键或主键)a1当插⼊数据时判断该列a1的开头的字符是否为:'0150'若是则更新该表a的a2列为:'-10'a表CREATE TABLE a(a1 nvarchar(50) NULL,a2 int NULL)select * from atruncate table a该触发器⼀次只能插⼊⼀⾏create trigger tri_insert_aon aafter insertasbeginif (select a.a1 from a, insertedwhere a.a1 = inserted.a1 and a.a1) like '0150%'beginupdate a set a2='-10'from a, insertedwhere a.a1 = inserted.a1and a.a1 like '0150%'endenddrop trigger tri_insert_a⼀次插⼊多⾏create trigger tri_insert_aon aafter insertasbeginif exists(select a.a1 from a, insertedwhere a.a1 = inserted.a1 and a.a1 like '0150%')beginupdate a set a2='-10'from a, insertedwhere a.a1 = inserted.a1and a.a1 like '0150%'endenddrop trigger tri_insert_aselect * from a修改触发器alter trigger tri_insert_aon aafter insertasbeginif exists(select a.a1 from a, insertedwhere a.a1 = inserted.a1 and a.a1like '0150%')beginupdate a set a2='-10'from a, insertedwhere a.a1 = inserted.a1and a.a1 like '0150%'endend创建触发器语法create trigger trigger_nameon {table_name|view_name}{After|Instead of} {insert|update|delete}as 相应T-SQL语句其中关于触发器有时会遇到for替代after的情况,for 和 after 没有区别。
//winform C# SqlServer 增删改查using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace SqlConnection1{public partial class Form1 : Form{public Form1(){InitializeComponent();}static string connstr = "server=506-4\\SQL;database=Myform;user id=sa;pwd=123";SqlConnection sqlConn = new SqlConnection(connstr);private void Form1_Load(object sender, EventArgs e){}public void clear(){txt_LoginId.Text = "";txt_LoginPwd.Text = "";txt_Nice.Text = "";txt_Name.Text = "";txt_Sex.Text = "";txt_Age.Text = "";}///<summary>///添加数据///</summary>///<param name="sender"></param>///<param name="e"></param>private void Butt_Add_Click(object sender, EventArgs e){sqlConn.Open();string sql = string.Format("insert into Usersvalues('{0}','{1}','{2}','{3}','{4}','{5}')", txt_LoginId.Text,txt_LoginPwd.Text, txt_Nice.Text, txt_Name.Text, txt_Sex.Text, txt_Age.Text);SqlCommand sqlcomm=new SqlCommand(sql,sqlConn);int result=0;try{result=sqlcomm.ExecuteNonQuery();if(result==1){MessageBox.Show("添加成功");clear();}else{MessageBox.Show("添加失败");}}catch{MessageBox.Show("添加失败");}sqlConn.Close();}///<summary>///删除数据///</summary>///<param name="sender"></param>///<param name="e"></param>private void Butt_Delete_Click(object sender, EventArgs e){sqlConn.Open();string sql = string.Format("delete from Users where LoginId='{0}'", txt_UserSelect.Text);SqlCommand cmd = new SqlCommand(sql, sqlConn);int result = 0;try{result = cmd.ExecuteNonQuery();if (result == 1){MessageBox.Show("删除成功");}else{MessageBox.Show("删除失败");}}catch{MessageBox.Show("删除失败");}sqlConn.Close();}///<summary>///更新数据///</summary>///<param name="sender"></param>///<param name="e"></param>private void Butt_Updata_Click(object sender, EventArgs e){sqlConn.Open();//方式一//string parPwd = txt_LoginPwd.Text.ToString().Trim();//string parNice = txt_Nice.Text.ToString().Trim();//string parName = txt_Name.Text.ToString().Trim();//string parSex = txt_Sex.Text.ToString().Trim();//string parAge = txt_Age.Text.ToString().Trim();//string sql = string.Format("update Users set LoginPwd='" + parPwd + "' ,Nice='" + parNice + "' ,Name='" + parName + "' ,Sex='" + parSex + "' ,Age='" + parAge + "' where LoginId='{0}'", txt_LoginId.Text);//方式二string sql = string.Format("update Users setLoginPwd='{0}',Nice='{1}',Name='{2}',Sex='{3}',Age='{4}'where LoginId='{5}'",txt_LoginPwd.Text.Trim(), txt_Nice.Text.Trim(), txt_Name.Text.Trim(), txt_Sex.Text.Trim(), txt_Age.Text.Trim(), txt_LoginId.Text.Trim());//SqlParameter parPwd = new SqlParameter("@'{0}'", txt_LoginPwd.Text);//cmd.Parameters.Add(parPwd);//SqlParameter parNice = new SqlParameter("@'{1}'", txt_Nice.Text);//cmd.Parameters.Add(parNice);//SqlParameter parName = new SqlParameter("@'{2}'", txt_Name.Text);//cmd.Parameters.Add(parName);//SqlParameter parSex = new SqlParameter("@'{3}'", txt_Sex.Text);//cmd.Parameters.Add(parSex);//SqlParameter parAge = new SqlParameter("@'{4}'", txt_Age.Text);//cmd.Parameters.Add(parAge);//SqlParameter parId = new SqlParameter("@'{5}'", txt_LoginId.Text);//cmd.Parameters.Add(parId);SqlCommand cmd = new SqlCommand(sql, sqlConn);int result=cmd.ExecuteNonQuery();if (result > 0){MessageBox.Show("修改成功");clear();}else{MessageBox.Show("修改失败");}sqlConn.Close();}///<summary>///查询数据///</summary>///<param name="sender"></param>///<param name="e"></param>private void Butt_Select_Click(object sender, EventArgs e){sqlConn.Open();string sql = string.Format("select * from Users where LoginId='{0}'", txt_UserSelect.Text);SqlCommand cmd = new SqlCommand(sql, sqlConn);try{SqlDataReader dr = cmd.ExecuteReader();if (dr.Read()){txt_LoginId.Text = dr[0].ToString();txt_LoginPwd.Text = dr[1].ToString();txt_Nice.Text = dr[2].ToString();txt_Name.Text = dr[3].ToString();txt_Sex.Text = dr[4].ToString();txt_Age.Text = dr[5].ToString();}else{MessageBox.Show("该账户不存在!!请从新输入!"); txt_UserSelect.Text = "";}}catch{MessageBox.Show("该账户不存在!!请从新输入!");txt_UserSelect.Text = "";}sqlConn.Close();}}}。
sql server table 用法SQL Server 中的表是用于存储数据的集合。
在SQL Server 中,您可以使用Transact-SQL (T-SQL)语句来查询、插入、更新和删除表中的数据。
以下是SQL Server 表的一些基本用法:1. 创建表:使用CREATE TABLE 语句创建一个新表。
例如:```sqlCREATE TABLE Employees (EmployeeID INT PRIMARY KEY,FirstName NV ARCHAR(50),LastName NV ARCHAR(50),Department NV ARCHAR(50));```2. 插入数据:使用INSERT INTO 语句将数据插入到表中。
例如:```sqlINSERT INTO Employees (EmployeeID, FirstName, LastName, Department)V ALUES (1, 'John', 'Doe', 'Sales');```3. 查询数据:使用SELECT 语句查询表中的数据。
例如:```sqlSELECT * FROM Employees;```4. 更新数据:使用UPDA TE 语句更新表中的数据。
例如:```sqlUPDATE EmployeesSET Department = 'Marketing'WHERE EmployeeID = 1;```5. 删除数据:使用DELETE 语句删除表中的数据。
例如:```sqlDELETE FROM EmployeesWHERE EmployeeID = 1;```6. 修改表结构:使用ALTER TABLE 语句修改表的结构。
例如,添加一个新列:```sqlALTER TABLE EmployeesADD Email NVARCHAR(100);```7. 删除表:使用DROP TABLE 语句删除表。
一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新
记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。
二:SQLServer为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两
个表。
一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新
记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。
二:SQLServer为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表
由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作
用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
三:Insteadof和After触发器
SQLServer2000提供了两种触发器:Insteadof和After触发器。这两种触发器的差别
在于他们被激活的同:
Insteadof触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Insteadof触发
器也可以用于视图﹐用来扩展视图可以支持的更新操作。
After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在
After触发器被激活之前发生。After触发器只能用于表。
一个表或视图的每一个修改动作(insert,update和delete)都可以有一个insteadof触发
器﹐一个表的每个修改动作都可以有多个After触发器。
四:触发器的执行过程
如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因
为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束。
Insteadof触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建
立﹐其它任何操作还没有发生时被执行。因为Insteadof触发器在约束之前执行﹐所以它
可以对约束进行一些预处理。
五:使用T-SQL语句来创建触发器
基本语句如下:
createtriggertrigger_name
on{table_nameview_name}
{forAfterInsteadof}
[insert,update,delete]
as
sql_statement
六:删除触发器:
基本语句如下:
droptriggertrigger_name
七:查看数据库中已有触发器:
--查看数据库已有触发器
usejxcSoftware
go
select*fromsysobjectswherextype='TR'
--查看单个触发器
execsp_helptext'触发器名'
八:修改触发器:
基本语句如下:
altertriggertrigger_name
on{table_nameview_name}
{forAfterInsteadof}
[insert,update,delete]
as
sql_statement
九:相关示例:
1:在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的
货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。
createtriggerorderinsert
onorders
afterinsert
as
if(selectstatusfromgoods,inserted
wheregoods.name=inserted.goodsname)=1
begin
print'thegoodsisbeingprocessed'
print'theordercannotbecommitted'
rollbacktransaction--回滚﹐避免加入
end
2:在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录
中的库存。
createtriggerorderinsert1
onorders
afterinsert
as
updategoodssetstorage=storage-inserted.quantity
fromgoods,inserted
where
goods.name=inserted.goodsname
3:在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。
createtriggergoodsdelete
ongoods
afterdelete
as
deletefromorders
wheregoodsnamein
(selectnamefromdeleted)
4:在Orders表建立一个更新触发器﹐监视Orders表的订单日期(OrderDate)列﹐使其不
能手工修改.
createtriggerorderdateupdate
onorders
afterupdate
as
ifupdate(orderdate)
begin
raiserror('orderdatecannotbemodified',10,1)
rollbacktransaction
end
5:在Orders表建立一个插入触发器﹐保证向Orders表插入的货品名必须要在Goods表
中一定存在。
createtriggerorderinsert3
onorders
afterinsert
as
if(selectcount(*)fromgoods,insertedwhere
goods.name=inserted.goodsname)=0
begin
print'noentryingoodsforthisorder'
rollbacktransaction
end
6:Orders表建立一个插入触发器,保证向Orders表插入的货品信息要在Order表中添
加
altertriggeraddOrder
onOrders
forinsert
as
insertintoOrder
selectinserted.Id,inserted.goodName,inserted.Numberfrominserted